Невозможно реализовать метод Holt-Winters с использованием библиотеки statsmodels - PullRequest
0 голосов
/ 15 мая 2018

У меня есть данные за один месяц, которые поступают ежедневно. Он собирает cpu utilization данных каждый день. Я хочу получить некоторые прогнозные результаты. Я разделил данные на две части train - что занимает сначала 15 дней и test, что занимает последние 16 дней, и на этом я хочу сделать прогноз и сравнить результат прогноза с данным последним результатом 16 дней.До сих пор я пробовал различные реализации, такие как moving average, simple exponential smoothing. Теперь я хочу попробовать что-то более сложное и точное, такое как Holt-Winters Method и ARIMA model. Ниже приведен результат, который я получаю для Holt's Linear Trend метода, который принимаетс учетом тренда и сезонности.

enter image description here

Теперь я хочу внедрить Holts Winter method, который является одним из предпочтительных методов прогнозирования. Вот код ниже

# get the first 15 days
df_train = psql.read_sql("SELECT date,cpu FROM {} where date between '{}' and '{} 23:59:59';".format(conf_list[1], '2018-03-02', '2018-03-16'), conn).fillna(0)
df_train["date"] = pd.to_datetime(df_train["date"], format="%m-%d-%Y")
df_train.set_index("date", inplace=True)
df_train = df_train.resample('D').mean().fillna(0)

# get the last 15 days
df_test = psql.read_sql("SELECT date,cpu FROM {} where date between '{}' and '{} 23:59:59';".format(conf_list[1], '2018-03-18', '2018-03-31'), conn).fillna(0)
df_test["date"] = pd.to_datetime(df_test["date"], format="%m-%d-%Y")
df_test.set_index("date", inplace=True)
df_test = df_test.resample('D').mean().fillna(0)

Вот код для Holt's Winter method

y_hat_avg = df_test.copy()
fit1 = ExponentialSmoothing(np.asarray(df_train['cpu']), seasonal_periods=1, trend='add', seasonal='add',).fit()
y_hat_avg['Holt_Winter'] = fit1.forecast(len(df_test))
plt.figure(figsize=(16,8))
plt.plot(df_train['cpu'], label='Train')
plt.plot(df_test['cpu'], label='Test')
plt.plot(y_hat_avg['Holt_Winter'], label='Holt_Winter')
plt.legend(loc='best')
plt.show()

Теперь я получаю сообщение об ошибке для параметра seasonal_periods. Он принимает целое число, и я считаю, что он принимает месяц какvalue.Even в своей документации, они относятся только ккак нет времен года http://www.statsmodels.org/dev/generated/statsmodels.tsa.holtwinters.ExponentialSmoothing.html#statsmodels.tsa.holtwinters.ExponentialSmoothing

Теперь, поскольку у меня есть только 1 месяц данных, из которых я хочу запустить прогноз на первые 15 дней, какое значение сезона должно бытьЯ передаю? Предполагая, что времена года относятся к месяцам, в идеале это должно быть 0,5 (15 дней), но оно принимает только целые числа. Если я передаю значение как 1 , я получаю ошибку ниже

Traceback (most recent call last):
  File "/home/souvik/PycharmProjects/Pandas/forecast_health.py", line 89, in <module>
    fit1 = ExponentialSmoothing(np.asarray(df_train['cpu']), seasonal_periods=1, trend='add', seasonal='add',).fit()
  File "/home/souvik/data_analysis/lib/python3.5/site-packages/statsmodels/tsa/holtwinters.py", line 571, in fit
    Ns=20, full_output=True, finish=None)
  File "/home/souvik/data_analysis/lib/python3.5/site-packages/scipy/optimize/optimize.py", line 2831, in brute
    Jout = vecfunc(*grid)
  File "/home/souvik/data_analysis/lib/python3.5/site-packages/numpy/lib/function_base.py", line 2755, in __call__
    return self._vectorize_call(func=func, args=vargs)
  File "/home/souvik/data_analysis/lib/python3.5/site-packages/numpy/lib/function_base.py", line 2831, in _vectorize_call
    outputs = ufunc(*inputs)
  File "/home/souvik/data_analysis/lib/python3.5/site-packages/scipy/optimize/optimize.py", line 2825, in _scalarfunc
    return func(params, *args)
  File "/home/souvik/data_analysis/lib/python3.5/site-packages/statsmodels/tsa/holtwinters.py", line 207, in _holt_win_add_add_dam
    return sqeuclidean((l + phi * b) + s[:-(m - 1)], y)
