Plot best fit line with plotly
我正在使用plotly \\的python库绘制时间序列数据的散点图。例如数据:
1 2 3 4 5 6 7 | 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中的代码:
1 2 3 4 5 6 7 8 9 | 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 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | 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估计带来某些问题。日期本身的格式可能具有挑战性,因此在这种情况下,将数据框的索引用作自变量是很诱人的。但是,由于您的日期不是连续的,因此简单地将它们替换为连续的序列会导致错误的回归系数。我经常发现最好使用序列化的整数数组来表示时间序列数据,这意味着每个日期都由一个整数表示,而该整数又是某个时期以来的天数。在这种情况下
这正是我在这里所做的:
1 2 | df['timestamp']=df['datetime'] = pd.to_datetime(df['date']) df['serialtime'] = [(d- datetime.datetime(1970,1,1)).days for d in df['timestamp']] |
下面的图说明了使用错误数据对OLS估计的影响: