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

如何在Python statsmodels ARIMA预测中反转差分?,python,time-series,forecasting,statsmodels,Python,Time Series,Forecasting,Statsmodels,我正试图用Python和Statsmodels对ARIMA进行预测。具体来说,要使ARIMA算法工作,需要通过差分(或类似方法)使数据保持平稳。问题是:在做出剩余预测后,如何反转差异,以返回到一个预测,包括差异出来的趋势和季节性 (我看到了一个类似的问题,但遗憾的是,没有给出答案。) 以下是我到目前为止所做的工作(基于精通Python数据分析最后一章中的示例,Magnus Vilhelm Persson;Luiz Felipe Martins)。数据来源于 %matplotlib内联 将matp

我正试图用Python和Statsmodels对ARIMA进行预测。具体来说,要使ARIMA算法工作,需要通过差分(或类似方法)使数据保持平稳。问题是:在做出剩余预测后,如何反转差异,以返回到一个预测,包括差异出来的趋势和季节性

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

以下是我到目前为止所做的工作(基于精通Python数据分析最后一章中的示例,Magnus Vilhelm Persson;Luiz Felipe Martins)。数据来源于

%matplotlib内联
将matplotlib.pyplot作为plt导入
作为pd进口熊猫
从statsmodels导入tsa
从statsmodels.tsa将stattools导入为stt
从statsmodels.tsa.季节性进口季节性分解
从statsmodels.tsa.arima_模型导入arima
def处于静止状态(df,最大滞后=15,自动滞后=None,回归=ct'):
“”“使用增强型测试df是否静止
迪基·富勒
adf_test=stt.adfuller(df,最大滞后=最大滞后,自滞后=自滞后,回归=回归)
adf=adf_测试[0]
cv_5=adf_测试[4][“5%”]
结果=adf

结果图令人满意,但不包括趋势、季节性信息。如何反转差异以重新捕捉趋势/季节性

当时间趋势(或倍数)可能是更好的策略时,依赖差异。周期33是一个异常值,如果你忽略它,它就会产生后果

PACF没有表现出强烈的季节性成分

这是一个弱季节性AR,与3月、4月、5月和6月具有较强的相关性


predict
有一个
typ='level'
关键字。对于seaonal数据,SARIMAX更合适。对于其他研究类似问题的人:是的,SARIMAX似乎是一条出路。这里有很好的教程:。此外,交叉验证似乎有更多关于预测的帖子(包括Python内容)。
%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)