Иерархическое прогнозирование в python с помощью scikit-hts приводит к ошибке недопустимой частоты
Я работаю с scikit-hts. Вот некоторый код с небольшим df и иерархией для начала (после pip install scikit-hts[auto_arima]:
import hts
import pandas as pd
hierarchy_df = hierarchy_df_test = pd.DataFrame({'date':['1998-01-01', '1998-02-01', '1998-03-01', '1998-04-01', '1998-05-01', '1998-06-01', '1998-07-01', '1998-08-01', '1998-09-01', '1998-10-01', '1998-11-01', '1998-12-01', '1999-01-01', '1999-02-01'], 'total': [21, 40, 31, 21, 29, 40, 30, 21, 24, 30, 40, 22, 32, 32], 'A':[10,20,15,10,14,20,16,10,12,16,20,10,18,16], 'B':[11,20,16,11,15,20,14,11,12,14,20,12,14,16]})
hierarchy = {'total': ['A', 'B']}
Я хочу преобразовать даты в объект даты и времени, поэтому я запускаю
hierarchy_df['date'] = pd.to_datetime(hierarchy_df['date'], format='%Y-%m-%d')
Теперь я подгоняю модель с auto_arima и 'OLS' в качестве метода ревизии:
model_ols_arima = hts.HTSRegressor(model='auto_arima', revision_method='OLS', n_jobs=0)
model_ols_arima = model_ols_arima.fit(hierarchy_df, hierarchy)
Все идет гладко, пока я не попытаюсь предсказать:
pred_ols_arima = model_ols_arima.predict(steps_ahead=4)
В этот момент я получаю «ValueError: Invalid Frequency: 1».
Вот полная ошибка:
TypeError Traceback (most recent call last)
/local_disk0/.ephemeral_nfs/envs/pythonEnv-a9bf3a0d-a93e-453d-890b-d123f282d710/lib/python3.8/site-packages/hts/core/regressor.py in _get_predict_index(self, steps_ahead)
369 try:
--> 370 start = self.nodes.item.index[-1] + timedelta(freq)
371 end = self.nodes.item.index[-1] + timedelta(steps_ahead * freq)
TypeError: unsupported operand type(s) for +: 'int' and 'datetime.timedelta'
During handling of the above exception, another exception occurred:
ValueError Traceback (most recent call last)
<command-2268273946901309> in <module>
----> 1 pred_ols_arima = model_ols_arima.predict(steps_ahead=4)
/local_disk0/.ephemeral_nfs/envs/pythonEnv-a9bf3a0d-a93e-453d-890b-d123f282d710/lib/python3.8/site-packages/hts/core/regressor.py in predict(self, exogenous_df, steps_ahead, distributor, disable_progressbar, show_warnings, **predict_kwargs)
350 self.hts_result.errors = (key, error)
351 self.hts_result.residuals = (key, residual)
--> 352 return self._revise(steps_ahead=steps_ahead)
353
354 def _revise(self, steps_ahead: int = 1) -> pandas.DataFrame:
/local_disk0/.ephemeral_nfs/envs/pythonEnv-a9bf3a0d-a93e-453d-890b-d123f282d710/lib/python3.8/site-packages/hts/core/regressor.py in _revise(self, steps_ahead)
361
362 revised_columns = list(make_iterable(self.nodes))
--> 363 revised_index = self._get_predict_index(steps_ahead=steps_ahead)
364 return pandas.DataFrame(revised, index=revised_index, columns=revised_columns)
365
/local_disk0/.ephemeral_nfs/envs/pythonEnv-a9bf3a0d-a93e-453d-890b-d123f282d710/lib/python3.8/site-packages/hts/core/regressor.py in _get_predict_index(self, steps_ahead)
374 start = self.nodes.item.index[-1] + freq
375 end = self.nodes.item.index[-1] + (steps_ahead * freq)
--> 376 future = pandas.date_range(freq=freq, start=start, end=end)
377
378 return self.nodes.item.index.append(future)
/databricks/python/lib/python3.8/site-packages/pandas/core/indexes/datetimes.py in date_range(start, end, periods, freq, tz, normalize, name, closed, **kwargs)
1067 freq = "D"
1068
-> 1069 dtarr = DatetimeArray._generate_range(
1070 start=start,
1071 end=end,
/databricks/python/lib/python3.8/site-packages/pandas/core/arrays/datetimes.py in _generate_range(cls, start, end, periods, freq, tz, normalize, ambiguous, nonexistent, closed)
375 "and freq, exactly three must be specified"
376 )
--> 377 freq = to_offset(freq)
378
379 if start is not None:
pandas/_libs/tslibs/offsets.pyx in pandas._libs.tslibs.offsets.to_offset()
pandas/_libs/tslibs/offsets.pyx in pandas._libs.tslibs.offsets.to_offset()
ValueError: Invalid frequency: 1
Я провел некоторое исследование, и кажется, что проблема заключается в частоте дат, но я не могу решить эту проблему. Этот туториал делает примерно то же самое (с большим набором данных), но без ошибки. Любая помощь приветствуется. Спасибо!