如何在Python的statsmodels ARIMA预测中反转差分?

6

我试图使用Python和Statsmodels来理解ARIMA预测。具体而言,为了使ARIMA算法起作用,需要通过差分(或类似的方法)使数据变得平稳。问题是:在残差预测完成后,如何反转差分以回到包括趋势和季节性的预测中?

(我看到了一个类似的问题here,但遗憾的是没有发布答案。)

到目前为止,我已经完成了以下工作(基于Magnus Vilhelm Persson和Luiz Felipe Martins的《掌握Python数据分析》最后一章中的示例)。数据来自DataMarket

%matplotlib inline
import matplotlib.pyplot as plt
import pandas as pd
from statsmodels import tsa 
from statsmodels.tsa import stattools as stt 
from statsmodels.tsa.seasonal import seasonal_decompose
from statsmodels.tsa.arima_model import ARIMA 

def is_stationary(df, maxlag=15, autolag=None, regression='ct'): 
    """Test if df is stationary using Augmented 
    Dickey Fuller""" 

    adf_test = stt.adfuller(df,maxlag=maxlag, autolag=autolag, regression=regression) 
    adf = adf_test[0]
    cv_5 = adf_test[4]["5%"]

    result = adf < cv_5    
    return result

def d_param(df, max_lag=12):
    d = 0
    for i in range(1, max_lag):
        if is_stationary(df.diff(i).dropna()):
            d = i
            break;
    return d

def ARMA_params(df):
    p, q = tsa.stattools.arma_order_select_ic(df.dropna(),ic='aic').aic_min_order
    return p, q

# read data
carsales = pd.read_csv('data/monthly-car-sales-in-quebec-1960.csv', 
                   parse_dates=['Month'],  
                   index_col='Month',  
                   date_parser=lambda d:pd.datetime.strptime(d, '%Y-%m'))
carsales = carsales.iloc[:,0] 

# get components
carsales_decomp = seasonal_decompose(carsales, freq=12)
residuals = carsales - carsales_decomp.seasonal - carsales_decomp.trend 
residuals = residuals.dropna()

# fit model
d = d_param(carsales, max_lag=12)
p, q = ARMA_params(residuals)
model = ARIMA(residuals, order=(p, d, q)) 
model_fit = model.fit() 

# plot prediction
model_fit.plot_predict(start='1961-12-01', end='1970-01-01', alpha=0.10) 
plt.legend(loc='upper left') 
plt.xlabel('Year') 
plt.ylabel('Sales')
plt.title('Residuals 1960-1970')
print(arimares.aic, arimares.bic)  

生成的图表很令人满意,但是没有包含趋势和季节性信息。我该如何反差分以恢复趋势/季节性?残差图

1
predict有一个typ='level'关键字。对于季节性数据,SARIMAX更合适。 - Josef
对于其他遇到类似问题的人:是的,看起来SARIMAX是正确的选择。这里有一个很好的教程:https://www.digitalocean.com/community/tutorials/a-guide-to-time-series-forecasting-with-arima-in-python-3。此外,Cross-Validated上关于预测的帖子(包括Python相关内容)比SO更多。 - Mark Pedigo
1个回答

1
依靠差分可能不是最佳策略,使用时间趋势(或多个)更好。第33个时期是异常值,如果忽略它会产生后果。
PACF不显示强烈的季节性成分。enter image description here 这是一个具有3月、4月、5月和6月强相关性的弱季节性AR模型。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接