Вне выборочной проблемы прогнозирования с SARIMAX - PullRequest
0 голосов
/ 14 декабря 2018

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

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()

Так выглядит график

enter image description here

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

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 Ответ

0 голосов
/ 27 декабря 2018

Чтобы выполнить прогнозирование с использованием дат, ваш индекс должен быть 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)
...