用 plotly 绘制最佳拟合线

Plot best fit line with plotly

我正在使用 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,但我没有找到任何关于如何以编程方式执行此操作的文档。 link 中的那一行正是我想要的:

您提供的代码片段缺少 fig 定义。我更喜欢使用 plotly.graph_objs,但在下面的设置中,您可以选择使用 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 估计的影响: