用 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 估计的影响:
我正在使用 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 估计的影响: