Python Pandas/STATSOLS模型预测未来价值

Python Pandas/STATSOLS模型预测未来价值,python,pandas,linear-regression,statsmodels,Python,Pandas,Linear Regression,Statsmodels,我一直在尝试在我创建的模型中预测未来的价值。我在熊猫和statsmodels中都试过OLS。以下是我在statsmodels中拥有的功能: import statsmodels.api as sm endog = pd.DataFrame(dframe['monthly_data_smoothed8']) smresults = sm.OLS(dframe['monthly_data_smoothed8'], dframe['date_delta']).fit() sm_pred = smres

我一直在尝试在我创建的模型中预测未来的价值。我在熊猫和statsmodels中都试过OLS。以下是我在statsmodels中拥有的功能:

import statsmodels.api as sm
endog = pd.DataFrame(dframe['monthly_data_smoothed8'])
smresults = sm.OLS(dframe['monthly_data_smoothed8'], dframe['date_delta']).fit()
sm_pred = smresults.predict(endog)
sm_pred
返回的数组长度等于原始数据帧中的记录数,但值不同。当我使用pandas执行以下操作时,没有返回任何值

from pandas.stats.api import ols
res1 = ols(y=dframe['monthly_data_smoothed8'], x=dframe['date_delta'])
res1.predict
(请注意,Pandas中的OLS没有.fit函数)有人能告诉我如何从Pandas或statsmodel中的OLS模型中获得未来的预测吗?我意识到我一定没有使用。正确预测,我已经阅读了人们遇到的多个其他问题,但它们似乎不适用于我的案例

编辑我认为定义的“endog”是不正确的——我应该传递我想要预测的值;因此,我创建了一个超过上次记录值12个周期的日期范围。但我还是错过了一些东西,因为我得到了错误:

matrices are not aligned
编辑这是一段数据,数字的最后一列(红色)是日期增量,它是与第一个日期的月差:

month   monthly_data    monthly_data_smoothed5  monthly_data_smoothed8  monthly_data_smoothed12 monthly_data_smoothed3  date_delta
0   2011-01-31  3.711838e+11    3.711838e+11    3.711838e+11    3.711838e+11    3.711838e+11    0.000000
1   2011-02-28  3.776706e+11    3.750759e+11    3.748327e+11    3.746975e+11    3.755084e+11    0.919937
2   2011-03-31  4.547079e+11    4.127964e+11    4.083554e+11    4.059256e+11    4.207653e+11    1.938438
3   2011-04-30  4.688370e+11    4.360748e+11    4.295531e+11    4.257843e+11    4.464035e+11    2.924085

我认为您这里的问题是statsmodels默认情况下不添加截距,因此您的模型没有实现太多的拟合。要在代码中解决此问题,请执行以下操作:

dframe = pd.read_clipboard() # your sample data
dframe['intercept'] = 1
X = dframe[['intercept', 'date_delta']]
y = dframe['monthly_data_smoothed8']

smresults = sm.OLS(y, X).fit()

dframe['pred'] = smresults.predict()
另外,值得一提的是,我认为statsmodel formula api在处理数据帧时更易于使用,并且在默认情况下添加了一个截取(添加
-1
以删除)。见下文,它应该给出相同的答案

import statsmodels.formula.api as smf

smresults = smf.ols('monthly_data_smoothed8 ~ date_delta', dframe).fit()

dframe['pred'] = smresults.predict()
编辑:

要预测未来的值,只需将新数据传递到
.predict()
,例如,使用第一个模型:

In [165]: smresults.predict(pd.DataFrame({'intercept': 1, 
                                          'date_delta': [0.5, 0.75, 1.0]}))
Out[165]: array([  2.03927604e+11,   2.95182280e+11,   3.86436955e+11])
在截距上-数字
1
中没有任何编码,它只是基于OLS的数学(截距完全类似于总是等于1的回归器),因此您可以直接从摘要中提取值。查看statsmodels,添加截距的另一种方法是:

X = sm.add_constant(X)

没有你的数据,你只能推测。请发布一个自包含的示例,其中包含生成数据的代码。有关更多信息,请参阅ok…我试图从ipython输出中发布一个副本并粘贴数据帧,但它的格式当然不正确…请执行
df。编辑
并粘贴第一组代码看起来正常。为什么您希望这些值是相同的?也许可以看看
smresults.summary()
,看看模型的拟合程度。这并不是说我期望它们实际上是一样的,只是它返回了42个周期的值,但我不知道是哪个周期,值是e+22,这太高了。您好,谢谢!有几个问题是,第二个代码起作用了,但是我想知道如何对超出数据范围的日期进行预测。dframe['intercept']=1正在返回索引中没有的
intercept'错误。此外,我能够从模型摘要中精确地看到截距,我应该使用截距还是“1”编码?再次感谢!很抱歉我知道拦截发生了什么!我现在只需要弄清楚如何用这个模型预测未来的周期…@pythonista-关于这个错误-确保
type(dframe)
是一个数据帧,你不应该得到那个错误。请参阅编辑以获取其他问题的答案。非常好,非常感谢-我做了一系列具有不同跨度的ewma,我正在使用ewma预测未来值,我想将其与原始数据和平滑数据上的OLS预测进行比较…不知道该相信什么,但感谢您帮助我完成这篇文章!