用情节

时间:2015-12-07 05:23:17

标签: python pandas 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)

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

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

1 个答案:

答案 0 :(得分:0)

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

情节:

enter image description here

包含示例数据的完整代码:

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估计的影响:

enter image description here