【问题标题】:Python Dash App updating with new dataframe使用新数据框更新 Python Dash 应用程序
【发布时间】:2019-11-22 20:23:21
【问题描述】:

我是 dash 的新手,我正在尝试制作一个基本表格以显示在 IP 上供所有人查看。这可以防止需要电子邮件或将数据放置在任何特定位置。我使用以下代码创建了一个从文档中提取的非常简单的仪表板,但我想定期更新仪表板。为此,我使用任务调度程序每 30 分钟运行一次代码,杀死旧实例。这样,当“data.csv”更新时,表格中将显示一个新的数据框。

import dash
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd

df = pd.read_csv('data.csv')


def generate_table(dataframe, max_rows=30):
    return html.Table(
        # Header
        [html.Tr([html.Th(col) for col in dataframe.columns])] +

        # Body
        [html.Tr([
            html.Td(dataframe.iloc[i][col]) for col in dataframe.columns
        ]) for i in range(min(len(dataframe), max_rows))]
    )


external_stylesheets = ['https://codepen.io/chriddyp/pen/bWLwgP.css']

app = dash.Dash(__name__, external_stylesheets=external_stylesheets)

app.layout = html.Div(children=[
    html.H4(children='Title'),
    generate_table(df, max_rows=len(df))
])


if __name__ == '__main__':
    ADDRESS='100.100.100.100'  #ipv4 address for computer code is run on
    PORT=int(1000)
    app.run_server(debug=True, host=ADDRESS, port=PORT)

我的问题是,尽管重新启动实例并更改了 csv,但只会显示原始 csv 数据。我只能通过更改端口并启动一个新应用程序来修复它,这不是我想要的选项。如何使用新的 csv 信息更新相同的应用程序?

【问题讨论】:

    标签: python plotly-dash


    【解决方案1】:

    我认为您不需要每隔几分钟就杀死“旧”应用程序实例并运行一个新实例。您只需启动您的应用一次并将“更新间隔”设置为所需时间(以毫秒为单位),以便应用在继续运行时在回调函数中下载新数据。

    此代码演示了这一点(Dash v1.6.0):

    import dash
    import dash_core_components as dcc
    import dash_html_components as html
    import dash_table
    import pandas as pd
    
    app = dash.Dash(__name__)
    
    df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/solar.csv')
    
    app.layout = html.Div([
          html.H4('Dashboard'),
          dcc.Interval('graph-update', interval = 2000, n_intervals = 0),
          dash_table.DataTable(
              id = 'table',
              data = df.to_dict('records'),
              columns=[{"name": i, "id": i} for i in df.columns])])
    
    @app.callback(
            dash.dependencies.Output('table','data'),
            [dash.dependencies.Input('graph-update', 'n_intervals')])
    def updateTable(n):
        df = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/solar.csv')
        return df.to_dict('records')
    
    if __name__ == '__main__':
         app.run_server(debug=True, port=10451)
    

    【讨论】:

      【解决方案2】:

      更新数据而不再次创建图窗。这减少了渲染延迟。

      @app.callback(
          Output(component_id='graph_map', component_property='figure'),
          Input(component_id='scale_slider', component_property='value'),
          State(component_id='graph_map', component_property='figure')
      )
      def update_output(set_scale, map_fig):
          df = df_original[df_original['scale'] == set_scale]
          
          map_fig['data'][0]['locations'] = df['cell_id'].tolist()
          map_fig['data'][0]['z'] = df['color_id'].tolist()
      
          return map_fig
      

      cell_id - 列名,用于 choropleth_mapbox 'locations'
      color_id - 列名,用于 choropleth_mapbox 'color'

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-08
        • 2022-01-20
        • 2021-09-05
        • 2021-03-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-19
        相关资源
        最近更新 更多