読者です 読者をやめる 読者になる 読者になる

c-bata web

@c_bata_ のメモ。python多め

pandasのvalidationライブラリを公開しました

はじめに

pandasのDataFrameはかなり便利ですが、その構造を明示的に定義できないので変な値が混ざってることに気づきにくいです。

研究で使ってるプログラムで変な値が混ざってないかチェックしたい所があったのですが、validatorについて調べてみても特に良さそうなライブラリとかは見つからなかったので、pandas-validator を作りました。

使い方

インストール

$ pip install pandas-validator

Seriesのバリデーション

DataFrameだけでなくSeriesのvalidationも可能です。

import pandas_validator as pv

validator = pv.IntegerSeriesValidator(min_value=0, max_value=10)

# バリデーションを通る例
series = pd.Series([0, 3, 6, 9])
print(validator.is_valid(series))

# 12は大きいためこのseriesはバリデーションを通りません
series = pd.Series([0, 4, 8, 12])
validator.is_valid(series)

# 整数型ではないためこのseriesはバリデーションを通りません
series = pd.Series([0.0, 3.3, 6.6, 9.9])
validator.is_valid(series)

実装しているvalidatorは以下の3種類です。

  • pandas_validator.IntegerSeriesValidator
  • pandas_validator.FloatSeriesValidator
  • pandas_validator.CharSeriesValidator

DataFrameのバリデーション

これがしたくてこのライブラリを作りました! DataFrameの構造をDjangoのFormクラスのように定義できます。

import pandas_validator as pv

class SampleDataFrameValidator(pv.DataFrameValidator):
    label1 = pv.IntegerColumnValidator('label1', min_value=0, max_value=10)
    label2 = pv.FloatColumnValidator('label2', min_value=0, max_value=10)
    label3 = pv.CharColumnValidator('label3', min_length=0, max_length=4)

validator = SampleDataFrameValidator()

後はSeriesのValidatorと同じようにis_vaildメソッドにチェックしたいDataFrameオブジェクトを渡せばOKです。

ipython notebookで動かしてる例は↓です。

pandas-validator/pandas_validator_example_ja.ipynb at master · c-bata/pandas-validator · GitHub

Categorical Data

ライブラリを公開したらid:sinhrks さんがTwitterで反応してくれました。

なるほどこの機能は初めて知りました。 ざっと読む限り、性別や血液型など、出てくる値の種類が決まっているデータに対して有効なものみたい。例えば血液型だったらA, B, AB, O型以外のS型のような値は混じってほしくない(バリデーションしておきたい)。

pandas-validator にも DjangoChoiceField みたいにいくつかの選択肢から選ぶようなvalidatorを実装する予定だったのですが、それは不要かもですね。

今後の予定

Panelのバリデーションは僕が必要としてなかったので今のところ対応予定は無いです。Githubのissueに上がったら対応すると思います。

  • Documentちゃんと書く
  • DatetimeValidator とかも必要なら実装

終わりに

pandasを使ったプログラムのテストを書くときにcsvのfixtureを用意してたのですが、factory_boyみたいに動的にfixtureを生成できるものがほしいので作成しようと考え中です。 この pandas-validator と同じ形式でDataFrameを定義してそれにあうデータを生成する形にしたいですね。

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理

Pythonによるデータ分析入門 ―NumPy、pandasを使ったデータ処理