Обновление приложения Python 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?


person Chris Downs    schedule 22.11.2019    source источник


Ответы (2)


Я думаю, вам не нужно убивать «старый» экземпляр приложения и запускать новый каждые несколько минут. Вы можете просто запустить приложение один раз и установить «интервал обновления» на желаемое время (в миллисекундах), чтобы новые данные загружались приложением в функции обратного вызова, пока оно продолжает работать.

Этот код демонстрирует это (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)
person Tony    schedule 25.11.2019

Обновите данные без повторного создания фигуры. Это сокращает задержки рендеринга.

@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 'location'
color_id - имя столбца, который использовался в choropleth_mapbox 'location'

person Zuykov    schedule 25.11.2020