#python #python-3.x #warnings #arch
#python #python-3.x #предупреждения #arch
Вопрос:
Я подгоняю модели GARCH по данным с тысяч датчиков на каждый день месяца, используя пакет ARCH. Я знаю, что все данные не являются чистыми, и модель может не сходиться для некоторых датчиков, и я согласен с этим. Я планирую разобраться с ними для каждого датчика позже.
Моя проблема в том, как Python обрабатывает предупреждения. Согласно документации по предупреждениям:
Концептуально фильтр предупреждений поддерживает упорядоченный список спецификаций фильтров; любое конкретное предупреждение сопоставляется с каждой спецификацией фильтра в списке по очереди, пока не будет найдено совпадение; совпадение определяет расположение совпадения.
Что в основном означает, что
warnings.simplefilter('ignore')
будут добавлены в начало списка.
Однако в пакете ARCH в /arch/base.py , строка 507 гласит::
warnings.simplefilter('always')
который, по сути, добавляется 'always'
к началу фильтра предупреждений каждый раз, когда выполняется вызов метода подгонки модели ARCH. Это гарантирует, что предупреждение всегда отображается, потому что я могу добавлять только 'ignore'
в начало списка либо до, либо после выполнения вызова .fit()
(который будет переопределен 'always'
при следующем вызове. Поскольку моя проблема связана с тысячами датчиков, она выводит тысячи предупреждений, которые замедляют сканирование ноутбука Jupyter.
Есть ли способ игнорировать предупреждения при любых условиях? Например, суперфильтр для предупреждений был бы отличным.
Комментарии:
1. Очень жаль, что они сбрасывают фильтр при каждом вызове. Вы можете перехватить
warn
функциюwarnings
модуля, но это некрасиво.2. @rubik, я не знаю как… И опять же, они импортируются
warnings
при каждом вызове, поэтому, если я не изменю исходный код, я не вижу, какwarn
поможет захват функции в моем коде.3. Модуль импортируется только один раз, а затем сохраняется
sys.modules
. Я изложу решение в ответе.4. (Не связано с вопросом): Не могли бы вы добавить какую-то выдержку из тега в arch?
5. @Makoto, я сделал… Он проверяется. Есть ли способ ускорить процесс проверки?
Ответ №1:
Они каждый раз сбрасывают фильтр, поэтому я не вижу никаких других решений, кроме захвата warn
функции.
Когда вы импортируете модуль Python, он сохраняется в словаре sys.modules
для последующего использования. Поэтому достаточно импортировать warnings
модуль один раз и перед пакетом ARCH:
import warnings
warnings.warn = lambda *a, **kw: False
# do stuff which might trigger warnings
Я признаю, что это уродливое решение. Но в качестве быстрого взлома он должен служить своей цели.
В качестве долгосрочного решения я бы посоветовал вам открыть PR и объяснить вашу ситуацию. Простое добавление аргумента в функцию, чтобы решить, выдавать предупреждения или нет, кажется мне хорошей идеей.
Комментарии:
1. Пожалуйста, попробуйте это решение и сообщите об этом. Я попробовал это с некоторыми специальными файлами, и это сработало, но может случиться так, что пакет ARCH выполняет дополнительные хитрости с предупреждениями. Это решение защищает только от вызовов
warnings.warn
.2. Спасибо. Я успешно попробовал. Я отмечу это как ответ. Я открыл проблему с пакетом ARCH на GH. Надеюсь, они скоро доберутся до этого.