首先想说我是Python(以及整体编码)的新手,所以如果这个问题不好,我深表歉意。
我在使用 Dash 时遇到问题。我想做的是创建一个仅对用户选择的公司返回 True 的 Mask,但是当我运行代码时我没有收到错误,但它将每个公司设置为 true,并且用户选择的任何内容都不会执行任何操作。奇怪的是我的代码基本上做同样的事情,并且运行没有问题。我从有关构建折线图的绘图文档中获取了这段代码,并对其进行了轻微编辑以满足我的需求。
我尝试运行下面的代码,它返回一个仪表板,没有错误。用户会看到一个下拉菜单,选择他们想要显示的公司,并且它应该只显示他们选择的公司(或多个公司)。然而,它返回的图表显示每个公司,并且用户选择的任何内容都不会改变显示的图表
app = Dash('Affil Sales')
app.layout = html.Div([
html.H4('Affil vs Non-Affil price'),
dcc.Graph(id = "graph"),
dcc.Dropdown(
id="dropdown",
options= [
{'label': i, 'value': i} for i in list(df2['z_seller_clean'].unique())],
multi = True,
placeholder = 'Select a firm'
),
])
这里我使用“{'label': i, 'value': i} for i in list(df2['z_seller_clean'].unique())]”来设置选项。列出的许多公司都可以手动写出。这可以创建下拉菜单
@app.callback(
Output("graph", "figure"),
Input("dropdown", "value"))
def update_line_chart(z_seller_clean):
df3 = df2
mask = df3.z_seller_clean.isin(list(df3['z_seller_clean'].unique())) # Remember df2[mask]
fig1 = px.line(df3[mask],
x="TRADE_DATE", y="Z_PRICEINDOLPERMWH", color='Buyer_Is_Affiliate')
return fig1
app.run_server(debug=True)
此代码运行,但它返回一个显示每个公司的图表,如何设置掩码函数以实际工作?如果我删除掩码函数,代码运行完全相同。掩码的目标是创建一个布尔值,对于用户未选择的每个公司,它应该返回 False,对于已选择的任何公司,它应该返回 True。然而,它只是为每个公司返回 True
我还有另一组运行没有问题的代码,我将其粘贴在下面
df_gb_q = df.groupby(['TRADE_DATE', 'Buyer_Is_Affiliate', 'Z_REGION'])[['Z_QUANTITYINMWH']].mean()
df_gb_q.reset_index(inplace=True)
app_region_mwh = Dash('Affil Sales')
app_region_mwh.layout = html.Div([
html.H4('Affil vs Non-Affil MWH'),
dcc.Graph(id = "graph"),
dcc.Checklist(
id="checklist",
options= ["Florida", "Northwest", "Southeast","Southwest"],
value = ["Florida"],
inline=True
),
])
@app_region_mwh.callback(
Output("graph", "figure"),
Input("checklist", "value"))
def update_line_chart(Z_REGION):
df_new_q = df_gb_q
mask = df_new_q.Z_REGION.isin(Z_REGION)
fig_q_reg = px.line(df_new_q[mask],
x="TRADE_DATE", y="Z_QUANTITYINMWH", color='Buyer_Is_Affiliate')
return fig_q_reg
app_region_mwh.run_server(调试=真)
此代码创建一个运行时没有错误的仪表板,并且仅显示清单上的任何内容(即用户选择的任何内容)
您实际上并没有使用从下拉列表中选择的值来过滤 DataFrame
from dash import Dash, html, Output, Input, dcc
import plotly.express as px
import pandas as pd
app = Dash('Affil Sales')
df2 = pd.DataFrame({'z_seller_clean': ['New York City', 'Montreal', 'San Francisco']})
app.layout = html.Div([
html.H4('Affil vs Non-Affil price'),
html.Div(id='test'),
dcc.Dropdown(
id="dropdown",
options=[{'label': i, 'value': i} for i in df2['z_seller_clean'].unique()],
multi=True,
placeholder='Select a firm'
),
])
@app.callback(Output("test", "children"),
Input("dropdown", "value"))
def update_line_chart(z_seller_clean):
if z_seller_clean:
df3 = df2
mask = df3['z_seller_clean'].isin(z_seller_clean)
return str(df3[mask])
if __name__ == '__main__':
app.run(debug=True)