将 mask 合并到 Dash 的 app.callback 中

问题描述 投票:0回答:1

首先想说我是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(调试=真)

此代码创建一个运行时没有错误的仪表板,并且仅显示清单上的任何内容(即用户选择的任何内容)

python plotly plotly-dash dashboard
1个回答
0
投票

您实际上并没有使用从下拉列表中选择的值来过滤 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)
© www.soinside.com 2019 - 2024. All rights reserved.