【Python】Warningを非表示にする
プログラムでErrorは対応しないとプログラムが動作しないため、対応必須ですが、Warningは対応しなくても動作します。
Warningも対応できるならした方がいいですが、中にはライブラリが更新されてないことが原因でライブラリを使う側にはどうしようもないワーニングもあったりします。
そういう時は、Warningを垂れ流し続けるか、非表示にするしかありません。
ログファイル等に出力した時に邪魔でなければいいのですが、大抵の場合はいらないメッセージは出力したくないです。
そういう不要なWarningを非表示にする方法を説明します。
Warning個別にフィルタリングする
Warning生成
以下のようにseabornでグラフを作成すると、FutureWarningが出力されます。
1import pandas as pd
2import matplotlib.pyplot as plt
3import japanize_matplotlib
4import seaborn as sns
5
6
7plt.figure(figsize=(8, 4.5))
8data = df
9x = 'day'
10y = 'total_bill'
11hue = 'sex'
12
13sns.barplot(data=data, x=x, y=y, hue=hue)
14plt.tight_layout()
15plt.show()
出力されるWarning
1# 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
2# if pd.api.types.is_categorical_dtype(vector):
3
4# 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.
5# grouped_vals = vals.groupby(grouper)
ライブラリのバージョンにもよりますが、Pandasもseabornも最新バージョンにしている状態でグラフを書こうとしたりすると、上記のようにFutureWarningが出力されます。
これは、SeabornからPandasを参照しているのですが、その参照しているPandasのAPIが将来的には廃止される予定なので使わないでねというワーニングです。
seabornを最新版に更新しても(そもそも更新されていないが)このワーニングは消えないため、ユーザーにはどうしようもありません。
今回は上記のFutureWarningを非表示にしていきます。
Warningのフィルタリング
warnings.filterwarnings()でワーニングのフィルター設定が可能です。
1import warnings
2
3# 特定の警告を非表示にする
4warnings.filterwarnings("ignore", category=FutureWarning,
5 module="seaborn._oldcore", lineno=1498)
6# 以下のワーニングが無視されるようになる
7# 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
8# if pd.api.types.is_categorical_dtype(vector):
上記の指定で、seaborn._oldcore
モジュールの1498行目から出力されるFutureWarning
を無視、つまり非表示にできます。
Warningの情報はメッセージの中に記載されているため、filterwarnings()にそれらの情報を設定していくだけです。
linenoを設定しない場合
1warnings.filterwarnings("ignore", category=FutureWarning,
2 module="seaborn._oldcore")
linenoを指定しない、もしくは0を指定する場合、全ての行に一致することになります。つまり、seaborn._oldcore
から出力されるFutureWarning全てを無視することになります。
moduleを設定しない場合
1warnings.filterwarnings("ignore", category=FutureWarning)
これはモジュールやメッセージに限らず、全てのFutureWarningを無視することになります。
FutureWarningの中には、自分でも対応可能なものが出力される場合もあるため、全てのFutureWarningを無視するのはあまりお勧めしません。
filterwarningsで設定できる内容
warnings.filterwarnings()
ではフィルタリング方法を色々指定できます。正規表現も使えます。
action
Warningに対して取るべきアクションを指定します。
ignore
は警告を無視し、error
は警告を例外として扱い、default
は通常通りに警告を表示します。
message
フィルタリングする警告メッセージのテキストに一致するかどうかを指定します。正規表現での指定が可能です。
1import warnings
2import re
3
4# numpyまたはscipyからの警告を無視する
5warnings.filterwarnings(action='ignore', module='(numpy|scipy)')
1# 'my_package_' で始まる任意のモジュールからの警告を無視する
2warnings.filterwarnings(action='ignore', module='my_package_.*')
category
フィルタリングする警告のカテゴリーを指定します。FutureWarning
、DeprecationWarning
などです。
module
警告を出しているモジュールの名前を指定します。正規表現で指定できます。
lineno
警告が発生する特定のコード行を指定します。
0を指定すると全ての行に一致することになります。
まとめ
1# 特定の警告を非表示にする
2warnings.filterwarnings("ignore", category=FutureWarning,
3 module="seaborn._oldcore", lineno=1498)
4# 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
5# if pd.api.types.is_categorical_dtype(vector):