Конкретно молчащие панды SettingWithCopyWarning с помощью диспетчера контекстов предупреждений? - PullRequest
0 голосов
/ 27 августа 2018

У меня есть политика показа всех предупреждений:

import warnings
warnings.simplefilter('always')

Я бы хотел скрыть некоторые ложноположительные предупреждения Панд с помощью контекстных менеджеров:

with warnings.catch_warnings():
    warnings.filterwarnings('ignore', category=SettingWithCopyWarning)
    # Some assignment raising false positive warning that should be silenced

# Some assignment actually raising a true positive warning

Но после просмотра источника панд я не могу найти, где в пандах определен объект SettingWithCopyWarning.

Кто-нибудь знает, где этот объект определен в пространстве имен Pandas?

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Объединение информации из комментариев в один ответ:

import warnings
import pandas as pd

Как отметил @Andrew, я могу добиться этого с помощью выделенного Pandas Context Manager:

with pd.option_context('mode.chained_assignment', None):
    # Chaining Assignment, etc...

Или используя PSL warnings, при условии, что я могу найти объект предупреждения SettingWithCopyWarning (спасибо @coldspeed за ссылку GitHub):

with warnings.catch_warnings():
    warnings.filterwarnings('ignore', category=pd.core.common.SettingWithCopyWarning)
    # Chaining Assignment, etc...

Обратите внимание, что оба решения ведут себя одинаково, но они не совсем эквивалентны:

  • Pandas Context Manager временно изменяет параметры Pandas и затем восстанавливает его;
  • Диспетчер контекста PSL перехватывает конкретное предупреждение и отключает его без изменения параметров Pandas.

Дополнительная информация

Может быть целесообразно преобразовать это конкретное предупреждение в ошибку:

pd.set_option('mode.chained_assignment', 'raise')

Это заставит вашу разработку избегать этих конкретных крайних случаев и заставит ваш код явно указывать, работает ли он в представлении или только в копии.

Конечно, исключение можно поймать как обычно:

try:
    # Chaining Assignment, etc...
except pd.core.common.SettingWithCopyError:
    pass

Но в этом случае преобразование предупреждения в ошибку, скорее всего, заставит вас изменять неоднозначный код до тех пор, пока ошибка не исчезнет, ​​вместо того, чтобы перехватить соответствующее исключение.

Наблюдение

ИМХО, полностью отключите эти предупреждения, используя:

pd.set_option('mode.chained_assignment', None)

Это плохая практика, и она не помогает создавать лучший код.

0 голосов
/ 27 августа 2018

Следующее должно делать то, что вы ищете:

pd.set_option('mode.chained_assignment', None)

взято из https://www.dataquest.io/blog/settingwithcopywarning/

Однако уделите некоторое время чтению вышеприведенной статьи, поскольку она многое объясняет об этом предупреждении. Возможно, вы не хотите всегда молчать!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...