ловить предупреждения от numpy и scipy с попыткой, кроме - PullRequest
2 голосов
/ 08 ноября 2019

Я подгоняю модель 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 каждая итерация цикла?

  1. соответствует модели
  2. фиксирует все предупреждения, которые были выданы, чтобы я мог записать их в переменную или фрейм данных.

1 Ответ

0 голосов
/ 08 ноября 2019

Одна проблема заключается в следующем:

"В некоторых итерациях цикла, но не во всех, statsmodels вызывает ConvergenceWarning или RuntimeWarning, и я хочу перехватить эти предупреждения и записать их в результирующий кадр данных рядом спрогноз. "

Вы не можете захватить прогноз, который выдал ошибку, ошибка была выводом функции. Вы можете сохранить прогнозы до момента возникновения ошибки. Вы должны решить, что вы хотите сделать с вашей моделью после того, как она выдаст такую ​​ошибку. Вы можете использовать продолжить, как сказал @ALollz, или перейти к следующей группе, которую хотите добавить, но это решение, которое вам нужно принять. Мы не можем решить, что для вас это выбор дизайна, если вы отказались от набора, в результате которого возникла ошибка во время примерки, или решили продолжить.

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