Python 使用try-except捕捉来自numpy和scipy的警告
我正在从0.10.1版的statsmodels(statsmodels.tsa.Holtwiners.ExponentialSmoothing)中拟合一个指数平滑模型——我必须在pandas groupby对象中的组上重复这样做,但关键是我正在循环数据集,以便在每组数据上拟合一个新模型 在循环的某些迭代(但不是全部)中,statsmodels会引发ConvergenceWarning或RuntimeWarning,我希望捕获这些警告并将它们记录在预测旁边的结果数据帧中 我尝试使用警告上下文管理器,这样我可以像引发异常一样引发警告,并添加了try/except块 这种方法的问题是,如果捕捉到其中一个警告,则模型实际上并不适合,因为try块被跳过,最糟糕的是,我最终在上一次迭代中使用适合的模型进行预测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,我希望捕获这些警告并将它们记录在预测旁边的结果数据帧中 我尝试使用警告上下文管理器
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构造执行以下操作的正确方法是什么
与语句一起使用
with warnings.catch_warnings():
警告是否会使指数平滑
的结果失效?如果不是,并且您希望同时使用结果和生成的任何警告,则应该从函数返回这两个结果,而不是像异常一样引发它们。你能把指数平滑
的内容也包括进去吗?这似乎是一个很好的例子。因此,您可以根据需要记录错误,然后在except块的末尾添加一个continue
,这样它就可以进入下一个迭代,而不是在不应该预测模型的时候预测模型