はじめに
いよいよ,遂にデータ分析にPolarsを導入しました.(遅い...)
以前より「速い」「Pandasライクな記法」ということを耳にしてはいましたが,就職活動や学業で時間が取れずに,中々導入を躊躇っていました.
そんな折に,サマーインターンシップに参加させていただく機会を得ることができ,その中で大規模なデータを扱うことになったのですが,Pandasでは中々処理が終わらない......
普段であればアルゴリズムを工夫して計算量を減らすところですが,気まぐれで前々から気になっていたPolarsを導入してみることにしました.
そんなPandasを普段利用する人がPolarsを初めて利用するという事例の1つとして,目を通していただければ幸いです.
困った箇所・詰まった箇所に焦点を当てて,簡単なチュートリアルを記事にしてみたいと思います.
ちなみに,参加させて頂いたインターンシップはBIPROGY株式会社様のAI Engineer / Data Scientist向けのもので,これに関連する記事はこちらにもあるので,気に入った方は目を通してみてもらえると幸いです!
【困った箇所①】 Polarsって何と読むの?
そもそもですが,何と読むのでしょうか?
これまで,話題に挙がっても「ぽ、ぽーらす...?ぽらーす?」といったように呼ぶ人が多く,私も例に漏れずに確信が持てない状況でした.
これを機に調べてみると,「ポーラス」1が近いのかなと思います.(有識者の方,教えてください!)
→ どうやら「ポラーズ」のようです.(@WolfMoon様ありがとうございます!)2
小さな疑問ですが,チームで共有するときに地味に困るので,初めに挙げてみました.
【困った箇所②】 古いバージョンの情報が(現時点では)多い
まだまだ発展途上ということなのだと思いますが,バージョンごとに変更点が多く,記事を鵜呑みにするだけではエラーが多発します.
エラーが発生する場合は公式ドキュメントを読みましょう.(この記事の意義を引っくり返すものですが......)
具体例を挙げておくと
import polars as pl
data = [
[1, 2],
[3, 4],
[5, 6],
[7, 8],
[9, 10],
]
df = pl.DataFrame(data, schema=["a", "b"])
# 以下が最新バージョン(1.4)の記法
df_new = df.with_columns(
(pl.col('a') ** 2).alias('a_squared')
)
# 以下の記法ではエラーが発生(おそらくバージョン0.15以前)
# df_new = df.with_column(
# (pl.col('a') ** 2).alias('a_squared')
# )
みたいな感じです.
また,これに似たようなものとして,生成AIに記述してもらう際にPandasと混ざった回答が返されるというものもあります.
# 以下が最新バージョンの記法
df = pl.DataFrame(data, schema=["a", "b"])
# 以下が誤った記法(生成AIに質問するとこういった回答が得られることが多々ある)
# df = pl.DataFrame(data, columns=["a", "b"])
まだまだ,Pandasの記事の方が絶対的な記事の量が多く,また新しい内容なので学習が追いついていないのでしょうね.
【困った箇所③】 まだPandasに比べるとサポートされている操作が少ない
大規模データでPolarsを導入したのは良いものの,(Pandasではサポートされているような)少し複雑な操作がサポートされておらず,泣く泣くPandasに変換して処理を行いました.
幸いにも計算量が少ない操作だったので,それで事足りましたが,計算量の多い操作であれば他の方法を検討する必要がありそうです.
ちなみに,PandasからPolarsの変換やその逆は非常に簡単に実装できるので,現時点で致命的な問題になることは無さそうです.
Pandas to Polars
Polars to Pandas
なお,Polarsで実装できなかった部分のコードを掲載したいところですが,少し特殊な操作のため,少し書き換えた程度では情報漏洩になりそうなので,割愛させてください.
【良いところ】 とにかく速い
Polarsの悪いところだけ挙げるのも悲しいので,最後に良いと思ったポイントを.
上記で挙げた「困ったところ」は,あくまでこれから使い始める人が気をつけたいポイントというものです.
私自身,これからもPolarsを使うつもりなので,アピールポイントも紹介させてください!
私の環境で実行時間を計測してみた結果は以下の通りです.(一例くらいに考えてください.)
上記の実行時間はランダムな値をN行×5列で生成し,5列の積を計算した時のものです.
大規模なデータになるほど,差が大きくなっていることが分かります.(今回の場合,最大で10倍程度)
なお,group_byなどの操作の方が顕著らしいですが,今回はそこまで検証はしていません.
とはいえ,十分な高速化が達成できているのではないでしょうか?
最後に
ふとしたきっかけで導入することにしたPolarsですが,使い所を見極めることができれば,非常に強力なツールになるなと感じました.
今後の研究などの中で使用して知見が溜まってくれば,Polarsについて新しい記事を書くかもしれません.