Slide 1

Slide 1 text

データフレームのバリデーションを 実現するためのpandera入門 桂川大輝

Slide 2

Slide 2 text

データフレームを使っていますか? ● データフレーム(pandas.DataFrame) ○ 表形式のデータの取り込み、加工、集計、分析に利用 ○ データ分析/機械学習などで活躍 2

Slide 3

Slide 3 text

課題①:意図しない値を格納してしまう 3 0/1/2を期待しているが… 3が格納されている 数値を期待しているが… 文字列が格納されている

Slide 4

Slide 4 text

課題②:他者・未来の自分がコードから内容を読み取れない 4 import pandas as pd from sklearn.datasets import load_iris data = load_iris() iris = pd.DataFrame(data.data, columns=data.feature_names) iris["target"] = data.target iris.head() irisにはどんな情報が 格納されている?

Slide 5

Slide 5 text

課題を解決する“pandera” ● “pandera”とは ○ データフレームのスキーマ(構造)を定義することで データフレームのバリデーションを実現するライブラリ ● 課題①:意図しない値を格納してしまう ○ バリデーションにより意図しない値の格納を防ぐ ● 課題②:他者・未来の自分がコードから内容を読み取れない ○ スキーマを明示的に記述することでコードから内容の読み取りが可能に ※大きく利用方法は2種あるが、今回は“Schema Models”を紹介 5 !pip install pandera

Slide 6

Slide 6 text

panderaの利用例〜アヤメ(iris)のデータセットの準備〜 6 import pandas as pd from sklearn.datasets import load_iris data = load_iris() iris = pd.DataFrame(data.data, columns=data.feature_names) iris["target"] = data.target iris = iris.rename( columns={ "sepal length (cm)": "sepal_length", "sepal width (cm)": "sepal_width", "petal length (cm)": "petal_length", "petal width (cm)": "petal_width", } )

Slide 7

Slide 7 text

panderaの利用例〜データの確認①〜 7 iris.head() 0/1/2(カテゴリ)

Slide 8

Slide 8 text

panderaの利用例〜データの確認②〜 8 iris.describe()

Slide 9

Slide 9 text

import pandera as pa from pandera.typing import Series class IrisSchema(pa.SchemaModel): sepal_length: Series[float] = pa.Field(gt=0, le=8) sepal_width: Series[float] = pa.Field(gt=0, le=5) petal_length: Series[float] = pa.Field(gt=0, le=7) petal_width: Series[float] = pa.Field(gt=0, le=3) target: Series[int] = pa.Field(isin=[0, 1, 2]) class Config: name = "BaseSchema" strict = True coerce = True panderaの利用例〜スキーマの定義〜 9 0/1/2(カテゴリ) 現実的な値

Slide 10

Slide 10 text

panderaの利用例〜バリデーション〜 10 iris = IrisSchema.validate(iris) iris.head()

Slide 11

Slide 11 text

invalid_record = { "sepal_length": 5.8, "sepal_width": 3.0, "petal_length": 4.35, "petal_width": 1.3, "target": 3, # invalid value } invalid_iris = iris.append(invalid_record, ignore_index=True) invalid_iris["target"] = invalid_iris["target"].astype(int) panderaの利用例〜意図しないレコードの追加〜 11

Slide 12

Slide 12 text

panderaの利用例〜意図しないレコードの確認〜 12 invalid_iris.tail()

Slide 13

Slide 13 text

panderaの利用例〜バリデーション(エラー)〜 13 invalid_iris = IrisSchema.validate(invalid_iris) --------------------------------------------------------------------------- SchemaError Traceback (most recent call last) (省略) SchemaError: failed element-wise validator 0: failure cases: index failure_case 0 150 3 indexが150のレコードでエラー

Slide 14

Slide 14 text

まとめ ● データフレーム(pandas.DataFrame) ○ 表形式のデータの取り込み、加工、集計、分析に利用 ○ データ分析/機械学習などで活躍 ○ 課題①:意図しない値を格納してしまう ○ 課題②:他者・未来の自分がコードから内容を読み取れない ● 課題を解決する“pandera” ○ データフレームのスキーマ(構造)を定義することで データフレームのバリデーションを実現するライブラリ ○ 課題①:バリデーションにより意図しない値の格納を防ぐ ○ 課題②:スキーマを明示的に記述することでコードから内容の読み取りが可能に 14 参考記事:https://qiita.com/daikikatsuragawa/items/d0516db16f930c5e582f