我想使用 Nixtlas 的 StatsForecast 一次一步地进行预测,这样当记录新的观察结果时,就会根据所述观察结果生成新的预测。
这是我的幼稚实现:
import pandas as pd
import numpy as np
import os
from statsmodels.tsa.arima_process import arma_generate_sample
from statsforecast import StatsForecast
from statsforecast.models import AutoARIMA
os.environ['NIXTLA_ID_AS_COL'] = '1'
n = 100
## Generate synthetic AR(3) data.
ar3 = arma_generate_sample([1, 0.5, 0.5, 0.5], [1], n)
df = pd.DataFrame(data=ar3, columns=['y']).assign(unique_id=0)
df['ds'] = pd.date_range('01-01-2020', periods=ar3.size, freq='D')
## Instantiate a StatsForecast object
sf = StatsForecast(
models = [AutoARIMA(season_length = 1)],
freq = 'D'
)
res = []
## Generate sequential predictions
for k in range(n//2, n):
## In this cycle we pretend we have k observations
train = df.iloc[:k]
## Generate a prediction from k observations
pred = sf.forecast(df=train, h=1).loc[0, 'AutoARIMA']
## Collect data
time = train.ds.max() + pd.Timedelta('1D')
truth = df[df.ds == time].y.values[0]
res.append(dict(pred=pred, time=time, truth=truth))
res = pd.DataFrame(res).set_index('time')
res.plot()
问题:在我的实现中,
StatsForecast
对象反复优化ARIMA模型的顺序,这非常耗时。
我希望能够:
我可以通过
获取订单from statsforecast.arima import arima_string
arima_string(sf.fit(train).fitted_[0,0].model_)
然后将参数输入到
statsmodels.tsa.arima.model.ARIMA
对象中。这看起来是一个相当复杂且相当麻烦的方法。即使如此,我在将订单从 Nixtla 翻译为 statsmodels
时也可能会犯错误。必须有更好的方法。
auto_model = AutoARIMA(....)
fitted_model = auto_model.fit(train['y'])
# The parameters
p, q, P, Q, m, d, D = fitted_model.model_['arma']
# use them as inputs in a ARIMA model
auto_model_saved = ARIMA(order=(p, d, q), seasonal_order=(P, D, Q), season_length = m)