Наша цель
Мы создаем график временных рядов в приложении Django, используя тире / plotly. Представляемые данные считываются с pandas кадра данных, который сначала предварительно обрабатывается, записывается в файл, а затем отправляется на следующую страницу с помощью запроса POST для интерактивной панели мониторинга. При обновлении кадра данных новый график должен быть нанесен на приборную панель.
Проблема
Даже если данные изменены, приборная панель не обновляется. Он по-прежнему показывает график для предыдущего кадра данных, сохраненного в файле. До тех пор, пока сервер django не будет перезагружен, он не обновляется. dcc.interval()
не делает трюка, он также требует перезапуска сервера, даже если вы видите ответ приложения da sh в журнале консоли, плюс он убирает возможность увеличения масштаба для графика, поскольку он обновляет график , Используемая версия Django: 2.2.9
Вот код приложения django -da sh:
import dash_core_components as dcc
import dash_html_components as html
from dash.dependencies import Input, Output,State
import plotly.graph_objs as go
from django_plotly_dash import DjangoDash
import pandas as pd
import dash_table
from datetime import datetime
app = DjangoDash('chalao')
selected_df=pd.read_pickle(r'static/selected_df.pkl')
actual_df=pd.read_pickle(r'static/actual_prediction.pkl')
datatable_df=actual_df
datatable_df.reset_index(inplace=True)
datatable_df['START_DATETIME'] = datatable_df['START_DATETIME'].astype(str)
datatable_df['Transaction'] = datatable_df['Transaction'].round(decimals=-3)
datatable_df['Prediction'] = datatable_df['Prediction'] + 500
datatable_df['Prediction'] = datatable_df['Prediction'].round(decimals=-3)
datatable_df['START_DATETIME'] = datatable_df['START_DATETIME'].map(lambda x: x.lstrip('T00:00:00'))
app.layout = html.Div([
html.H1('Stock Ticker Dashboard'),
html.H1('Transaction Dashboard'),
html.Div([
html.H3('Select start and end dates:'),
dcc.DatePickerRange(
id='my_date_picker2',
min_date_allowed=selected_df.index.min(),
max_date_allowed=selected_df.index.max(),
start_date=selected_df.index.min(),
end_date=selected_df.index.max()
)
], style={'display':'inline-block'}),
dcc.Graph(
id='my_graph2',
figure={
'data': [
{'x': selected_df.index, 'y': selected_df.Transaction,'name':'Transaction'},
],
'layout': go.Layout(title='Actual Transaction Graph')
}
),
html.Div([
html.H3('Select start and end dates:'),
dcc.DatePickerRange(
id='my_date_picker',
min_date_allowed=actual_df.index.min(),
max_date_allowed=actual_df.index.max(),
start_date=actual_df.index.min(),
end_date=actual_df.index.max()
)
], style={'display':'inline-block'}),
dcc.Graph(
id='my_graph',
figure={
'data': [
{'x': actual_df.index, 'y': actual_df.Transaction,'name':'Transaction'},
{'x': actual_df.index, 'y': actual_df.Prediction,'name':'Prediction'}
],
'layout': go.Layout(title='Predicted Graph')
}
),
dash_table.DataTable(
id='table',
columns=[{"name": i, "id": i} for i in datatable_df.columns],
data=datatable_df.to_dict('records'),
sort_action='native',
filter_action='native',
export_format='csv',
style_cell={'textAlign': 'center', 'font-size' : '16px','width': '10px',
'overflow': 'hidden'
},
style_data_conditional=[
{
'if': {'row_index': 'odd'},
'backgroundColor': 'rgb(248, 248, 248)'
}
],
style_header={
'backgroundColor': 'rgb(230, 230, 230)',
'fontWeight': 'bold',
'font-size' : '20px'
}
)
])
def update_graph(start_date, end_date):
start = datetime.strptime(start_date[:10], '%Y-%m-%d')
end = datetime.strptime(end_date[:10], '%Y-%m-%d')
updated_df=actual_df
updated_df=updated_df[start:end]
fig = {
'data': [
{'x': updated_df.index, 'y': updated_df.Transaction,'name':'Transaction'},
{'x': updated_df.index, 'y': updated_df.Prediction,'name':'Prediction'}
],
'layout': {'title': 'Prediction Graph'}
}
return fig
@app.callback(
Output('my_graph2', 'figure'),
[Input('my_date_picker2', 'start_date'),
Input('my_date_picker2', 'end_date')]
)
def update_graph2(start_date, end_date):
start = datetime.strptime(start_date[:10], '%Y-%m-%d')
end = datetime.strptime(end_date[:10], '%Y-%m-%d')
updated_df=selected_df
updated_df=updated_df[start:end]
fig = {
'data': [
{'x': updated_df.index, 'y': updated_df.Transaction,'name':'Transaction'}
],
'layout': {'title': 'Actual Transaction Graph'}
}
return fig
Вот как вызывается в шаблоне Django html:
<div class="container-fluid">
{% load plotly_dash %}
<h1>Home Page</h1>
<div class="{% plotly_class name='chalao' %}" style="height: 100%; width: 100%;">
{% plotly_app name='chalao' ratio=0.45 %}
</div>
<br>
{{ plot1 | safe }}
</div>
Любое предложение и / или решение приветствуются.