我正在尝试使用plotly / Dash绘制一些时间序列数据,但是尽管x轴的类型为'datetime.date','datetime.datetime'或格式正确的字符串(什么也没有),但图形仍无法正确显示作品...)。可能使事情变得复杂的是,我使用不同的函数生成了时间序列数据,将其存储到dcc.Store对象(如dict),然后将其转换回Dataframe ...但是我不确定。我的代码如下,但总结了简单的行动计划:
查看每个步骤生成的数据类型时,我可以看到在使用df.to_dict()生成dict之后,我得到的数据类型为:
{'Date': {0: datetime.date(2017, 1, 1),
1: datetime.date(2017, 2, 1),
2: datetime.date(2017, 3, 1),
3: datetime.date(2017, 4, 1),
.
.
28: datetime.date(2019, 5, 1)},
'FD004': {0: 18890.3544,
1: 18296.9503,
2: 18667.1757,
.
.
28: 16697.2425}}
然后将此字典转换回数据框后,我就会得到:
Date FD004
0 2017-01-01 18890.3544
1 2017-02-01 18296.9503
2 2017-03-01 18667.1757
其中df ['Date']:
0 2017-01-01
1 2017-02-01
2 2017-03-01
.
.
27 2019-04-01
28 2019-05-01
Name: Date, dtype: object
但是我然后使用to_datetime或astype('datetime64 [ns]')进行了转换,这给了我'正确的'dtype:
0 2017-01-01
1 2017-02-01
2 2017-03-01
.
.
27 2019-04-01
28 2019-05-01
Name: Date, dtype: datetime64[ns]
实际上,当检查最终生成的无花果时,我发现plotly已将其识别为日期时间对象:
<bound method BaseFigure.show of Figure({
'data': [{'type': 'scatter',
'x': array([datetime.datetime(2017, 1, 1, 0, 0),
datetime.datetime(2017, 2, 1, 0, 0),
datetime.datetime(2017, 3, 1, 0, 0),
. . .
datetime.datetime(2019, 3, 1, 0, 0),
datetime.datetime(2019, 4, 1, 0, 0),
datetime.datetime(2019, 5, 1, 0, 0)], dtype=object),
'y': array([18890.3544, 18296.9503, 18667.1757, ...
13202.488 , 14463.2424, 15025.5053, 16697.2425])}],
'layout': {'template': '...'}
})>
但是仍然...图形显示为意大利面条:
*****编辑/更新*****
当我不将原始数据框存储到dict时,该图很完美,因此看起来好像是从数据框到dict的转换,然后又返回(尽管所有对象出现都具有正确的数据类型)确实是导致“日期”列被错误解释的原因。那么to_dict()函数或从图上如何解释此转换/恢复的数据根本存在问题?
我的代码:
app = dash.Dash()
app.layout = html.Div(children=[
html.Div(dcc.Input(id='fundTicker', type='text',
debounce=True, placeholder='fundTicker'),
style={'width':'100%'}),
html.Div(dcc.Graph(id='fundGraph'),
style={'width':'75%'}),
dcc.Store(id='fundData'),
]
)
@app.callback(
Output(component_id='fundData', component_property='data'),
[Input(component_id='fundTicker', component_property='value')]
)
def returnFundData(fundTicker):
fundData = bbg.bbgHistorical(fundTicker, '20170101', '20190501', 'MONTHLY', 'FD004')
return fundData
@app.callback(
Output(component_id='fundGraph', component_property='figure'),
[Input(component_id='fundData', component_property='data')]
)
def createFundGraph(fundData):
df = pd.DataFrame.from_dict(fundData)
df['Date'] = pd.to_datetime(df['Date'])
fig = go.Figure()
fig.add_trace(go.Scatter(x=df['Date'], y=df['FD004']))
return fig
if __name__ == '__main__':
app.run_server(debug=False)
答案 0 :(得分:0)
看起来日期并不是全部按升序排序,因此看起来是“意大利面”(回到过去)。您的打印所显示的数据看起来已经排序,所以我不确定但缺少中心部分,以检查它们是否已排序
np.all(np.sort(df['Date']) == df['Date'])
您可以对数据进行排序(例如,使用np.sort
和np.argsort
),或者如果您仅对点而不是直线满意,则对散点图使用mode='markers'
(参见{ {3}}。