ディスカッション (21件)
PandasからPolarsに乗り換えることでメモリを節約できますが、Quantileのデフォルト補間方法に微妙な違いがあるので注意が必要です。
詳細はこちらをご覧ください: https://wedgworth.dev/polars-vs-pandas-quantile-method/
PolarsとPandasの間には、これ以外にも、うっかり見過ごしてしまうような大きな違いはありますか?
PolarsってRustで書かれたフレームワークだっけ?
Polars、マジで最高なんだよね。はい、TEDトーク終わり。これ作った人はマジで称賛されるべき。/ Rustに転向した開発者より
まだPolarsはあんまり使ってないんだけど、見た感じ、大量のデータを扱う人(例えば俺みたいな)にとって一番のメリットは、パイプライン(この2つのカラムを足して、5を掛ける、とか)を記述して、そこにデータをストリームとして流せることだと思う。
つまり、Pandasみたいに、すべてのデータをデータフレームにロードしようとしてメモリを使いまくるのとは違って、Polarsはデータをバッチでロードして、最終結果だけを見せてくれるんだ。
それと、APIがマジで分かりやすい!
しかも、めっちゃ速い。
まさにそう。数百万のデータポイントを一度に処理する必要があるデータラングリングをたくさんやってるんだけど、Polarsの仕事の速さに本当に驚かされるよ。
Rのdata.tableからPandasに移行したとき、マジで困惑したよ。「マジでこれ使ってんの?!」って感じ。ホラー映画みたいだった。で、Polarsを見つけたんだ。今は納得してる。
それに加えて、クエリソルバーがあって、パイプラインを最適化してくれるから、レイジーAPIはさらに効率的なんだよね。
それは、明示的にオプトインする必要がある2つの別々の機能によるね。
- LazyFrames -
df.with_columns(…).group_by(…).(…).collect()みたいに変換のセットを構築するんだ。変換は.collect()を呼ぶまで実行されない。これで、ステップごとに変換を構築できるけど、完全な変換が作成されるまで実行を遅らせることができる。こうすることで、Polarsはより賢く変換を実行できるんだ。多くの場合、メモリやCPUを大幅に節約できるよ。 - ストリーミングモード - あまり使ったことがないんだけど、必要なデータだけをメモリにロードして、データフレームをチャンクで処理する、より効率的なクエリプランを実行するのに役立つ。知る限りでは、ストリーミングを行うにはLazyにする必要がある。最後に確認したときには、すべての操作がストリーミングモードでサポートされていたわけではないけど、最近数ヶ月でストリーミングエンジンが大幅に刷新されたから、もうそうではないかもしれないね。
Pandasはロシアの戦車、Polarsは巡航ミサイルって感じ。それ以外は、俺が使った限りでは、どっちも同じ結果になるみたいだけどね。
もうpandasは捨てたわ。ホッキョクグマが俺の新しい守護動物だ。
マジそれな兄弟。アヒルさんも忘れちゃいけない。
同じことをするのが待ちきれないけど、まずはgeopolarsが必要なんだ:(
必要なときに簡単に変換できるよ。PolarsとPandasは相性が良いから、二者択一ってわけじゃないんだ。パイプラインで両方使えるよ。
Pandasの使用経験はあまりないけど、データフレームが非常に大きいときに、このメモリの問題に既に出くわしたことがあるよ。最初は、Pandasでプロジェクトを実装する方法が、非常に多くのRAMを消費し、遅くしているのだと思った(parquetとか何もなしでCSVを扱っていた)。でも、Pandasがデータフレーム全体をRAMにロードすると、データの操作が戦略ではなくリソースの問題になるなら、納得がいくね。
全部Polarsに置き換えて、時間とリソースを計測して、どうなるか試してみるよ。
PandasからPolarsに乗り換えて、パフォーマンスに感動してる。遅延評価を扱うのには慣れてるんだ(メモリに収まらないサイズのデータフレームを扱うためにDaskを使ってたからね)。
(Lazy APIを使ってパフォーマンスを最適化するために式の順序を変更する)式の最適化で苦労したことがあるよ。例えば、列の削除が、その列を操作する式の前に移動されちゃったりね。でも、これは少し前のビルドでの話。
あと、圧縮ファイルはストリーミングされずにメモリに読み込まれるよ(scan_csvまたはread_csv操作で読み込まれる圧縮テキストファイル)。
めちゃくちゃ乗り換えたいんだよね。でも、GeoPolarsが完成するまでは無理だな。これは、PolarsがArrow Extension Typesをサポートしてない/サポートする予定がないからブロックされてるんだ。さらに、Polarsはコアデータ型のサブクラス化をサポートしてないし。つまり、乗り換えたいのは山々だけど、主なユースケースが実現できないんだ。
Pandasに対抗するために、もっとOOP的なPyThermiteを作り始めたんだ。Pandasに対するベンチマークを実行しているときに、Polarsに対しても実行することにした。PolarsもRustでバックエンドが組まれたスレッド化(rayon)ツールだから、良い勝負になると思ったんだ。そしたら、Polarsが大規模なデータセットのロードとフィルタリングでPandasを圧倒的に打ち負かしたんだ。1000万行以上だよ。インデックスがない限り、データセットのクエリ処理はこれ以上パフォーマンスが上がらないんじゃないかな。