概要
近年、Python を使った機械学習がブームで計算処理に Pandas
を利用されている方も多いと思います。
今回は、Pandas
よりも高速に処理できるといわれている「Polars」をご紹介します。
Polars
は元々、メモリモデルとして Apache Arrow Columnar Format を使用して Rust に実装された DataFrame ライブラリでしたが、現在では Python、Node.js でも利用可能です。
GitHub 上の特徴では以下の点が挙げられており、非常にパワフルなライブラリのようです。
それでは実際に、利用手順などを見ていきましょう!
(注)Polars
が現在積極的に開発中(執筆時 v0.22.1)の OSS であり、アップデートは頻繁に行われているため、今後 API が大きく変わる可能性があります。最新情報に関しては、GitHub の最新情報をご確認ください。
利用手順
Python で利用する場合
以下のコマンドよりインストール可能です。
$ pip3 install polars
なお、詳細については以下のドキュメントやユーザーガイドをご覧ください。
Rust で利用する場合
Polars
を利用する際は、GitHub の master
ブランチを参照できるよう、以下のコマンドをソース上に組み込んでください。
polars = { git = "https://github.com/pola-rs/polars", rev = "<optional git tag>" }
なお、詳細については以下のドキュメントやユーザーガイドをご覧ください。
Node.js で利用する場合
以下のコマンドよりインストール可能です。
$ yarn add nodejs-polars
なお、詳細については以下のドキュメントやユーザーガイドをご覧ください。
使用感
Python での利用イメージは以下の通りです。
>>> import polars as pl >>> df = pl.DataFrame( ... { ... "A": [1, 2, 3, 4, 5], ... "fruits": ["banana", "banana", "apple", "apple", "banana"], ... "B": [5, 4, 3, 2, 1], ... "cars": ["beetle", "audi", "beetle", "beetle", "beetle"], ... } ... ) # embarrassingly parallel execution # very expressive query language >>> ( ... df ... .sort("fruits") ... .select( ... [ ... "fruits", ... "cars", ... pl.lit("fruits").alias("literal_string_fruits"), ... pl.col("B").filter(pl.col("cars") == "beetle").sum(), ... pl.col("A").filter(pl.col("B") > 2).sum().over("cars").alias("sum_A_by_cars"), # groups by "cars" ... pl.col("A").sum().over("fruits").alias("sum_A_by_fruits"), # groups by "fruits" ... pl.col("A").reverse().over("fruits").alias("rev_A_by_fruits"), # groups by "fruits ... pl.col("A").sort_by("B").over("fruits").alias("sort_A_by_B_by_fruits"), # groups by "fruits" ... ] ... ) ... ) shape: (5, 8) ┌──────────┬──────────┬──────────────┬─────┬─────────────┬─────────────┬─────────────┬─────────────┐ │ fruits ┆ cars ┆ literal_stri ┆ B ┆ sum_A_by_ca ┆ sum_A_by_fr ┆ rev_A_by_fr ┆ sort_A_by_B │ │ --- ┆ --- ┆ ng_fruits ┆ --- ┆ rs ┆ uits ┆ uits ┆ _by_fruits │ │ str ┆ str ┆ --- ┆ i64 ┆ --- ┆ --- ┆ --- ┆ --- │ │ ┆ ┆ str ┆ ┆ i64 ┆ i64 ┆ i64 ┆ i64 │ ╞══════════╪══════════╪══════════════╪═════╪═════════════╪═════════════╪═════════════╪═════════════╡ │ "apple" ┆ "beetle" ┆ "fruits" ┆ 11 ┆ 4 ┆ 7 ┆ 4 ┆ 4 │ ├╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┤ │ "apple" ┆ "beetle" ┆ "fruits" ┆ 11 ┆ 4 ┆ 7 ┆ 3 ┆ 3 │ ├╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┤ │ "banana" ┆ "beetle" ┆ "fruits" ┆ 11 ┆ 4 ┆ 8 ┆ 5 ┆ 5 │ ├╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┤ │ "banana" ┆ "audi" ┆ "fruits" ┆ 11 ┆ 2 ┆ 8 ┆ 2 ┆ 2 │ ├╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┼╌╌╌╌╌╌╌╌╌╌╌╌╌┤ │ "banana" ┆ "beetle" ┆ "fruits" ┆ 11 ┆ 4 ┆ 8 ┆ 1 ┆ 1 │ └──────────┴──────────┴──────────────┴─────┴─────────────┴─────────────┴─────────────┴─────────────┘
一見、Python の DataFrame ライブラリ Pandas
に似ていますね。
ただ、Pandas
には index
があるが Polars
には存在しないなど、微妙に差があるので使い方については少し注意が必要です。
以下の記事に使用上の Pandas
と Polars
の差異についてまとめられているので、一読されることをお勧めします。
まとめ
今回は、Pandas
よりも高速に処理できるといわれている「Polars」をご紹介しました。
Polars
は現在も積極的に開発が続けられているということなので、まだまだ不安定な部分もあると思います。
ただ、Pandas
よりも高速に動作することや、Python以外の言語(Rust や Node.js)でも利用可能ということもあり、 今後 Polars
を利用する場面も増えてくるのではないかと思いますので、早めに新技術をキャッチアップをしておくのもいかがでしょうか。
ライセンス
リンク