如何在Python中通过绘图从破折号的下拉列表中选择数据集列?

如何在Python中通过绘图从破折号的下拉列表中选择数据集列?,python,callback,dashboard,plotly-dash,Python,Callback,Dashboard,Plotly Dash,我希望能得到一些关于在Python中使用Dash by Plotly创建仪表板的指导。虽然网上有很多文档和论坛帖子,但我觉得它们假设了我可能缺少的一些知识,特别是在正确使用回调实现交互方面 我试图实现的是一个仪表板,它将允许我: 上载Excel文件 从Excel文件中选择一列 运行函数以处理该列中的数据 在表格中显示结果输出数据 我曾试图创建一个最小的工作示例,但一直在努力。以下是我迄今为止所做的工作: import base64 import io import pandas as pd im

我希望能得到一些关于在Python中使用Dash by Plotly创建仪表板的指导。虽然网上有很多文档和论坛帖子,但我觉得它们假设了我可能缺少的一些知识,特别是在正确使用回调实现交互方面

我试图实现的是一个仪表板,它将允许我:

  • 上载Excel文件
  • 从Excel文件中选择一列
  • 运行函数以处理该列中的数据
  • 在表格中显示结果输出数据
  • 我曾试图创建一个最小的工作示例,但一直在努力。以下是我迄今为止所做的工作:

    import base64
    import io
    import pandas as pd
    import dash
    import dash_table
    import dash_core_components as dcc
    import dash_html_components as html
    from dash.dependencies import Input, Output, State
    
    ## 1. Define overall dashboard layout
    
    Dashboard = dash.Dash(__name__, external_stylesheets=['https://codepen.io/chriddyp/pen/bWLwgP.css'])
    Dashboard.layout = html.Div([
                                 html.H1('Dashboard Prototype', style={'width':'100%', 'textAlign': 'center'}),
                                 dcc.Upload(
                                           id       = 'Dashboard_Input',
                                           children = html.A('Select Files'),
                                           style    = {'width': '100%', 'height': '60px', 'lineHeight': '60px', 'borderWidth': '1px',
                                                       'borderStyle': 'dashed', 'borderRadius': '5px', 'textAlign': 'center', 'display': 'inline-block'},
                                           multiple = True
                                           ),
                                 html.Br(),
                                 html.Div(id='Dashboard_Dropdown'),
                                 html.Br(),
                                 html.Div(id='Dashboard_Output')
                               ])
    
    ## 2. Define functions to upload, process and present data
    
    def selectData(contents, filename, date):
    
        content_type, content_string = contents.split(',')
        decoded = base64.b64decode(content_string)
    
        try:
            Raw_Data = pd.read_excel(io.BytesIO(decoded))
        except Exception as e:
            return html.Div(['There was an error processing this file.'])
    
        Dropdown = html.Div([                      
                             html.H4 (('File Name: ', filename), style={'width':'100%', 'textAlign': 'center'}),
                             html.Br(),
                             dcc.Dropdown(
                                          id          = 'Dataset_and_Column',
                                          options     = [{'label': i, 'value': i} for i in Raw_Data.columns],
                                          style       = {'width': '100%', 'height': '60px', 'lineHeight': '60px', 'borderWidth': '1px',
                                                         'borderStyle': 'dashed', 'borderRadius': '5px', 'textAlign': 'center', 'display': 'inline-block'},
                                          placeholder =  'Select Dataset Column'
                                         ),
                             html.Br(),
                            ])
    
        return Dropdown
    
    def processData(Raw_Data, Column_Label):
    
        # DO SOME PROCESSING THAT RESULTS IN 'TABLE':
        Table      = Table
        HTML_Table = html.Div([ 
                               dash_table.DataTable(
                                                    data         = Table.to_dict('records'),
                                                    columns      = [{'name': i, 'id': i} for i in Table.columns],
                                                    style_cell   = {'textAlign': 'center', 'width': '100px'}, 
                                                    editable     = False,
                                                    style_header = {'fontWeight': 'bold', 'textAlign': 'center'},
                                                    style_table  = {'maxHeight': '50ex', 'width': '100%'}
                                                   ),
                               html.Hr()
                             ])
        return HTML_Table
    
    ## 4. Define callback functions
    
    Dashboard.config.suppress_callback_exceptions = True
    
    @Dashboard.callback(
                        Output('Dashboard_Dropdown', 'children'),
                        [Input('Dashboard_Input'   , 'contents')],
                        [State('Dashboard_Input'   , 'filename'), State('Dashboard_Input', 'last_modified')]
                       )
    def createDropdown(list_of_contents, list_of_names, list_of_dates):
        if list_of_contents is not None:
           Dropdown = [selectData(c, n, d) for c, n, d in zip(list_of_contents, list_of_names, list_of_dates)]
           return Dropdown
    
    ################################################################################
    ################################################################################
    
    # THIS BIT DOESN'T WORK #
    # Need to make this callback function take an input of Raw_Date and Column_Label (selected from the dropdown) to run the processData() function.
    
    @Dashboard.callback(
                        Output('Dashboard_Output'  , 'children'),
                        [Input('Dataset_and_Column', 'contents'), Input('Dataset_and_Column', 'value')],
                       )
    def processSelectedColumn(contents, value):
    
        # HTML_Table = processData(contents, value)
    
        return value#HTML_Table
    
        # ^^^^^^ Note that this allow 'value' to be printed on the dashboard but 
        # when the commented 'HTML_Table' bits are uncommented it fails
    
    ################################################################################
    ################################################################################
    
    ## 6. Run dashboard
    
    if __name__ == '__main__':
        Dashboard.run_server(debug=True)
    
    这允许我选择一个Excel文件,然后打印从中创建的Pandas数据框的选定列,但我不确定如何将所有列连接在一起,以便在选定列上运行我的
    processData()
    函数


    关于我如何没有正确使用或连接回调、函数等的任何想法?

    您需要
    processSelectedColumn
    回调来接受下拉列表中的
    值作为
    输入。也可以/最好将上传的数据作为
    状态
    而不是
    输入
    。这将为您提供执行所需计算所需的值。

    回答: 下面是一些代码片段,用于从短划线中的下拉列表中选择给定的列

  • 数据集
    房价

    df=pd.read\u csv(r“housing\u price.csv”)

  • 将列保存在变量中,比如说
    options
    ,以调用dash的html标记

    options=[]
    对于df.列中的列:
    options.append({'label':'{}'。格式(col,col),'value':col})
    

  • 为DEAFULT
    下拉列表编写html标记

  • `

  • 写回电话:

    @app.callback(
    输出('my_label1','children'),
    [输入('my_dropdown1','value')]
    )
    def update_下拉列表(值):
    return“您已选择{}进行直方图绘制!”。格式(值)

  • 注意:如果您想使用
    状态
    在用户单击提交按钮后,按照下面的代码激活对所选列的调用。
  • 激活基于
    状态的回调:

    @app.callback(
        Output('my_label1', 'children'),
        [Input('submit-button', 'n_clicks')],
        [State('my_dropdown1','value')]
        )
    
    def update_dropdown_state(n_clicks,value):
        return 'You have chosen {} for histogram plot!'.format(value)
    
  • @app.callback(
        Output('my_label1', 'children'),
        [Input('submit-button', 'n_clicks')],
        [State('my_dropdown1','value')]
        )
    
    def update_dropdown_state(n_clicks,value):
        return 'You have chosen {} for histogram plot!'.format(value)