破折号错误地格式化了时间轴的x轴

时间:2019-09-09 00:24:55

标签: python plotly-dash

我正在尝试使用plotly / Dash绘制一些时间序列数据,但是尽管x轴的类型为'datetime.date','datetime.datetime'或格式正确的字符串(什么也没有),但图形仍无法正确显示作品...)。可能使事情变得复杂的是,我使用不同的函数生成了时间序列数据,将其存储到dcc.Store对象(如dict),然后将其转换回Dataframe ...但是我不确定。我的代码如下,但总结了简单的行动计划:

  1. 在输入框中输入资产的代码,生成一个字典并将其存储到dcc.Store中(我想重新使用此时间序列,因此要存储它,而不是一次又一次地重复外部Bloomberg调用)
  2. 立即从dcc.Store中检索该字典,转换回数据框并生成简单图形

查看每个步骤生成的数据类型时,我可以看到在使用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': '...'}
})>

但是仍然...图形显示为意大利面条:

enter image description here

*****编辑/更新*****

当我不将原始数据框存储到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)

1 个答案:

答案 0 :(得分:0)

看起来日期并不是全部按升序排序,因此看起来是“意大利面”(回到过去)。您的打印所显示的数据看起来已经排序,所以我不确定但缺少中心部分,以检查它们是否已排序

np.all(np.sort(df['Date']) == df['Date'])

您可以对数据进行排序(例如,使用np.sortnp.argsort),或者如果您仅对点而不是直线满意,则对散点图使用mode='markers'(参见{ {3}}。