Python 使用try-except捕捉来自numpy和scipy的警告

Python 使用try-except捕捉来自numpy和scipy的警告,python,pandas,numpy,statsmodels,Python,Pandas,Numpy,Statsmodels,我正在从0.10.1版的statsmodels(statsmodels.tsa.Holtwiners.ExponentialSmoothing)中拟合一个指数平滑模型——我必须在pandas groupby对象中的组上重复这样做,但关键是我正在循环数据集,以便在每组数据上拟合一个新模型 在循环的某些迭代(但不是全部)中,statsmodels会引发ConvergenceWarning或RuntimeWarning,我希望捕获这些警告并将它们记录在预测旁边的结果数据帧中 我尝试使用警告上下文管理器

我正在从0.10.1版的statsmodels(statsmodels.tsa.Holtwiners.ExponentialSmoothing)中拟合一个指数平滑模型——我必须在pandas groupby对象中的组上重复这样做,但关键是我正在循环数据集,以便在每组数据上拟合一个新模型

在循环的某些迭代(但不是全部)中,statsmodels会引发ConvergenceWarning或RuntimeWarning,我希望捕获这些警告并将它们记录在预测旁边的结果数据帧中

我尝试使用警告上下文管理器,这样我可以像引发异常一样引发警告,并添加了try/except块

这种方法的问题是,如果捕捉到其中一个警告,则模型实际上并不适合,因为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/except或其他python构造执行以下操作的正确方法是什么

  • 符合模型
  • 捕获引发的任何警告,以便我可以将它们记录在变量或数据帧中
  • 一个问题是这个

    “在循环的某些迭代(但不是全部迭代)中,statsmodels会引发ConvergenceWarning或RuntimeWarning,我希望捕获这些警告并将它们记录在预测旁边的结果数据帧中。”

    无法捕获引发错误的预测。错误是函数的输出。您可以保存预测,直到出现错误为止。在模型抛出这样的错误后,您需要决定要对其执行什么操作。你可以像@ALollz所说的那样继续,或者你可以进入下一个你想加入的团队,但这是你需要做出的决定。这是一种设计选择,无论是放弃在安装时出现错误的设备,还是决定继续安装,我们都无法为您做出决定。

    查看此网站

    语句一起使用

    with warnings.catch_warnings():
    

    警告是否会使
    指数平滑
    的结果失效?如果不是,并且您希望同时使用结果和生成的任何警告,则应该从函数返回这两个结果,而不是像异常一样引发它们。你能把
    指数平滑
    的内容也包括进去吗?这似乎是一个很好的例子。因此,您可以根据需要记录错误,然后在except块的末尾添加一个
    continue
    ,这样它就可以进入下一个迭代,而不是在不应该预测模型的时候预测模型