Приведенный ниже код работает без каких-либо ошибок, но на строке слайдера нет дат (пожалуйста, проверьте скриншот):
Тире-график со слайдером (скриншот)
Столбец «дата» в файле Excel имеет следующий формат: «гггг-мм-дд», но дни всегда 01: 2017-12-01;2017-05-01;2017-02-01;2017-08-01 и т. Д. Таким образом, в основном, столбец «дата» содержит только месяцы и год 2017.
Когда я протестировал вывод в блокноте Jupyter, я смог увидеть следующее как «отметки ползунка»'output:
Slider (id =' date-slider ', marks = {' 2017-05-01 ':' 2017-05-01 ',' 2017-02-01 ':' 2017-02-01 ',' 2017-01-01 ':' 2017-01-01 ',' 2017-09-01 ':' 2017-09-01 ',' 2017-04-01 ':' 2017-04-01',' 2017-11-01 ':' 2017-11-01 ',' 2017-03-01 ':' 2017-03-01 ',' 2017-10-01 ':' 2017-10-01 ','2017-07-01': '2017-07-01', '2017-08-01': '2017-08-01', '2017-06-01': '2017-06-01', '2017-12-01 ':' 2017-12-01 '}, значение =' 2017-01-01 ', min =' 2017-01-01 ', max =' 2017-12-01 ')
Я уверен, что есть что-то с форматом даты, но не знаю, как решить проблему.
Вот сам код:
import dash
import dash_core_components as dcc
import dash_html_components as html
import pandas as pd
import plotly.graph_objs as go
import datetime
import numpy as np
df = pd.read_excel("stats3 - Copy.xlsx",sheet_name=0)
#sort dataframe by date for the line plot
df2 = df.sort_values('date')
games = df.game.unique()
app = dash.Dash()
app.css.append_css({'external_url': 'https://cdn.rawgit.com/plotly/dash-app-stylesheets/2d266c578d2a6e8850ebce48fdb52759b2aef506/stylesheet-oil-and-gas.css'})
app.layout = html.Div([
html.Div(children='''You can select the game title you are interested in for the detailed observation on the drop-down below:''',
style={'font-family':'Helvetica, monospace', 'color':'#59abe3'}, className="row"),
html.Div([
html.Div([dcc.Dropdown(
id='game',
options=[{'label':i, 'value':i} for i in games],
value='',
placeholder='Please select the game',
multi=True)],
className='nine columns')], className="row"),
html.Div([
html.Div([
dcc.Graph(id='graph-with-slider')],
className='nine columns')], className="row"),
html.Div(children='''You can select the date you are interested in on the slider below:''', style={'font-family':'Helvetica, monospace', 'color':'#59abe3'},
className="row"),
html.Div([
html.Div([
dcc.Slider(
id='date-slider',
min=df2['date'].apply(lambda x: x.strftime('%Y-%m-%d')).min(),
max=df2['date'].apply(lambda x: x.strftime('%Y-%m-%d')).max(),
value=df2['date'].apply(lambda x: x.strftime('%Y-%m-%d')).min(),
step=None,
marks={str(date): str(date) for date in df2['date'].apply(lambda x: x.strftime('%Y-%m-%d')).unique()}
)], className='nine columns'),
], className="row")
])
@app.callback(
dash.dependencies.Output('graph-with-slider', 'figure'),
[dash.dependencies.Input('date-slider', 'value'),
dash.dependencies.Input('game', 'value')])
def update_figure(selected_date, game):
filtered_df = df.loc[df2['date'].apply(lambda x: x.strftime('%Y-%m-%d')) == selected_date]
if (game != '' and game is not None):
filtered_df = filtered_df[df.game.str.contains('|'.join(game))]
traces = []
for i in filtered_df.game.unique():
df_by_game = filtered_df[filtered_df['game'] == i]
traces.append(go.Scatter(
x=df_by_game['conversions'],
y=round((df_by_game['revenue']),2),
text="Advertiser: " + df_by_game['advertiser'] + "<br>" + "Publisher: " + df_by_game['affiliate'],
mode='markers',
opacity=0.7,
marker={'size': 15,},
name=i))
return {
'data': traces,
'layout': go.Layout(
xaxis={'title': 'Conversions'},
yaxis={'title': 'Revenue'},
margin={'l': 40, 'b': 40, 't': 50, 'r': 10},
legend=dict(x=-0.2, y=0.5),
hovermode='closest',
title="Something")
}
if __name__ == '__main__':
app.run_server()