Я подгоняю модель ExponentialSmoothing из statsmodels с версией 0.10.1 (statsmodels.tsa.holtwinters.ExponentialSmoothing) - я должен делать это многократно для групп в объекте pandas groupby, но суть в том, что я перебираюнаборы данных для соответствия новой модели каждой группе данных.
На некоторых итерациях цикла, но не во всех, statsmodels вызывает ConvergenceWarning или RuntimeWarning, и я хочу записать эти предупреждения и записать их вФрейм данных результата рядом с прогнозом.
Я попытался использовать менеджер контекста предупреждений, чтобы я мог выдавать предупреждения, как будто они являются исключениями, и добавил блоки try / Кроме
Проблема с этимПодход заключается в том, что если одно из этих предупреждений будет перехвачено, модель на самом деле не подходит, потому что блок try пропускается, и, что хуже всего, я в конечном итоге прогнозирую использование соответствия модели на предыдущей итерации.
import pandas as pd
from statsmodels.tsa.holtwinters import ExponentialSmoothing, HoltWintersResults
from statsmodels.tools.sm_exceptions import ConvergenceWarning
import numpy as np
from loguru import logger
concat_region_keys = []
forecast_result_dfs = []
region_df_groups = deseasonalized_search_counts \
.sort_index() \
.groupby('region_id') \
['region_deseasonalized_observations']
with warnings.catch_warnings():
warnings.simplefilter("error")
for i, (region_id, df_region_group) in enumerate(region7_df_groups):
concat_region_keys.append(region_id)
region_guard_rail = df_region_group.iloc[-1] # most recent observation
err_msg = np.nan
try:
holt_winters_result_object = ExponentialSmoothing(endog=df_region_group).fit()
except ConvergenceWarning as ce:
logger.warning(f"{i} region {region_id}: ConvergenceWarning {ce}")
err_msg = f"ConvergenceWarning: {ce}"
except RuntimeWarning as re:
logger.warning(f"{i} region {region_id}: RuntimeWarning {re}")
err_msg = f"RuntimeWarning: {re}"
forecast_result = holt_winters_result_object \
.forecast(periods_ahead) \
.assign(
fit_call_warning=err_msg,
)
forecast_result_dfs.append(forecast_result)
Как правильно, с помощью try / исключением или другой конструкции python, сделать следующееr каждая итерация цикла?
- соответствует модели
- фиксирует все предупреждения, которые были выданы, чтобы я мог записать их в переменную или фрейм данных.