ValueError: operands could not be broadcast together with shapes (16,) (0,)

Если я передам параметр как None, я получу следующую ошибку

Traceback (most recent call last):
  File "/home/souvik/PycharmProjects/Pandas/forecast_health.py", line 89, in <module>
    fit1 = ExponentialSmoothing(np.asarray(df_train['cpu']), seasonal_periods=None, trend='add', seasonal='add',).fit()
  File "/home/souvik/data_analysis/lib/python3.5/site-packages/statsmodels/tsa/holtwinters.py", line 399, in __init__
    'Unable to detect season automatically')
NotImplementedError: Unable to detect season automatically

Как получить прогноз на последние 16 днеймесяца методом Холт-Уинтерса? Что я делаю не так?

Вот данные за месяц, если кто-то захочет воспроизвести результаты

                                cpu
date                               
2018-03-01 00:00:00+00:00  1.060606
2018-03-02 00:00:00+00:00  1.014035
2018-03-03 00:00:00+00:00  1.048611
2018-03-04 00:00:00+00:00  1.493392
2018-03-05 00:00:00+00:00  3.588957
2018-03-06 00:00:00+00:00  2.500000
2018-03-07 00:00:00+00:00  5.265306
2018-03-08 00:00:00+00:00  0.000000
2018-03-09 00:00:00+00:00  3.062099
2018-03-10 00:00:00+00:00  5.861751
2018-03-11 00:00:00+00:00  0.000000
2018-03-12 00:00:00+00:00  0.000000
2018-03-13 00:00:00+00:00  7.235294
2018-03-14 00:00:00+00:00  4.011662
2018-03-15 00:00:00+00:00  3.777409
2018-03-16 00:00:00+00:00  5.754559
2018-03-17 00:00:00+00:00  4.273390
2018-03-18 00:00:00+00:00  2.328782
2018-03-19 00:00:00+00:00  3.106048
2018-03-20 00:00:00+00:00  5.584877
2018-03-21 00:00:00+00:00  9.869841
2018-03-22 00:00:00+00:00  5.588215
2018-03-23 00:00:00+00:00  3.620377
2018-03-24 00:00:00+00:00  3.468021
2018-03-25 00:00:00+00:00  2.605649
2018-03-26 00:00:00+00:00  3.670559
2018-03-27 00:00:00+00:00  4.071777
2018-03-28 00:00:00+00:00  4.159690
2018-03-29 00:00:00+00:00  4.364939
2018-03-30 00:00:00+00:00  4.743253
2018-03-31 00:00:00+00:00  4.928571

1 Ответ

0 голосов
/ 15 мая 2018

Прежде всего, появляется ошибка NotImplementedError: Unable to detect season automatically, потому что вы определили seasonal_periods как None, и все же у вас все еще есть параметр seasonal как add, вы должны изменить его на None.

Если ваши данные имеют месячную сезонность, и у вас есть только один месяц, то, возможно, вы вообще не имеете сезонности в своей выборке. Но если вы хотите, вы можете проверить это, построив преобразование данных Фурье в поисках сезонности .

Кроме того, я верю, что для прогнозирования (в примере, как я вижу из вашего примера), если вы используете Statsmodels, то лучше использовать predict InSad forecast, они дают разные результаты во многих случаях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...