无法使用statsmodels库实现Holt-Winters方法

时间:2018-05-15 08:59:40

标签: python-3.x pandas forecasting statsmodels holtwinters

我每天都有一个月的数据。它每天都会捕获cpu utilization数据。我想生成一些预测结果。我已将数据分成两部分train - 这需要第一个 15 天和test需要最后 16 天,我想做预测并将预测结果与给定的最后进行比较16天天结果。到目前为止,我已经尝试了各种实现,例如moving averagesimple exponential smoothing。现在我想尝试更复杂和准确的内容,例如Holt-Winters Method和{{1下面是我得到ARIMA model方法的结果,它考虑了趋势和季节性。

enter image description here

现在我想实现Holt's Linear Trend这是首选的预测技术之一。这是下面的代码

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() 参数的错误。它接受一个整数,我相信它接受月份作为值。即使在他们的文档中,它们也只是指季节http://www.statsmodels.org/dev/generated/statsmodels.tsa.holtwinters.ExponentialSmoothing.html#statsmodels.tsa.holtwinters.ExponentialSmoothing

现在由于我只有 1 个月的数据,我想在第一个 15 天进行预测,我应该通过什么季节值?假设季节是指几个月,理想情况下应该 0.5 (15天),但它只接受整数。如果我将值传递为 1 ,我会得到以下错误

seasonal_periods

如果我将参数传递给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

如何使用Holt-Winters方法获得一个月的最后 16 天的预测?我做错了什么?

如果有人想要重现结果,这是本月的数据

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

1 个答案:

答案 0 :(得分:0)

首先,错误NotImplementedError: Unable to detect season automatically正在显示,因为您已将seasonal_periods定义为无,但您仍然将参数seasonal定义为add,您应将其更改为无

如果您的数据有月度季节性而且您只有一个月,那么您的样本可能根本没有季节性。但如果您愿意,可以通过在搜索中绘制数据的傅里叶变换来检查它。季节性。

另外,我认为对于预测(在我的示例中看到的样本),如果您使用的是Statsmodels,那么最好使用predict forecast的{​​{1}},它们会产生不同的结果案例。