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

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

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

Daiki Katsuragawa

May 15, 2022
Tweet

More Decks by Daiki Katsuragawa

Other Decks in Programming

Transcript

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

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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にはどんな情報が
    格納されている?

    View full-size slide

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

    View full-size slide

  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",
    }
    )

    View full-size slide

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

    View full-size slide

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

    View full-size slide

  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(カテゴリ)
    現実的な値

    View full-size slide

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

    View full-size slide

  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

    View full-size slide

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

    View full-size slide

  13. 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のレコードでエラー

    View full-size slide

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

    View full-size slide