2016-10-12 2 views
0

J'adapte les modèles GARCH aux données de milliers de capteurs, pour chaque jour du mois, en utilisant le ARCH package. Je sais que toutes les données ne sont pas propres, et le modèle pourrait ne pas converger pour certains capteurs, et je suis d'accord avec cela. Je prévois de traiter avec eux par capteur plus tard.Filtrer les avertissements lorsque le module remplace la liste de filtres

Mon problème est la façon dont Python gère les avertissements. Selon le Warnings documentation:

Conceptuellement, le filtre avertissements maintient une liste ordonnée de filtre spécifications; tout avertissement spécifique est comparé à chaque spécification de filtre dans la liste jusqu'à ce qu'une correspondance soit trouvée; le match détermine la disposition de la correspondance.

Ce qui signifie essentiellement que

warnings.simplefilter('ignore') 

sera ajouté à la tête de la liste.

Cependant, dans le ARCH package, dans /arch/base.py, line 507 lit:

warnings.simplefilter('always') 

qui, en substance au 'always' ajoute début des avertissements filtrer chaque fois qu'un appel est fait au modèle méthode d'ajustement de ARCH. Cela garantit que l'avertissement est toujours affiché parce que je peux seulement ajouter 'ignore' à la tête de la liste avant ou après avoir passé un appel à .fit() (ce qui serait remplacé par 'always' dans le prochain appel.Mon problème implique des milliers de capteurs, il imprime des milliers d'avertissements qui ralentissent l'ordinateur portable Jupyter à un vide sanitaire.

est-il possible d'ignorer les avertissements dans toutes les conditions? comme un filtre super pour les avertissements serait génial.

+0

Il est très regrettable qu'ils réinitialisent le filtre à chaque appel. Vous pourriez détourner la fonction 'warn' du module' warnings', mais c'est moche. – rubik

+0

@rubik, je ne sais pas comment ... Et là encore, ils importent des "avertissements" à chaque appel, donc à moins que je change le code source, je ne vois pas comment détourner la fonction 'warn' dans mon code aiderait. – Kartik

+0

Un module est importé une seule fois, puis stocké dans 'sys.modules'. Je vais décrire la solution dans une réponse. – rubik

Répondre

1

Ils réinitialisant le filtre à chaque fois , donc je ne vois pas d'autres solutions que de détourner la fonction warn

Lorsque vous importez un module Python, il est stocké dans le dictionnaire sys.modules pour des utilisations ultérieures. Par conséquent, il suffit d'importer le module warnings une fois avant que le paquet ARCH:

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

# do stuff which might trigger warnings 

C'est une solution laide, je l'avoue. Mais comme un hack rapide, il devrait servir son but. En tant que solution à long terme, je vous conseillerais d'ouvrir un PR et d'expliquer votre situation. Ajouter simplement un argument à la fonction pour décider si émettre des avertissements ou non me semble être une bonne idée.

+0

Veuillez essayer cette solution et rapporter. Je l'ai essayé avec quelques fichiers ad-hoc et cela a fonctionné, mais il se peut que le paquet ARCH fasse des supercheries avec des avertissements. Cette solution ne protège que contre les appels à 'warnings.warn'. – rubik

+0

Merci. Je l'ai essayé avec succès. Je vais marquer ceci comme la réponse. J'ai ouvert un [Problème] (https://github.com/bashtage/arch/issues/124) avec le paquet ARCH sur GH. J'espère qu'ils y arriveront bientôt. – Kartik