Scriptone Scriptone

Python Polarsを半分ほど読んだ

Python Polars ―高速なデータ処理を実現する次世代ライブラリを18章中8章読みました。Jupyter Notebookではなくmarimoを利用してコードを動かし読み進めていますが問題なく動作しています。

Polarsとの比較でよく使われるのがPandasだと思います。私もPolarsが誕生し台頭するよりも前からPandasを使っていたのでなかなかPolarsに慣れずにいましたが少しずつ手書きでPolarsを使ったコードを書いたり読み解いたりができるようになってきています。

第3章ではPolarsとPandasの違いを述べながら実際に違いを比較してみる章となっています。Pandasは独自の記法でフィルタリングすることがありますがPolarsだとより純粋なPythonの書式とオブジェクト指向を利用した宣言的な書き方です。書き方が違うので慣れが必要ですが、慣れてしまうと非常にわかりやすく応用がしやすい書き方です。PandasからPolarsへの移行を助けてくれると思います。

4章から6章はPandasにも存在するSeries、DataFrame型に加えてLazyFrameというものを学び、データの読み書きをします。LazyFrameは、クエリ最適化を伴う遅延評価(Lazy Evaluation)を利用したもので通常のDataFrameやPandasと比べても非常に速いです。遅延処理のために一部利用できないメソッドもありますが、DataFrameへの変更やキャッシュを通じた高速化などもあるので、速さと利便性を柔軟に得ていくための手法を学べます。また、CSVやDatabase、Excel、JSON、Parquetなどさまざまなデータの読み書きを学べます。ここの処理だけだとデータの選択・フィルター・集計はできませんが、土台となる入出力や新しいLazyFrameを含めたPolarsの型を理解できます。

7章、8章ではエクスプレッションを使った処理を学べます。エクスプレッションはPolars型を操作するための抽象的な概念です。エクスプレッションを使うと、列の選択や新しい列の作成、フィルタリング、集約、ソートなどを宣言的に記述でき、それぞれを組み合わせてNoSQLのように記述してデータを操作できます。Pythonやオブジェクト指向を使っているのでPandasのような特殊な記法にはならないですがPolarsを1つの言語のように扱えるかのような柔軟性とわかりやすさが魅力的です。例えば、身長と体重でフィルターする場合の処理としては以下のようにかけます。

# Pandas
pd_df_fil = pd_df[(pd_df["height"] > 180) & (pd_df["weight"] < 80)]
# もしくは
pd_df_fil = pd_df.query("height > 180 & weight < 80")

# Polars
pl_df_fil = pl_df.filter((pl.col("height") > 180) & (pl.col("weight") < 80))

Pandasの方がすっきりわかりやすく見えるのですがどちらもPythonの標準的な記法から外れていると思います。一方でPolarsはPythonの標準的な記法で書けているので新しくDataFrameを学ぶ方にはPolarsが勧められるかもしれません(ただしPandasも枯れた技術として他のライブラリとの連携の高さと情報の充実度は魅力的です)。

エクスプレッションには統計処理の関数や累計の処理も含まれているので新しい列を作る際にも直感的にすっきりかけるので、処理によってはPandasよりも短いコードになることもあります。

ただ、Pandasと書き方の違いがあり、型に厳しい点でPandasからの移行が難しくなっている可能性があります。そもそもPandasを便利に使えているのでそこから苦労をしてPolarsを学ぶことが0からPandasを学ぶことよりも苦行のように思えるのかもしれません。ただ、新しい書き方は非常に柔軟性がありすでに積み上げているPythonの資源で理解ができる点、型の厳しさによって速度の確保や事前に不正な値をエラーとして検出できる点でメリットにもなっています。

Polarsは新興のライブラリではありますがnumpyやPlotlyなど他のライブラリとの連携もしやすくなってきていて将来性があると思いますので、私はこの後もこの書籍を読み進めてPolarsを生成AIなしで読み書きできるようにしたいと思っています。

< Diary一覧に戻る