0

在使用 pmdarima 库中的 AutoArima 预测时间序列时,我得到“ValueError:零大小数组到没有标识的缩减操作最大值”。

数据的形状是(27,1),训练数据的形状是(24,1)。

数据如下,

YearMnth       Quantity     
2018-10-01       384
2018-11-01       544
2018-12-01      1060
2019-01-01       190
2019-02-01       352
2019-03-01       873
2019-04-01       704
2019-05-01      1266
2019-06-01      1010
2019-07-01       604
2019-08-01       896
2019-09-01       909
2019-10-01      1229
2019-11-01      1515
2019-12-01      1063
2020-01-01      1014
2020-02-01       472
2020-03-01      2000
2020-04-01      1065
2020-05-01      1160
2020-06-01      1524
2020-07-01      1307
2020-08-01      1575
2020-09-01      1561
2020-10-01      2536
2020-11-01      1058
2020-12-01      1770

我认为这可能是因为系列的长度为 27,但我无法更改长度,因为程序中有很多系列,仅更改长度不是正确的做法。

同样对于训练数据,长度为 24,并且 Auto Arima 模型得到了很好的训练。

下面是训练代码:

autoModel = pm.auto_arima(df_train.Quantity, trace=True, error_action='ignore',
                          suppress_warnings=True, seasonal=True, m=12, stepwise=True)
autoModel.fit(df_train.Quantity)
order = autoModel.order

和预测代码:

autoModel = pm.auto_arima(df_series.Quantity, trace=True, error_action='ignore', 
                          suppress_warnings=True, seasonal=True, m=12, stepwise=True)
autoModel.fit(df_series.Quantity)
order = autoModel.order
seasonalOrder = autoModel.seasonal_order
ForecastValues = autoModel.predict(n_periods=6,order=order,seasonal_order=seasonalOrder)

以下是完整的错误信息:

   <ipython-input-137-0d894e08f9e0> in AutoSarima_Forecast(df_series, ForecastWindow)
      1 def AutoSarima_Forecast(df_series,ForecastWindow):
      2     autoModel = pm.auto_arima(df_series.Quantity, trace=True, error_action='ignore', 
----> 3                               suppress_warnings=True, seasonal=True, m=12, stepwise=True)
      4     autoModel.fit(df_series.Quantity)
      5     order = autoModel.order

~/anaconda3/envs/python3/lib/python3.6/site-packages/pmdarima/arima/auto.py in auto_arima(y, X, start_p, d, start_q, max_p, max_d, max_q, start_P, D, start_Q, max_P, max_D, max_Q, max_order, m, seasonal, stationary, information_criterion, alpha, test, seasonal_test, stepwise, n_jobs, start_params, trend, method, maxiter, offset_test_args, seasonal_test_args, suppress_warnings, error_action, trace, random, random_state, n_fits, return_valid_fits, out_of_sample_size, scoring, scoring_args, with_intercept, sarimax_kwargs, **fit_args)
    521     elif D is None:  # we don't have a D yet and we need one (seasonal)
    522         D = nsdiffs(xx, m=m, test=seasonal_test, max_D=max_D,
--> 523                     **seasonal_test_args)
    524 
    525         if D > 0 and X is not None:

~/anaconda3/envs/python3/lib/python3.6/site-packages/pmdarima/arima/utils.py in nsdiffs(x, m, max_D, test, **kwargs)
    121             return D
    122 
--> 123         dodiff = testfunc(x)
    124 
    125     return D

~/anaconda3/envs/python3/lib/python3.6/site-packages/pmdarima/arima/seasonality.py in estimate_seasonal_differencing_term(self, x)
    590 
    591         # Get the critical value for m
--> 592         stat = self._compute_test_statistic(x)
    593         crit_val = self._calc_ocsb_crit_val(self.m)
    594         return int(stat > crit_val)

~/anaconda3/envs/python3/lib/python3.6/site-packages/pmdarima/arima/seasonality.py in _compute_test_statistic(self, x)
    530             for lag_term in range(1, maxlag + 1):  # 1 -> maxlag (incl)
    531                 try:
--> 532                     fit = self._fit_ocsb(x, m, lag_term, maxlag)
    533                     fits.append(fit)
    534                     icvals.append(icfunc(fit))

~/anaconda3/envs/python3/lib/python3.6/site-packages/pmdarima/arima/seasonality.py in _fit_ocsb(x, m, lag, max_lag)
    486         # the linear model's constructor
    487         mf = ylag[:y.shape[0]]
--> 488         ar_fit = sm.OLS(y, add_constant(mf)).fit(method='qr')
    489 
    490         # Create Z4

~/anaconda3/envs/python3/lib/python3.6/site-packages/statsmodels/tools/tools.py in add_constant(data, prepend, has_constant)
    336         raise ValueError('Only implemented for 2-dimensional arrays')
    337 
--> 338     is_nonzero_const = np.ptp(x, axis=0) == 0
    339     is_nonzero_const &= np.all(x != 0.0, axis=0)
    340     if is_nonzero_const.any():

<__array_function__ internals> in ptp(*args, **kwargs)

~/anaconda3/envs/python3/lib/python3.6/site-packages/numpy/core/fromnumeric.py in ptp(a, axis, out, keepdims)
   2579         else:
   2580             return ptp(axis=axis, out=out, **kwargs)
-> 2581     return _methods._ptp(a, axis=axis, out=out, **kwargs)
   2582 
   2583 

~/anaconda3/envs/python3/lib/python3.6/site-packages/numpy/core/_methods.py in _ptp(a, axis, out, keepdims)
    245 def _ptp(a, axis=None, out=None, keepdims=False):
    246     return um.subtract(
--> 247         umr_maximum(a, axis, None, out, keepdims),
    248         umr_minimum(a, axis, None, None, keepdims),
    249         out

ValueError: zero-size array to reduction operation maximum which has no identity

如果只是因为系列的长度而不由 pmdArima 处理,那么解决问题的解决方法应该是什么?

4

0 回答 0