ソフトウェア開発者のための OSS、まとめてみました!

ソフトウェア開発を行なっている自分が、個人的に面白いと思ったプログラムの最新技術や、オープンソースソフトウェア(OSS)をまとめています!

MENU

Python で Pandas よりも高速な DataFrame ライブラリを探しているなら!「Polars」

概要

近年、Python を使った機械学習がブームで計算処理に Pandas を利用されている方も多いと思います。

今回は、Pandas よりも高速に処理できるといわれている「Polars」をご紹介します。

Polars は元々、メモリモデルとして Apache Arrow Columnar Format を使用して Rust に実装された DataFrame ライブラリでしたが、現在では Python、Node.js でも利用可能です。

GitHub 上の特徴では以下の点が挙げられており、非常にパワフルなライブラリのようです。

  • 非常に高速
  • マルチスレッド処理
  • SIMD
  • クエリ最適化
  • API 対応
  • Rust、Python、Node.js で利用可能

それでは実際に、利用手順などを見ていきましょう!

(注)Polars が現在積極的に開発中(執筆時 v0.22.1)の OSS であり、アップデートは頻繁に行われているため、今後 API が大きく変わる可能性があります。最新情報に関しては、GitHub の最新情報をご確認ください。

利用手順

Python で利用する場合

以下のコマンドよりインストール可能です。

$ pip3 install polars

なお、詳細については以下のドキュメントやユーザーガイドをご覧ください。

Rust で利用する場合

Polars を利用する際は、GitHubmaster ブランチを参照できるよう、以下のコマンドをソース上に組み込んでください。

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 には存在しないなど、微妙に差があるので使い方については少し注意が必要です。

以下の記事に使用上の PandasPolars の差異についてまとめられているので、一読されることをお勧めします。

zenn.dev

まとめ

今回は、Pandas よりも高速に処理できるといわれている「Polars」をご紹介しました。

Polars は現在も積極的に開発が続けられているということなので、まだまだ不安定な部分もあると思います。

ただ、Pandas よりも高速に動作することや、Python以外の言語(Rust や Node.js)でも利用可能ということもあり、 今後 Polars を利用する場面も増えてくるのではないかと思いますので、早めに新技術をキャッチアップをしておくのもいかがでしょうか。

ライセンス

MIT License

リンク

www.pola.rs

github.com