匿名エンジニアの備忘録

匿名エンジニア。機械学習・ITのことを中心に

polarsでちょっとハマりかけた罠①

続編があるかもしれないので①とします。

pandasだとあまり気にしていなかった型についてです。 pandasですと特に指定しなければ、全ての数値データはIntegerかfloatになるかと思います。

しかしpolarsはどうも違うみたいですね。

print(pl.DataFrame({"hoge": [1, 2, 3, 3, 3,3]}).select(pl.col('hoge').unique()))
>>>
shape: (3, 1)
┌──────┐
│ hoge │
│ ---  │
│ i64  │
╞══════╡
│ 1    │
│ 2    │
│ 3    │
└──────┘

上記の例では、pl.Int64型になっているのに、下記では、UInt32型を返してきます。

import polars as pl

pl.DataFrame({"hoge_str": ["hoge", "huga", "huge"]}).select(pl.col('hoge_str').str.lengths())
>>>
shape: (3, 1)
┌──────────┐
│ hoge_str │
│ ---      │
│ u32      │
╞══════════╡
│ 4        │
│ 4        │
│ 4        │
└──────────┘

なんで処理によって型推論のロジックを変えているのかは今後documentを見て勉強します。

文字の数え上げなどをするときは、当たり前ですが、負の整数になりません。 しかし数え上げた文字をグループごとに差を特徴量として見たいときがあるかと思います。 なんとなくUIntで返ってきた変数で差分など計算したら、マイナスになった瞬間オーバーフローして10桁の数字が返ってきてしまうかもしれませんね...

Version

pl.__version__
>>>
'0.16.4'