python - 如何反转 Python statsmodels ARIMA 预测中的差异?

标签 python time-series forecasting statsmodels

我正在尝试使用 Python 和 Statsmodels 进行 ARIMA 预测。具体来说,要使 ARIMA 算法起作用,需要通过差分(或类似方法)使数据静止。问题是:在做出残差预测后,如何反转差分以返回包含差分的趋势和季节性的预测?

(我看到了一个类似的问题here,可惜,没有发布答案。)

这是我目前所做的(基于 掌握 Python 数据分析 最后一章中的示例,Magnus Vilhelm Persson;Luiz Felipe Martins)。数据来自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)  

生成的图令人满意,但不包括趋势、季节性信息。我如何反转差异以重新捕捉趋势/季节性? Residual plot

最佳答案

当时间趋势(或多个)可能是更好的策略时,依靠差分。第 33 期是异常值,如果您忽略它,则会产生后果。

PACF 没有表现出很强的季节性成分。 enter image description here

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

enter image description here

关于python - 如何反转 Python statsmodels ARIMA 预测中的差异?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44418777/

相关文章:

r - 使用 `forecast` 绘制 `dygraphs` 预测

python - 字典循环获取每个值

python - 从 DataFrame 列构造 Series 时丢失值

Python 在时间序列数据框中填充零并保留现有值

python - sktime ARIMA 无效频率

python - python 中的 Scipy Detrend

python - 为什么选择 sys.modules 作为字典?

python - 在循环中使用分层索引从 Pandas 数据帧创建子集表

python - GAE-AppEngine-DeadlineExceededError : Deadline exceeded while waiting for HTTP response from URL:

在 R 中构建更新数据集后重用 ts 模型(预测包)