Вне выборочной проблемы прогнозирования с SARIMAX

Я могу делать прогнозы на моих выборочных данных, но когда я пытаюсь сделать из них выборочные прогнозы, я получаю сообщение об ошибке:

C:\Users\YannickLECROART\Miniconda3\envs\machinelearning\lib\site-packages\statsmodels\tsa\base\tsa_model.py:531: ValueWarning: No supported index is available. Prediction results will be given with an integer index beginning at `start`.
  ValueWarning)
<statsmodels.tsa.statespace.mlemodel.PredictionResultsWrapper object at 0x000001F303476A58>

Вы можете найти набор данных, который я использую, нажав на ссылку ниже.

https://ufile.io/an2cx

import warnings
import itertools
import numpy as np
import matplotlib.pyplot as plt
warnings.filterwarnings("ignore")
plt.style.use('fivethirtyeight')
import pandas as pd
import statsmodels.api as sm
import matplotlib

matplotlib.rcParams['axes.labelsize'] = 14
matplotlib.rcParams['xtick.labelsize'] = 12
matplotlib.rcParams['ytick.labelsize'] = 12
matplotlib.rcParams['text.color'] = 'k'

Прежде всего, я извлекаю набор данных из файла Excel.

df = pd.read_excel("C:\\Users\\YannickLECROART\\Desktop\\comedie.xlsx", index_col=0)

Затем я преобразовываю фрейм данных во временной ряд.

df.index = pd.to_datetime(df.index)

Я сортирую данные так, что получаю значения только между 9 и 10 утра.

idx_9 = df.between_time('09:00', '09:59')

Я настраиваю параметры SARIMAX

mod = sm.tsa.statespace.SARIMAX(idx_0,
                                order=(1, 1, 1),
                                seasonal_order=(1, 1, 0, 12),
                                enforce_stationarity=False,
                                enforce_invertibility=False)

results = mod.fit()

Затем я делаю прогнозы на моих выборочных данных, чтобы сравнить их с наблюдаемыми значениями

pred = results.get_prediction(start=1, dynamic=False)
pred_ci = pred.conf_int()

ax = idx_9['2017':].plot(label='Observations')
pred.predicted_mean.plot(ax=ax, label='Prédictions', alpha=.7, figsize=(14, 7))

ax.fill_between(pred_ci.index,
                pred_ci.iloc[:, 0],
                pred_ci.iloc[:, 1], color='k', alpha=.2)

ax.set_xlabel('Date')
ax.set_ylabel('Places occupées')
plt.legend()

plt.show()

Так выглядит сюжет

Наконец, я хочу сделать выборочные прогнозы, чтобы построить их после наблюдений, и вот где я получаю сообщение об ошибке:

pred_uc = results.get_forecast(steps=100)
pred_ci = pred_uc.conf_int()

ax = idx_0.plot(label='Observations', figsize=(14, 7))
pred_uc.predicted_mean.plot(ax=ax, label='Prédictions')
ax.fill_between(pred_ci.index,
                pred_ci.iloc[:, 0],
                pred_ci.iloc[:, 1], color='k', alpha=.25)
ax.set_xlabel('Date')
ax.set_ylabel('Places occupées')
plt.legend()
plt.show()

Не могли бы вы сказать мне, почему я получаю это сообщение об ошибке и как я могу это исправить? Заранее спасибо.

1 ответ

Для прогнозирования с использованием дат ваш индекс должен быть DatetimeIndex или же PeriodIndexс соответствующей частотой, например, месяцы, день, минуты и т. д.

В вашем случае, я полагаю, у вас есть данные за несколько минут каждый день, которые, я думаю, не соответствуют частоте панд. По этой причине он выполняет прогнозирование, он просто не знает, как назначать новые даты прогнозам.

Если вы знаете, как построить индекс даты для прогнозируемого периода, вы можете сделать это и передать его как index аргумент. например

fcast_index = pd.to_datetime(['2017-04-02 9:00am', '2017-04-02 9:00am', ...])
pred_uc = results.get_forecast(steps=100, index=fcast_index)
Другие вопросы по тегам