声明一下,我对使用时间序列模型的经验非常有限。
我试图使用一年的每小时能源数据来训练一组23个建筑物的ARX模型。我希望在给定一组在训练数据范围内的时间戳后,得到一个单一的预测向量。通过这个向量,我可以验证与覆盖相同时间戳子集的测试数据。我尝试使用statsmodels作为VAR(p)模型来进行初步尝试,在添加外生项之前。我认为这是一个VAR模型,因为它是每个时间戳的多变量。我尝试使用VARMAX模型,设置为order(3,0)来创建一个VARX模型,结果运行时间很长且不成功,所以我先退回到简单的VAR模型。
我的最终目标是使用下面的数据集来拟合一个VARX模型,同时使用每小时的平均值作为外生项。我预计这将得到一个参数向量,其长度等于滞后项。然后我将使用这个向量来预测训练数据集中每一行的y_hat
预测值。然后我可以将这个输出与测试数据集中相同小时子集进行比较。
我的训练数据集是标准化的每小时能源数据,看起来如下(请原谅bldg5
之后的格式,它没有很好地复制):
start_time Bldg1 Bldg2 Bldg3 Bldg4 Bldg5 Bldg7 Bldg8 Bldg9 Bldg10 Bldg11 Bldg12 Bldg13 Bldg14 Bldg15 Bldg16 Bldg17 Bldg18 Bldg19 Bldg20 Bldg21 Bldg22 Bldg23 2014-01-05 00:00:00 0.2345679012345679 0.08234295415959253 0.02127659574468085 0.006535947712418301 0.3939393939393939 0.020325203252032523 0.034013605442176874 0.11003236245954694 0.013307984790874526 0.013513513513513514 0.06734006734006734 0.02840909090909091 0.3116883116883117 0.5301204819277109 0.03793103448275862 0.058064516129032254 0.3546511627906977 0.009523809523809523 0.47887323943661975 0.9228571428571428 0.04154302670623146 0.27731092436974792014-01-05 01:00:00 0.2345679012345679 0.07045840407470289 0.07092198581560284 0.006535947712418301 0.3939393939393939 0.04065040650406505 0.03741496598639456 0.07119741100323625 0.020912547528517112 0.013513513513513514 0.03367003367003367 0.02840909090909091 0.5194805194805195 0.4487951807228916 0.020689655172413793 0.06451612903225806 0.4476744186046512 0.009523809523809523 0.5014084507042254 0.6914285714285714 0.03560830860534124 0.26050420168067232014-01-05 02:00:00 0.2345679012345679 0.07555178268251274 0.056737588652482275 0.026143790849673203 0.3636363636363636 0.020325203252032523 0.03741496598639456 0.07119741100323625 0.011406844106463879 0.013513513513513514 0.04377104377104377 0.02840909090909091 0.4675324675324675 0.4728915662650603 0.017241379310344827 0.05161290322580645 0.436046511627907 0.009523809523809523 0.4732394366197183 0.66 0.03857566765578635 0.131652661064425772014-01-05 03:00:00 0.2345679012345679 0.07045840407470289 0.02127659574468085 0.006535947712418301 0.25757575757575757 0.036585365853658534 0.03741496598639456 0.07119741100323625 0.020912547528517112 0.010135135135135136 0.037037037037037035 0.02840909090909091 0.4285714285714286 0.39457831325301207 0.020689655172413793 0.08387096774193549 0.19767441860465118 0.006349206349206349 0.47887323943661975 0.7771428571428572 0.04154302670623146 0.162464985994397762014-01-05 04:00:00 0.2345679012345679 0.07045840407470289 0.02127659574468085 0.006535947712418301 0.2727272727272727 0.02845528455284553 0.030612244897959183 0.06796116504854369 0.011406844106463879 0.010135135135135136 0.03367003367003367 0.0625 0.3766233766233766 0.009036144578313253 0.020689655172413793 0.1032258064516129 0.0872093023255814 0.009523809523809523 0.49295774647887325 0.19714285714285712 0.03264094955489614 0.12324929971988796. . .
测试数据集(也是标准化的每小时能源数据)看起来如下(形状为168×1):
TestTime TestBldg2014-09-07 00:00:00 0.094276094276094282014-09-07 01:00:00 0.0370370370370370352014-09-07 02:00:00 0.04040404040404042014-09-07 03:00:00 0.0370370370370370352014-09-07 04:00:00 0.037037037037037035. . .
当我拟合如下模型时:
from statsmodels.tsa.api import VARvar_mod = VAR(train_norm.iloc[:,3:])var_res = var_mod.fit()var_res.summary()
我得到了数据集中每个建筑物的滞后系数,这出乎意料。我还不明白如何对我的拟合模型var_res
进行预测,因为我期望像使用单变量AR模型的AutoReg()
那样执行var_res.predict()
操作
(补充:statsmodels中的forecast和predict函数有什么区别?在拟合前的模型var_mod
中的predict和拟合后的模型var_res.predict()
有什么区别?)
请告诉我我可以提供哪些额外的澄清信息。
回答:
一般来说,VAR模型允许在前p
个时间步内任何K
状态的影响(使用statsmodels的表示法)。听起来你想要的并不是矢量自回归(因为你不希望一个建筑物依赖于另一个建筑物之前的时间步),而是使用“面板”数据集(多个时间序列观测)的AR模型。我相信在statsmodels中应该有办法做到这一点,但坦白说,快速搜索并没有找到。你可以构造一个标准的OLS模型,将数据集进行透视,使每个观测值成为建筑物X时间的观测值,然后创建新的特征,这些特征是从t-1
到t-p
的滞后能源使用。然后你可以简单地对这些数据运行OLS。但我可能错过了statsmodels中用于此目的的函数。
关于你的预测/预测问题,predict
看起来是VAR
对象(你代码中的var_mod
)的方法,而不是VARResults
(你代码中的var_res
)的方法,并且需要你指定参数。因此,这依赖于你的样本内数据,并且似乎只能接受规定的参数而不是使用你拟合的参数。如果你想这样做,你可以尝试以下操作:
var_mod.predict(var_res.params, start=train_norm.index[p], end=train_norm.index[-1], lags=p)
但我认为你寻找的是forecast
,因为你想将其应用于任意测试建筑物。