Come sopprimere l'avviso del futuro di Panda?


118

Quando eseguo il programma, Pandas dà 'Avviso futuro' come sotto ogni volta.

D:\Python\lib\site-packages\pandas\core\frame.py:3581: FutureWarning: rename with inplace=True  will return None from pandas 0.11 onward
  " from pandas 0.11 onward", FutureWarning) 

Ho ricevuto il messaggio, ma voglio solo impedire a Panda di mostrare questo messaggio ancora e ancora, c'è qualche parametro incorporato che posso impostare per consentire a Panda di non far apparire il "Avviso futuro"?

Risposte:


265

Trovato su GitHub ...

import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)

import pandas

28
nb: mettere il warnings....ignore prima il import pandas...per causare il FutureWarningper essere ignorato.
michael

18

La risposta di @ bdiamante potrebbe aiutarti solo parzialmente. Se ricevi ancora un messaggio dopo aver soppresso gli avvisi, è perché la pandaslibreria stessa sta stampando il messaggio. Non c'è molto che puoi fare al riguardo a meno che non modifichi tu stesso il codice sorgente di Panda. Forse esiste un'opzione interna per sopprimerli o un modo per ignorare le cose, ma non sono riuscito a trovarne uno.


Per chi ha bisogno di sapere perché ...

Supponiamo di voler garantire un ambiente di lavoro pulito. In cima al copione, metti pd.reset_option('all'). Con Pandas 0.23.4, ottieni quanto segue:

>>> import pandas as pd
>>> pd.reset_option('all')
html.border has been deprecated, use display.html.border instead
(currently both are identical)

C:\projects\stackoverflow\venv\lib\site-packages\pandas\core\config.py:619: FutureWarning: html.bord
er has been deprecated, use display.html.border instead
(currently both are identical)

  warnings.warn(d.msg, FutureWarning)

: boolean
    use_inf_as_null had been deprecated and will be removed in a future
    version. Use `use_inf_as_na` instead.

C:\projects\stackoverflow\venv\lib\site-packages\pandas\core\config.py:619: FutureWarning:
: boolean
    use_inf_as_null had been deprecated and will be removed in a future
    version. Use `use_inf_as_na` instead.

  warnings.warn(d.msg, FutureWarning)

>>>

Seguendo il consiglio di @ bdiamante, usi la warningslibreria. Ora, fedele alla sua parola, gli avvertimenti sono stati rimossi. Tuttavia, rimangono diversi messaggi fastidiosi:

>>> import warnings
>>> warnings.simplefilter(action='ignore', category=FutureWarning)
>>> import pandas as pd
>>> pd.reset_option('all')
html.border has been deprecated, use display.html.border instead
(currently both are identical)


: boolean
    use_inf_as_null had been deprecated and will be removed in a future
    version. Use `use_inf_as_na` instead.

>>>

Infatti, disabilitando tutti gli avvisi si produce lo stesso output:

>>> import warnings
>>> warnings.simplefilter(action='ignore', category=Warning)
>>> import pandas as pd
>>> pd.reset_option('all')
html.border has been deprecated, use display.html.border instead
(currently both are identical)


: boolean
    use_inf_as_null had been deprecated and will be removed in a future
    version. Use `use_inf_as_na` instead.

>>>

Nel senso della libreria standard, questi non sono veri avvertimenti . Pandas implementa il proprio sistema di avvisi. L'esecuzione grep -rndei messaggi di avviso mostra che il pandassistema di avviso è implementato in core/config_init.py:

$ grep -rn "html.border has been deprecated"
core/config_init.py:207:html.border has been deprecated, use display.html.border instead

Ulteriori inseguimenti dimostrano che non ho tempo per questo. E probabilmente neanche tu. Si spera che questo ti eviti di cadere nella tana del coniglio o forse ispiri qualcuno a capire come sopprimere veramente questi messaggi!


7

Gli avvertimenti sono fastidiosi. Come accennato in altre risposte, puoi sopprimerli usando:

import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)

Ma se vuoi gestirli uno per uno e gestisci una base di codice più grande, sarà difficile trovare la riga di codice che causa l'avviso. Poiché gli avvisi, a differenza degli errori, non vengono forniti con il traceback del codice. Per tracciare avvisi come errori, puoi scrivere questo all'inizio del codice:

import warnings
warnings.filterwarnings("error")

Ma se la base del codice è più grande e sta importando un mucchio di altre librerie / pacchetti, allora tutti i tipi di avvertimenti inizieranno ad essere generati come errori. Per sollevare solo alcuni tipi di avvisi (nel tuo caso, il suo FutureWarning) come errore, puoi scrivere:

import warnings
warnings.simplefilter(action='error', category=FutureWarning)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.