2016-10-12 101 views
0

对于使用ARCH package的月份中的每一天中的数千个传感器,我正在拟合GARCH模型。我知道所有的数据都不干净,并且模型可能并不适合某些传感器,我对此表示满意。我打算以后每传感器基础上处理它们。模块覆盖过滤器列表时的过滤器警告

我的问题是Python处理警告的方式。由于每Warnings documentation

概念,警告过滤器维护的过滤器 规范有序列表;任何特定警告依次与列表中的每个过滤器 规范进行匹配,直到找到匹配;比赛 决定比赛的处置。

这基本上意味着

warnings.simplefilter('ignore') 

将被添加到列表的头部。

然而,在ARCH package,在/arch/base.pyline 507读取:

warnings.simplefilter('always') 

这在本质上追加'always'到警告的开始一个呼叫到ARCH的模型拟合方法制备每次进行过滤。这可确保始终显示警告,因为我只能在拨打电话.fit()(在下一次呼叫中将被'always'覆盖)之前或之后,将'ignore'添加到清单的头部。由于我的问题涉及数千个传感器,打印数千警告其缓慢的Jupyter笔记本爬行。

有没有办法忽略所有条件下的警告?像警告超级过滤器将是巨大的。

+0

非常不幸的是,他们在每次通话时都重置了过滤器。你可以劫持'warnings'模块的'warn'函数,但这很丑陋。 – rubik

+0

@rubik,我不知道如何...然后再次,他们在每次调用时都会导入'warnings',所以除非我更改源代码,否则我不会看到如何劫持代码中的'warn'函数有助于。 – Kartik

+0

模块只导入一次,然后存储在'sys.modules'中。我将在答案中概述解决方案。 – rubik

回答

1

他们每次都重新设置过滤网,所以我没有看到任何其他的解决方案,而不是劫持warn函数。当您导入Python模块时,它将被存储在字典sys.modules中供以后使用。因此,有足够的导入warnings模块一次,ARCH软件包之前:

import warnings 
warnings.warn = lambda *a, **kw: False 

# do stuff which might trigger warnings 

这是一个丑陋的解决方案,我承认。但作为一个快速入侵它应该达到其目的。


作为一个长期的解决方案,我建议你打开一个PR并解释你的情况。给函数添加一个参数来决定是否发出警告似乎对我来说是个好主意。

+0

请尝试此解决方案并回报。我用一些临时文件尝试了它,它可以工作,但它可能是ARCH包做了额外的诡计和警告。这个解决方案只能防止对'warnings.warn'的调用。 – rubik

+0

谢谢。我试了成功。我会将其标记为答案。我在GH上用ARCH软件包打开了一个[Issue](https://github.com/bashtage/arch/issues/124)。希望他们能很快得到它。 – Kartik