3

我正在使用 plotly 的 python 库来绘制时间序列数据的散点图。例如数据:

2015-11-11    1
2015-11-12    2
2015-11-14    4
2015-11-15    2
2015-11-21    3
2015-11-22    2
2015-11-23    3

python中的代码:

df = pandas.read_csv('~/Data.csv', parse_dates=["date"], header=0)
df = df.sort_values(by=['date'], ascending=[True])
trace = go.Scatter(
            x=df['date'],
            y=df['score'],
            mode='markers'
)
fig.append_trace(trace, 2, 2)  # It is a subplot
iplot(fig)

绘制散点图后,我想在其上绘制一条最佳拟合线。

plotly 是否以编程方式提供此功能?它来自webapp,但我没有找到任何关于如何以编程方式执行它的文档。链接中的行正是我想要的:

在此处输入图像描述

4

1 回答 1

2

您提供的代码片段缺少fig定义。我更喜欢使用plotly.graph_objs,但下面的 with 设置您可以选择使用fig.show()或来显示您的数字iplot(fig)。您不能只包含一个参数并自动获得最佳拟合线,但您肯定可以通过编程方式获得。您只需要在原始设置中添加几行就可以了。

阴谋:

在此处输入图像描述

带有示例数据的完整代码:

import pandas as pd
import datetime
import statsmodels.api as sm
import plotly.graph_objs as go
from plotly.offline import iplot

# sample data
df=pd.DataFrame({'date': {0: '2015-11-11',
                      1: '2015-11-12',
                      2: '2015-11-14',
                      3: '2015-11-15',
                      4: '2015-11-21',
                      5: '2015-11-22',
                      6: '2015-11-23'},
                     'score': {0: 1, 1: 2, 2: 4, 3: 2, 4: 3, 5: 2, 6: 3}})

df = df.sort_values(by=['date'], ascending=[True])

# data for time series linear regression
df['timestamp']=pd.to_datetime(df['date'])
df['serialtime']=[(d-datetime.datetime(1970,1,1)).days for d in df['timestamp']]

x = sm.add_constant(df['serialtime'])
model = sm.OLS(df['score'], x).fit()
df['bestfit']=model.fittedvalues

# plotly setup
fig=go.Figure()

# source data
fig.add_trace(go.Scatter(x=df['date'],
                         y=df['score'],
                         mode='markers',
                         name = 'score')
             )

# regression data
fig.add_trace(go.Scatter(x=df['date'],
                         y=df['bestfit'],
                         mode='lines',
                         name='best fit',
                         line=dict(color='firebrick', width=2)
                        ))

iplot(fig)

一些细节:

时间序列通常会为线性 OLS 估计带来某些问题。日期本身的格式可能具有挑战性,因此在这种情况下,很容易将数据框的索引用作自变量。但由于您的日期不是连续的,简单地用连续系列替换它们会导致错误的回归系数。我经常发现最好使用序列化整数数组来表示时间序列数据,这意味着每个日期都由一个整数表示,而整数又是某个时期的天数。在这种情况下01.01.1970

这正是我在这里所做的:

df['timestamp']=df['datetime'] = pd.to_datetime(df['date'])
df['serialtime'] = [(d- datetime.datetime(1970,1,1)).days for d in df['timestamp']]

下面的图表说明了使用错误数据对 OLS 估计的影响:

在此处输入图像描述

于 2019-12-04T12:20:56.053 回答