Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

4b46b5f1acab7f5a64c0036c1fc39f31?s=128

Daiki Katsuragawa

May 15, 2022
Tweet

More Decks by Daiki Katsuragawa

Other Decks in Programming

Transcript

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

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

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

  4. 課題②:他者・未来の自分がコードから内容を読み取れない 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にはどんな情報が 格納されている?
  5. 課題を解決する“pandera” • “pandera”とは ◦ データフレームのスキーマ(構造)を定義することで データフレームのバリデーションを実現するライブラリ • 課題①:意図しない値を格納してしまう ◦ バリデーションにより意図しない値の格納を防ぐ

    • 課題②:他者・未来の自分がコードから内容を読み取れない ◦ スキーマを明示的に記述することでコードから内容の読み取りが可能に ※大きく利用方法は2種あるが、今回は“Schema Models”を紹介 5 !pip install pandera
  6. 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", } )
  7. panderaの利用例〜データの確認①〜 7 iris.head() 0/1/2(カテゴリ)

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

  9. 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(カテゴリ) 現実的な値
  10. panderaの利用例〜バリデーション〜 10 iris = IrisSchema.validate(iris) iris.head()

  11. 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
  12. panderaの利用例〜意図しないレコードの確認〜 12 invalid_iris.tail()

  13. panderaの利用例〜バリデーション(エラー)〜 13 invalid_iris = IrisSchema.validate(invalid_iris) --------------------------------------------------------------------------- SchemaError Traceback (most recent

    call last) (省略) SchemaError: <Schema Column(name=target, type=DataType(int64))> failed element-wise validator 0: <Check isin: isin({0, 1, 2})> failure cases: index failure_case 0 150 3 indexが150のレコードでエラー
  14. まとめ • データフレーム(pandas.DataFrame) ◦ 表形式のデータの取り込み、加工、集計、分析に利用 ◦ データ分析/機械学習などで活躍 ◦ 課題①:意図しない値を格納してしまう ◦

    課題②:他者・未来の自分がコードから内容を読み取れない • 課題を解決する“pandera” ◦ データフレームのスキーマ(構造)を定義することで データフレームのバリデーションを実現するライブラリ ◦ 課題①:バリデーションにより意図しない値の格納を防ぐ ◦ 課題②:スキーマを明示的に記述することでコードから内容の読み取りが可能に 14 参考記事:https://qiita.com/daikikatsuragawa/items/d0516db16f930c5e582f