сбой auto_arima при изменении одного значения в серии - PullRequest
0 голосов
/ 05 марта 2020

Я работаю над прогнозной моделью временного ряда с pmdarima.

Мой временной ряд короток, но ведет себя не так плохо. Следующий код выдает ошибку на sklearn \ utils \ validation.py

from pmdarima import auto_arima
from statsmodels.tsa.seasonal import seasonal_decompose
from statsmodels.tsa.stattools import adfuller
import datetime
import pandas as pd

datelist = pd.date_range('2018-01-01', periods=24, freq='MS')

sales = [26.000000,27.100000,26.000000,28.014286,28.057143,
         30.128571,39.800000,33.000000,37.971429,45.914286,
         37.942857,33.885714,36.285714,34.971429,40.042857,
         27.157143,30.685714,35.585714,43.400000,51.357143,
         45.628571,49.942857,42.028571,52.714286]


df = pd.DataFrame(data=sales,index=datelist,columns=['sales'])

observations = df['sales']
size = df['sales'].size
shape = df['sales'].shape
maxdate = max(df.index).strftime("%Y-%m-%d")
mindate = min(df.index).strftime("%Y-%m-%d")


asc = seasonal_decompose(df, model='add')

if asc.seasonal[asc.seasonal.notnull()].size == df['sales'].size:
    seasonality = True
else:
    seasonality = False

# Check Stationarity
aftest = adfuller(df['sales'])

if aftest[1] <= 0.05:
    stationarity = True
else:
    stationarity = False

results = auto_arima(observations,
                     seasonal=seasonality,
                     stationary=stationarity,
                     m=12,
                     error_action="ignore")
~\AppData\Roaming\Python\Python37\site-packages\sklearn\utils\validation.py in check_array(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_all_finite, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, warn_on_dtype, estimator)
    584                              " minimum of %d is required%s."
    585                              % (n_samples, array.shape, ensure_min_samples,
--> 586                                 context))
    587 
    588     if ensure_min_features > 0 and array.ndim == 2:

ValueError: Found array with 0 sample(s) (shape=(0,)) while a minimum of 1 is required.

Однако, если я изменю первое значение серии продаж с 26 на 30, это сработает.

Что здесь может быть не так?

1 Ответ

0 голосов
/ 06 марта 2020
  1. Ваш пример не воспроизводится, так как в настоящее время seasonality и stationarity не определены в глобальной области видимости. Это приводит к auto_arima выдаче ошибки вида

    NameError: имя 'сезонность' не определено

  2. У вас мало наблюдений так что попробуйте явно установить минимальные / максимальные значения порядка для различных процессов ARIMA. ИМО, это вообще хорошая практика. В вашем случае мы можем сделать

    fit = auto_arima(
        observations,
        start_p = 0, start_q = 0, start_P = 0, start_Q = 0,
        max_p = 3, max_q = 3, max_P = 3, max_Q = 3,
        D = 1, max_D = 2, m = 12,
        seasonal = True,
        error_action = 'ignore')
    

    Здесь мы рассмотрим процессы вплоть до MA (3) и AR (3), а также SMA (3) и SAR (3).

  3. Давайте визуализируем исходные данные временного ряда, включая прогноз

    n_ahead = 10
    preds, conf_int = fit.predict(n_periods = n_ahead, return_conf_int = True)
    xrange = pd.date_range(min(datelist), periods = 24 + n_ahead, freq = 'MS')
    
    import matplotlib.pyplot as plt
    import matplotlib.dates as dates
    
    fig = plt.figure()
    plt.plot(xrange[:df.shape[0]], df["sales"])
    plt.plot(xrange[df.shape[0]:], preds)
    plt.fill_between(
        xrange[df.shape[0]:],
        conf_int[:, 0], conf_int[:, 1],
        alpha = 0.1, color = 'b')
    plt.show()
    

    enter image description here

...