【问题标题】:Dash reload pandas dataframe at browser reload在浏览器重新加载时破折号重新加载熊猫数据框
【发布时间】:2021-02-20 11:30:53
【问题描述】:

我创建了这个简单的小 Dash 应用程序,显示 2 个图表。它可以工作,但我想在浏览器中重新加载页面时重新加载数据数据框,因为数据源每 5 分钟更新一次?

据我所知,我需要某种回调,有人有重新加载数据帧的例子吗?

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

data = pd.read_json("https://URL")
data["time"] = pd.to_datetime(data["time"], format="%Y-%m-%d %H:%M")
data.sort_values("time", inplace=True)

app = dash.Dash(__name__)

def serve_layout():
    return  html.Div(
    children=[
        html.H1(children="Vejr",),
        html.P(
            children="Vejret @G12A",
        ),
        dcc.Graph(
            figure={
                "data": [
                    {
                        "x": data["time"],
                        "y": data["temp_air_1"],
                        "type": "lines",
                        "name": "Air temp 1",
                    },
                    {
                        "x": data["time"],
                        "y": data["temp_air_2"],
                        "type": "lines",
                        "name": "Air temp 2",
                    },
                ],
                "layout": {"title": "Temperatur"},
            },
        ),
        dcc.Graph(
            figure={
                "data": [
                    {
                        "x": data["time"],
                        "y": data["humidity"],
                        "type": "lines",
                        "name": "Humidity (%)",
                    },

                ],
                "layout": {"title": "Humidity"},
            },
        ),
    ]
)

app.layout = serve_layout

if __name__ == "__main__":
    app.run_server(debug=True)

【问题讨论】:

  • 如果有任何答案解决了您的问题,请注明,否则请修改您的问题并等待其他回复

标签: python pandas plotly-dash


【解决方案1】:

虽然创建回调是一种可能的解决方案,但对于您的用例,我建议只需将数据加载移动到您的 serve_layout 函数中,即类似

def serve_layout():
    # Load the data.
    data = pd.read_json("https://URL")
    data["time"] = pd.to_datetime(data["time"], format="%Y-%m-%d %H:%M")
    data.sort_values("time", inplace=True)
    # Render the layout.
    return  html.Div(...)

由于此功能在页面加载时执行,您将始终看到最新数据。

【讨论】:

  • 您的解决方案不起作用。也许您的意思是返回 html.Div(...) 和数据?不然怎么在回调中引用数据?
  • 不,该函数应该只返回布局。如果回调需要数据,它们应该自己加载数据,或者从作为布局渲染的一部分填充的 Store 对象中读取(作为输入或状态)。
  • @emher 有用于多页布局的版本吗?从文档中,app.layout 被分配了serve_layout() 函数。这意味着在页面刷新时,将重新查询所有数据源。有没有办法将其限制为多页布局中的应用程序子集?
【解决方案2】:

是的,对于真正的应用程序,您应该使用 dash dcc.Interval (https://dash.plotly.com/live-updates)。该页面顶部有一个很好的示例,说明如何创建回调以重新加载资源(数据框)。

它允许您以您可以选择的时间间隔更新可视化。重新加载页面是一项昂贵的操作,因此我不建议构建依赖它的应用程序。除非您的网页设计是动态的,否则我建议您像示例中那样分离您的静态 html 代码,然后使用回调重新加载可视化的内容。

import datetime

import dash
import dash_core_components as dcc
import dash_html_components as html
import plotly
from dash.dependencies import Input, Output



app = dash.Dash(__name__)
app.layout = html.Div(
    children=[
        html.H1(children="Vejr",),
        html.P(children="Vejret @G12A"),
        dcc.Graph( id= "graph1"),
        dcc.Graph( id= "graph2") 
    ]
)


# Multiple components can update everytime interval gets fired.
@app.callback(Output('graph1', 'figure'),
              Input('interval-component', 'n_intervals'))
def update_graph_live(n):
    data = {...}

    # Create the graph
    fig = plotly.Figure(.....)

    return fig
    
@app.callback(Output('graph2', 'figure'),
              Input('interval-component', 'n_intervals'))
def update_graph_live(n):
    data = {...}

    # Create the graph
    fig = plotly.Figure(.....)

    return fig


if __name__ == '__main__':
    app.run_server(debug=True)

如果您不构建真正的应用程序并且想要更简单的路线,那么您可以按照@emher 的建议进行操作。

【讨论】:

  • 我理解您的建议,但问题是关于在页面重新加载时执行操作。在我看来,完整的答案是@emher 和你的作为最后的评论
猜你喜欢
  • 2021-11-29
  • 1970-01-01
  • 2016-06-06
  • 2018-05-26
  • 2014-10-03
  • 2013-07-28
  • 2012-11-04
  • 2015-09-05
  • 2012-06-11
相关资源
最近更新 更多