我正在学习时间序列预测,并且能够使用Seasonal ARIMA在每天的时间间隔内创建合理的建筑能耗模型。我有大约3年的数据,原始间隔是每15分钟一次。
由于要查看的数据太多,我决定通过求和将数据每天重新采样。
这是数据框的示例结构:
时间戳|千瓦时
2012-10-08 | 28214.340
2012-10-09 | 28691.520
2012-10-10 | 27549.720
2012-10-11 | 26385.039
2012-10-12 | 25678.180
频率:D,名称:kWh,dtype:float64
这存储在名为daily_kWh
的数据框中
然后我使用ADF和KPSS统计测试来检查每日数据的平稳性:
Dickey-Fuller测试结果:
测试统计数据1.228884
p值0.996179
已使用的时滞9.000000
使用的观察数18.000000
临界值(1%)-3.859073
临界值(5%)-3.042046
关键值(10%)-2.660906
KPSS测试结果:
测试统计0.381702
p值0.085042
已使用的时滞9.000000
临界值(10%)0.347000
临界值(5%)0.463000
临界值(2.5%)0.574000
临界值(1%)0.739000
据我了解,ADF测试暗示数据不是平稳的,而KPSS测试暗示数据是“趋势平稳的”。
然后我对数据进行差异化并进行目视检查以确保平稳性。
我想绘制ACF和PACF图,以更好地了解哪些参数(p,d,q)适用于模型。这些图显示在每天的时间序列中。
这是将时间序列偏移(一阶差分)一周后的ACF和PACF图。
我读到AR和MA术语可以基于ACF和PACF图;但是对我来说,如何解释上面这4个图并不清楚。
因此,我最终基于“网格搜索”方法找出了ARIMA模型的参数,该方法将AIC得分降至最低,最终得到了以下参数: p = 1,d = 1,q = 1,P = 1,D = 2,Q = 2,m = 28(季节性)
我在以下方面遇到困难:
1)如何解释原始数据集和差异数据的ACF和PACF图?我能说出要使用的AR和MA术语吗?
2)如何确定m的值?我无法将其包含在“网格搜索”中,因为我的计算机花了太长时间才能执行此操作(也许我的计算机缺少执行此操作的资源)。有没有一种方法可以根据ACF或PACF图确定m?
关于建筑物每日能源使用趋势的有趣之处在于,在给定的一周之内会有起伏不定(例如,办公楼在周末无人居住时能耗较低),此外,在给定的一年之内,您会看到夏季和冬季之间的能耗差异。因此,从本质上讲,每周和每月都有关联的趋势/(季节性?)。
当前,基于模型拟合和绘制样本外预测,我将其设置为28。当保持所有其他p,d,q(和P,D,Q)值恒定时,大约28的值似乎提供了样本预测中的“最佳”。确定m的合适方法是什么?
除上述内容外,我还尝试将同一时间段内的每小时温度数据用作模型的外生变量,以希望有助于样本预测。以下是外生变量的示例:
时间戳|温度(F)
2012-10-01 | 72.756890
2012-10-02 | 76.630573
2012-10-03 | 65.621458
2012-10-04 | 61.138021
2012-10-05 | 62.113156
外界气温存储在名为daily_OAT
的数据框中
下面是我用来训练模型并预测30天的kWh值的代码:
train = daily_kWh[0:-30]
test = daily_kWh[-30:]
exog = daily_OAT[0:-30]
exog_forecast = daily_OAT[-30:]
mod2 = sm.tsa.statespace.SARIMAX(train,exog=np.asarray(exog),
order=(1,1,1),
seasonal_order=(1,2,2,28),
enforce_stationarity=False,
enforce_invertibility=False)
results2 = mod2.fit()
pred = results2.get_prediction(start=test.index[0], end=test.index[-1], exog = exog_forecast.values.astype('float64').reshape(30,1), dynamic=False)
pred_ci = pred.conf_int(alpha = 0.1)
ax = daily_kWh['2014-12-01':].plot(label='kWh')
ax
pred.predicted_mean.plot(ax=ax, label='One-step ahead Forecast', alpha=.7, figsize=(20, 10))
ax.fill_between(pred_ci.index,
pred_ci.iloc[:, 0],
pred_ci.iloc[:, 1], color='k', alpha=.1)
ax.set_xlabel('Date')
ax.set_ylabel('Daily kWh')
plt.ylim([20000,40000])
plt.legend()
plt.show()
以下是模型诊断信息和模型本身:
3)我尝试检查错误,但无法执行。预测的能源使用情况看起来非常好,似乎太好了,难以置信。我在某个地方犯错了吗?
感谢您的阅读和帮助!