Como suprimir o aviso do Pandas Future?

118

Quando eu executo o programa, o Pandas sempre dá 'Aviso do futuro' como mostrado abaixo.

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) 

Recebi a mensagem, mas só quero impedir que o Pandas mostre essa mensagem repetidamente. Existe algum parâmetro de construção que eu possa definir para permitir que o Pandas não exiba o 'Aviso do futuro'?

Grande erro
fonte

Respostas:

265

Encontrei isso no github ...

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

import pandas
bdiamante
fonte
28
nb: colocar o warnings....ignore antes de o import pandas...fazer com que o FutureWarningser ignorado.
Michael
18

A resposta de @bdiamante pode ajudá-lo apenas parcialmente. Se você ainda receber uma mensagem depois de suprimir os avisos, é porque a pandasprópria biblioteca está imprimindo a mensagem. Não há muito que você possa fazer a menos que você mesmo edite o código-fonte do Pandas. Talvez haja uma opção internamente para suprimi-los, ou uma maneira de substituir as coisas, mas não consegui encontrar uma.


Pra quem precisa saber porque ...

Suponha que você queira garantir um ambiente de trabalho limpo. No topo do seu script, você coloca pd.reset_option('all'). Com o Pandas 0.23.4, você obtém o seguinte:

>>> 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)

>>>

Seguindo o conselho de @bdiamante, você usa a warningsbiblioteca. Agora, fiel a sua palavra, os avisos foram removidos. No entanto, várias mensagens incômodas permanecem:

>>> 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.

>>>

Na verdade, a desativação de todos os avisos produz a mesma saída:

>>> 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.

>>>

No sentido da biblioteca padrão, esses não são avisos verdadeiros . O Pandas implementa seu próprio sistema de avisos. A execução grep -rndas mensagens de aviso mostra que o pandassistema de aviso é implementado em 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

Perseguir mais mostra que não tenho tempo para isso. E provavelmente você também não. Espero que isso evite que você caia na toca do coelho ou talvez inspire alguém a descobrir como realmente suprimir essas mensagens!

Lorem Ipsum
fonte
7

Os avisos são irritantes. Conforme mencionado em outras respostas, você pode suprimi-los usando:

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

Mas se você quiser manipulá-los um por um e estiver gerenciando uma base de código maior, será difícil encontrar a linha de código que está causando o aviso. Já que avisos, ao contrário de erros, não vêm com rastreamento de código. Para rastrear avisos como erros, você pode escrever isso na parte superior do código:

import warnings
warnings.filterwarnings("error")

Mas se a base de código for maior e estiver importando várias outras bibliotecas / pacotes, todos os tipos de avisos começarão a ser gerados como erros. Para gerar apenas certos tipos de avisos (no seu caso, FutureWarning) como erro, você pode escrever:

import warnings
warnings.simplefilter(action='error', category=FutureWarning)
Alok Nayak
fonte