您提供的代码片段缺少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 估计的影响: