Python

【Python】Warningを非表示にする

MAX

プログラムでErrorは対応しないとプログラムが動作しないため、対応必須ですが、Warningは対応しなくても動作します。

Warningも対応できるならした方がいいですが、中にはライブラリが更新されてないことが原因でライブラリを使う側にはどうしようもないワーニングもあったりします。

そういう時は、Warningを垂れ流し続けるか、非表示にするしかありません。

ログファイル等に出力した時に邪魔でなければいいのですが、大抵の場合はいらないメッセージは出力したくないです。

そういう不要なWarningを非表示にする方法を説明します。

スポンサーリンク

Warning個別にフィルタリングする

Warning生成

以下のようにseabornでグラフを作成すると、FutureWarningが出力されます。

import pandas as pd
import matplotlib.pyplot as plt
import japanize_matplotlib
import seaborn as sns


plt.figure(figsize=(8, 4.5))
data = df
x = 'day'
y = 'total_bill'
hue = 'sex'

sns.barplot(data=data, x=x, y=y, hue=hue)
plt.tight_layout()
plt.show()

出力されるWarning

# D:\work\venv310\lib\site-packages\seaborn\_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead
#   if pd.api.types.is_categorical_dtype(vector):

# D:\work\venv310\lib\site-packages\seaborn\categorical.py:641: FutureWarning: The default of observed=False is deprecated and will be changed to True in a future version of pandas. Pass observed=False to retain current behavior or observed=True to adopt the future default and silence this warning.
#   grouped_vals = vals.groupby(grouper)

ライブラリのバージョンにもよりますが、Pandasもseabornも最新バージョンにしている状態でグラフを書こうとしたりすると、上記のようにFutureWarningが出力されます。

これは、SeabornからPandasを参照しているのですが、その参照しているPandasのAPIが将来的には廃止される予定なので使わないでねというワーニングです。

seabornを最新版に更新しても(そもそも更新されていないが)このワーニングは消えないため、ユーザーにはどうしようもありません。

今回は上記のFutureWarningを非表示にしていきます。

Warningのフィルタリング

warnings.filterwarnings()でワーニングのフィルター設定が可能です。

import warnings

# 特定の警告を非表示にする
warnings.filterwarnings("ignore", category=FutureWarning, 
                        module="seaborn._oldcore", lineno=1498)
# 以下のワーニングが無視されるようになる
# D:\work\venv310\lib\site-packages\seaborn\_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead
#   if pd.api.types.is_categorical_dtype(vector):

上記の指定で、seaborn._oldcoreモジュールの1498行目から出力されるFutureWarningを無視、つまり非表示にできます。

Warningの情報はメッセージの中に記載されているため、filterwarnings()にそれらの情報を設定していくだけです。

linenoを設定しない場合

warnings.filterwarnings("ignore", category=FutureWarning, 
                        module="seaborn._oldcore")

linenoを指定しない、もしくは0を指定する場合、全ての行に一致することになります。つまり、seaborn._oldcoreから出力されるFutureWarning全てを無視することになります。

moduleを設定しない場合

warnings.filterwarnings("ignore", category=FutureWarning)

これはモジュールやメッセージに限らず、全てのFutureWarningを無視することになります。

FutureWarningの中には、自分でも対応可能なものが出力される場合もあるため、全てのFutureWarningを無視するのはあまりお勧めしません。

filterwarningsで設定できる内容

warnings.filterwarnings()ではフィルタリング方法を色々指定できます。正規表現も使えます。

action

Warningに対して取るべきアクションを指定します。

ignoreは警告を無視し、errorは警告を例外として扱い、defaultは通常通りに警告を表示します。

message

フィルタリングする警告メッセージのテキストに一致するかどうかを指定します。正規表現での指定が可能です。

import warnings
import re

# numpyまたはscipyからの警告を無視する
warnings.filterwarnings(action='ignore', module='(numpy|scipy)')
# 'my_package_' で始まる任意のモジュールからの警告を無視する
warnings.filterwarnings(action='ignore', module='my_package_.*')

category

フィルタリングする警告のカテゴリーを指定します。FutureWarningDeprecationWarningなどです。

module

警告を出しているモジュールの名前を指定します。正規表現で指定できます。

lineno

警告が発生する特定のコード行を指定します。

0を指定すると全ての行に一致することになります。

まとめ

# 特定の警告を非表示にする
warnings.filterwarnings("ignore", category=FutureWarning, 
                        module="seaborn._oldcore", lineno=1498)
# D:\work\venv310\lib\site-packages\seaborn\_oldcore.py:1498: FutureWarning: is_categorical_dtype is deprecated and will be removed in a future version. Use isinstance(dtype, CategoricalDtype) instead
#   if pd.api.types.is_categorical_dtype(vector):
スポンサーリンク
ABOUT ME
MAX
MAX
ITエンジニア、データサイエンティスト
新卒でSIerに入社し、フリーランスになってWEB系へ転向。
その後AIの世界へ足を踏み入れ、正社員に戻る。 テーブルデータの分析がメイン。
スポンサーリンク
記事URLをコピーしました