gpt4 book ai didi

python - Pandas/Statsmodel OLS 预测 future 值

转载 作者:太空宇宙 更新时间:2023-11-03 13:00:04 26 4
gpt4 key购买 nike

我一直在尝试预测我创建的模型中的 future 值。我在 pandas 和 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 模型中获得 future 预测 - 我意识到我不能正确使用 .predict 并且我读过人们遇到的其他多个问题,但它们似乎不适用于我的情况。

编辑 我认为定义的“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()

此外,就其值(value)而言,我认为 statsmodel 公式 api 在处理 DataFrame 时更好用,并且默认添加拦截(添加 - 1 以删除)。见下文,它应该给出相同的答案。

import statsmodels.formula.api as smf

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

dframe['pred'] = smresults.predict()

编辑:

要预测 future 值,只需将新数据传递给 .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 的回归量),因此您可以提取值马上总结。查看统计模型 docs ,另一种添加拦截的方法是:

X = sm.add_constant(X)

关于python - Pandas/Statsmodel OLS 预测 future 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25514220/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com