Python3 statsmodels ARMAX预测而不在每次迭代中调用.fit()都会导致错误

问题描述 投票:0回答:1

我目前正在使用Python的statsmodels 0.10.0中的ARMA和ARMAResults类来为我的论文预测电力负荷的时间序列。我花了一些时间来找出如何进行迭代预测,而无需在每次迭代中都调用.fit()(我仍然不确定是否有更好的方法)。我使用类似以下的方法来获得24小时的预测,并且每次迭代中还有一个时间步长的数据:

from statsmodels.tsa.arima_model import ARMA
data = getData(0) # data up to start point
arma_result = ARMA(data,order=(p,q)).fit(trend='c')
fit_params = arma_result.params
fc = [arma_result.forecast(steps=24)[0][-1]]

for i in range(1,n+1):
    data = getData(i)
    arma = ARMA(data,order=(p,q))
    arma.method = 'css-mle'
    arma_result.initialize(arma,fit_params)
    fc.append(arma_result.forecast(steps=24)[0][-1])

到目前为止,此方法仍然有效,但是如果我再添加外来数据,则会收到错误消息:

builtins.ValueError: all the input array dimensions for the concatenation axis must match exactly, but along dimension 1, the array at index 0 has size 0 and the array at index 1 has size 1  

当在arima_model模块的.vstack()方法的开头调用numpy的.forecast()时,我并不真正理解该错误。

使用从中获取错误的外来数据的MWE代码看起来像这样(经过测试,它给出的错误与针对我的代码的错误相同:]

from statsmodels.tsa.arima_model import ARMA
pq = (1,0)
data = np.random.random(100) + np.arange(1,101,1)
armax_result = ARMA(data,order=pq,exog=list(range(len(data)))).fit(trend='c')
fit_params = armax_result.params
fc = [armax_result.forecast(steps=24,exog=list(range(len(data),len(data)+24)))[0][-1]]

for i in range(1,24):
    data = np.append(data,[np.random.random()+len(data)])
    armax = ARMA(data,order=pq,exog=list(range(len(data))))
    armax.method = 'css-mle'
    armax_result.initialize(armax,fit_params)
    fc.append(armax_result.forecast(steps=24,exog=list(range(len(data),len(data)+24)))[0][-1])

我还考虑过在每次迭代中使用.fit()进行滚动预测,但是由于我要训练的数据很多,并且我希望预测8000点,因此这将花费太长时间,并且可能不会导致明显更好的预测效果。还有一点:我使用pandas date_range作为索引,为简单起见,我在这里省略了这一点/在.forecast()方法中将其替换为range()术语,因为它对错误没有任何改变。如果您需要任何其他信息,我会尽可能提供它,因为我非常渴望找到解决此问题的方法。

python-3.x statsmodels autoregressive-models
1个回答
0
投票

[我发现,如果包含常量,则数据会进行某种形式的调整,因此,如果我只是将trend方法中的.fit()参数设置为'nc',那似乎就可以了:

from statsmodels.tsa.arima_model import ARMA
pq = (1,0)
data = np.random.random(100) + np.arange(1,101,1)
armax_result = ARMA(data,order=pq,exog=list(range(len(data)))).fit(trend='nc')
fit_params = armax_result.params
fc = [armax_result.forecast(steps=24,exog=list(range(len(data),len(data)+24)))[0][-1]]

for i in range(1,24):
    data = np.append(data,[np.random.random()+len(data)])
    armax = ARMA(data,order=pq,exog=list(range(len(data))))
    armax.method = 'css-mle'
    armax_result.initialize(armax,fit_params)
    fc.append(armax_result.forecast(steps=24,exog=list(range(len(data),len(data)+24)))[0][-1])

否则,如果包含一个常数,则必须使用.fit()中的add_trend()方法按照在statsmodels.tsa.tsatools方法中的方式进行组织。如果我正确理解它,那么常量将被追加。但是,我仍然有一个问题,那就是这不是一个合适的解决方案,因为调用.fit()时受影响的所有变量(例如,fittedvalues)都不会使用我的解决方案进行更新。进一步地,与R中相同的数据和模型进行比较,得出的结果看起来比预期的要多得多,这使我很难过可能在某个地方犯了某种错误。

我非常感谢您的帮助,因为此解决方案似乎无法正常工作!

© www.soinside.com 2019 - 2024. All rights reserved.