【发布时间】:2016-12-08 00:11:55
【问题描述】:
我有一个 .csv 文件,其中包含一个 5 年的时间序列,具有每小时分辨率(商品价格)。根据历史数据,我想创建第 6 年的价格预测。
我在 www 上阅读了几篇关于这类程序的文章,我的代码基本上基于那里发布的代码,因为我在 Python(尤其是 statsmodels)和统计方面的知识最多。
这些是链接,有兴趣的人:
http://www.seanabu.com/2016/03/22/time-series-seasonal-ARIMA-model-in-python/
http://www.johnwittenauer.net/a-simple-time-series-analysis-of-the-sp-500-index/
首先,这是 .csv 文件的示例。在这种情况下数据以月分辨率显示,它不是真实数据,只是随机选择的数字在这里举个例子(在这种情况下,我希望一年足以能够对第二年进行预测;如果没有,完整的 csv 文件可用):
Price
2011-01-31 32.21
2011-02-28 28.32
2011-03-31 27.12
2011-04-30 29.56
2011-05-31 31.98
2011-06-30 26.25
2011-07-31 24.75
2011-08-31 25.56
2011-09-30 26.68
2011-10-31 29.12
2011-11-30 33.87
2011-12-31 35.45
我目前的进度如下:
读取输入文件并将日期列设置为日期时间索引后,使用以下脚本对可用数据进行预测
model = sm.tsa.ARIMA(df['Price'].iloc[1:], order=(1, 0, 0))
results = model.fit(disp=-1)
df['Forecast'] = results.fittedvalues
df[['Price', 'Forecast']].plot(figsize=(16, 12))
,它给出以下输出:
现在,正如我所说,我没有统计技能,我几乎不知道我是如何得到这个输出的(基本上,改变第一行中的 order 属性会改变输出),但是“实际' 预测看起来不错,我想再延长一年(2016 年)。
为此,在数据框中创建了额外的行,如下所示:
start = datetime.datetime.strptime("2016-01-01", "%Y-%m-%d")
date_list = pd.date_range('2016-01-01', freq='1D', periods=366)
future = pd.DataFrame(index=date_list, columns= df.columns)
data = pd.concat([df, future])
最后,当我使用statsmodels的.predict函数时:
data['Forecast'] = results.predict(start = 1825, end = 2192, dynamic= True)
data[['Price', 'Forecast']].plot(figsize=(12, 8))
我得到的预测是一条直线(见下文),这看起来根本不像预测。此外,如果我将现在从第 1825 天到第 2192 天(2016 年)的范围扩大到整个 6 年时间跨度,则预测线是整个时期(2011-2016)的直线。
我也尝试使用 'statsmodels.tsa.statespace.sarimax.SARIMAX.predict' 方法,它解释了季节性变化(在这种情况下是有意义的),但我得到了一些关于 'module' 的错误没有属性“SARIMAX”。但这是次要问题,如果需要,会详细说明。
我在某个地方失去了控制,我不知道在哪里。谢谢阅读。干杯!
【问题讨论】:
-
我也有类似的问题。你能解决吗?谢谢
-
不,我还没有解决。由于工作中断,我在某个时候放弃了它,再也没有回到这个..
标签: python forecasting statsmodels