4 ポイント 投稿者 GN⁺ 2024-01-09 | 1件のコメント | WhatsAppで共有
  • 単一マシンで高速なデータ処理が必要な環境を想定したオープンソースのDataFrameライブラリで、5億7,500万回以上のダウンロードと3万8,000以上のGitHubスターを記録
  • 性能の中核はRustベースのマルチスレッドクエリエンジンと、カラム指向処理、ベクトル化、SIMD、並列実行にある
  • MITライセンスのオープンソースライブラリとして継続提供され、同じAPIで本番ワークロードまで拡張できるPolars Cloudもあわせて提供
  • pandas比で30倍以上の性能向上を打ち出しており、派生TPC-Hベンチマークはc3-highmem-22で、scale factor 10かつI/Oを含む条件で実行
  • CSV、JSON、Parquet、Delta Lake、AVRO、Excel、Arrow、主要データベース、S3とAzureストレージをサポートし、既存のデータスタックに組み込みやすい

Polarsの提供形態

  • Polarsはデータ操作のためのオープンソースライブラリであり、単一マシンにおける最速級のデータ処理ソリューションの1つとして位置づけられている
  • 構造化され型付けされたAPIを提供し、表現力と使いやすさの両立を目指している
  • 現在の公開指標は以下のとおり
    • 575M+ ダウンロード
    • 38k+ GitHubスター
  • 導入ガイドはGet startedで確認できる
  • オープンソースのPolars

    • PolarsはMITライセンスのもとで無料で利用できるオープンソースライブラリ
    • 高性能なDataFrameライブラリとして提供され、インストール方法もシンプル
    • インストール例は以下のとおり
      • Python: pip install polars
      • Rust: polars = { version = "x", features = ["lazy", ...]}
      • Node.js: const pl = require('nodejs-polars');
  • Polars Cloud

    • Polars Cloudは、ノートブック環境のPolarsクエリをクラウドまたはオンプレミスの本番ワークロードへ拡張するマネージドソリューション
    • 同じAPIを使ってコード変更なしにスケールできる
    • デプロイ方式はCloudまたはOn-Premに対応
    • 課金はクエリ実行時にのみ発生
    • 体験はPolars Cloudで可能

性能モデルとデータ統合

  • Polarsの性能基盤は、Rustベースのマルチスレッドクエリエンジンと並列処理設計にある
  • ベクトル化とカラム指向処理により、現代のプロセッサでキャッシュ整合性の高いアルゴリズムと高性能を実現
  • 派生した独立TPC-Hベンチマークで複数のソリューションと比較されており、実務のデータ整形作業の再現を目指している
    • pandasと比較して30倍以上の性能向上が可能
    • ベンチマークはc3-highmem-22で、scale factor 10、I/Oを含む条件で実行
    • クエリはopen sourceとして公開されている
    • 詳細はLearn moreで確認できる
  • 使いやすさと実行最適化

    • ユーザーは意図した形でクエリを書き、Polarsのクエリオプティマイザが効率的な実行方法を決定する
    • 利用可能なCPUコアに処理を分散し、追加設定やシリアライズのオーバーヘッドなしで並列実行する
    • Apache Arrowメモリモデルを使用し、既存のデータツールと統合できる
    • zero-copyのデータ共有により、ツール間連携のコストを抑えられる
    • 外部依存なしでマシンに近い設計となっており、API、メモリ、実行を制御できる
    • メモリより大きなデータセットはストリーミングAPIで処理でき、全データをメモリに載せる必要がない
  • 対応データ形式

    • Polarsは一般的なデータ形式の読み書きをサポートし、既存のデータスタックと統合できる
    • 対応範囲は以下のとおり
      • Text: CSV, JSON
      • Binary: Parquet, Delta Lake, AVRO, Excel
      • IPC: Feather, Arrow
      • Databases: MySQL, Postgres, SQL Server, Sqlite, Redshift, Oracle
      • Cloud storage: S3, Azure Blob, Azure File

1件のコメント

 
GN⁺ 2024-01-09
Hacker News の意見
  • このページは、すでに何を見ているのか分かっている人向けに書かれていることがあまりにも明らかです。最初の一文からツールの説明ではなく、「Polars is written from the ground up with performance in mind」のように品質の話から始まり、残りも同じ流れです
    誰か、5歳児に説明するようにこれが何で、どんなニーズに対する良いソリューションなのかを教えてくれませんか?
    追記: 結局、Pandas DataFrame の代替実装だと理解しました。Google で見つけた https://realpython.com/pandas-dataframe/ の説明によると、DataFrame は2次元データとラベルを保持する構造で、データサイエンス、機械学習、科学計算などのデータ集約型分野で広く使われ、SQL テーブルや Excel/Calc のスプレッドシートに似ています

    • 多くの技術製品のいら立たしい欠点がまさにこれです。ターゲット読者、ここでは Pandas は好きだが遅く柔軟性に欠けると感じているデータサイエンティストに語りかけたいのは自然ですが、初心者には排除されているように感じさせます
      私は Polars のターゲット読者で、数か月前から試そうとしていたのですが、ずっと先延ばしにしています。Pandas の作者である Wes McKinney が一般的な分析ツールを説明する有用な本 https://wesmckinney.com/book/ を書いてくれたおかげで、Pandas への忠誠心が残っています
    • Pandas だけど速いものです。Pandas は元祖のオープンソース DataFrame ライブラリで、堅牢で広く使われていますが、守備範囲が広く、この新顔より遅いようです。「DataFrame」という言葉は、すでに使ったことがある人にはすぐに伝わる合図になります
    • こういうページを見るたびに謙虚な気持ちになります。「新時代の DataFrame」と言われると、自分は DataFrame を分かっているのだろうかと思い、「マルチスレッドのクエリエンジン」を見るとデータベースのようなものなのかと思います
      pandas、modin、vaex というものと比較したグラフが出てきますが、それらもまったく知らないので、結局これは自分向けではないのだなと感じます。新しい技術やプロジェクトについて読んで学ぶのは好きですが、ここには自分が手がかりにできるものがありません
      私が取るに足らない Web 開発の話をするときに、一般の人が経験していることはたぶんこういうことなのでしょう
    • 公平に見ると、ページタイトルは「Dataframes for the new Era」で、タイトル下の Get Started リンクは GitHub ページにあるドキュメントを指しています。GitHub では、データ分析の背景がある人向けにこのライブラリが何かを説明しています: https://github.com/pola-rs/polars
    • 今「データ」方面の仕事に引き込まれているところですが、ここは独自の背景と文化を持つ並行宇宙のようです。「Nincompoop の使いやすさと ARSE2 の性能で Antelope や Meringue インスタンスに接続」といった表現が多いです
      Polars で興味深いのは、Pandas に似ているものの、より効率的な Rust バックエンドである Arrow を使い、演算の組み合わせをより効率化するクエリプランナーのようなものがある点です。通常、Polars は Pandas よりはるかに効率的なので、以前なら複雑なインフラが必要だった作業も、単一マシンでできることが多いです
      Pandas の主要開発者が作った、とても友好的な競争関係で、見たところ皆が好意的に受け止めており、時間がたてば Pandas を置き換える可能性が高そうです
  • 関連記事:
    Detailed Comparison Between Polars, DuckDB, Pandas, Modin, Ponder, Fugue, Daft - https://news.ycombinator.com/item?id=37087279 - 2023年8月
    Polars: Company Formation Announcement - https://news.ycombinator.com/item?id=36984611 - 2023年8月
    Replacing Pandas with Polars - https://news.ycombinator.com/item?id=34452526 - 2023年1月
    Fast DataFrames for Ruby - https://news.ycombinator.com/item?id=34423221 - 2023年1月
    Modern Polars: A comparison of the Polars and Pandas dataframe libraries - https://news.ycombinator.com/item?id=34275818 - 2023年1月
    Rust polars 0.26 is released - https://news.ycombinator.com/item?id=34092566 - 2022年12月
    Polars: Fast DataFrame library for Rust and Python - https://news.ycombinator.com/item?id=29584698 - 2021年12月
    Polars: Rust DataFrames Based on Apache Arrow - https://news.ycombinator.com/item?id=23768227 - 2020年7月

  • Pandasを何年も使ってきたが、いつもボールを丘の上へ転がしているような感覚だった。joinのような単純な作業でさえそうだし、インデックスのリセットも忘れてはいけない
    Polarsはほぼあらゆる面でPandasより優れているように感じる。より高速で、マルチコアを使い、メモリ消費が少なく、APIがより直感的だ。まだ比較的若いライブラリなので欠点はあるが、新規プロジェクトなら少なくとも検討する価値はある
    Rustエコシステムを簡単に活用できるのも素晴らしい。自分でプラグインを書いて関数を並列化し、一部の地理空間コードを100倍高速化できた

    • joinを例に挙げたのは少し皮肉だ。Pandasの最大の問題は常にドキュメントだと思っていた。例えば、インデックスを使わずにデータフレームをjoinする方法があることを知っていただろうか? 名前は「join」ではなくmerge
      Pandasは初期にRの用語と利用パターンから強い影響を受けており、Rでは「merge」が「join」を意味する言葉としてすでに一般的だった。Pandasを学び始めた2015年頃にRをすでに知らなかったなら、素早く習得するのは難しかったと思う
    • PRQL(prql-lang.org)をどう見ているのか気になる。個人的には、PolarsやPandasの使い心地と開発者体験に、SQLの力と普遍性を組み合わせてくれるものだと考えている
      クエリはPolarsやPandasだけでなく、DuckDB、ClickHouse、BigQuery、Redshift、Postgres、Trino/Presto、SQLiteなど、好みのSQL互換実行エンジンで動かせる
      joinの構文とセマンティクスは最も難しい部分の一つなので、最近また議論している。関係代数の核心であり、PRQLのRにも当たる。PRQLの基本的な変換のほとんどはmap、filter、reduceのような単純なリスト操作だが、joinはモナド合成を保つには注意が必要だ。考えはここに残してある: https://github.com/PRQL/prql/issues/3782#issuecomment-1811312787
      そのissueは閉じられているが、新しいissueを開くか、@snthでタグ付けして意見を聞かせてほしい。ちなみに私はPRQLのコントリビューターだ
    • Pandasのデータフレーム結合で何が難しいのか気になる
  • 評価してみたところ、最大の利点はAPIがPandasよりはるかに一貫していて理解しやすかったことだ。Pandasの20のメジャーバージョンを見ながら学んできたはずなので、当然の面もある
    ただ、はるかに利用者が少ないため、CopilotがPolarsのコードをうまく書けなかった。なので今はPandasとCopilotを使い続けている。新しいライブラリ全般にこういう障壁があるのだと、今回初めて感じた

    • Copilotのサポートを理由にライブラリを好むと公言する人は初めて見た。判断したいわけではなく、興味深い
      それでもCopilotはリポジトリ内で非常に速く学習する。私は作者本人も使っておらず推奨もしていないTypeScriptのフォークであるTS-Plusで構成した、極度にカスタムなスタックを使っているが、Copilotはかなり良いTS-Plusコードを出してくる
      いくつか例を見た後なら、定型コードの段階でCopilotがかなりうまくなり得ることを過小評価しないほうがいい
    • Copilot対応は鶏と卵の問題だ。他の人たちのコードで学習する必要があるが、人々がCopilotなしでPolarsのコードを書かなければ、CopilotもPolarsのコードをよりうまく書けるようにはならない
    • JavaScriptの別のデータフレームライブラリであるdanfo.jsを使ったときも似たような感じだった。Copilotが機能やメソッド名をただ幻覚していた
      ドキュメントを読めば済むので大きな問題ではなかったが、必要なものをCopilotがすぐに出してくれないのは面倒だった
    • APIがより一貫していて理解しやすいと認めながら、Copilotが楽にしてくれるという理由だけでPandasに残るということなのか? 自分にとっても、オープンソースの革新のためにも、より良いと認めたツールを使うほうがいい
      私はPandas APIを長く使ってきたし、嫌っていた。学習、ツール、考え方、技術を継続的に改善することにはかなり積極的なほうだ
    • Polarsライブラリは急速に変わる。Copilotは使っていないが、システム指示に、例えばwith_columnwith_columnsに変わったといった最新情報を入れ、ドキュメント内容を追加すると、ChatGPTでかなり良い結果が得られた
  • DenoがJupyterサポートをリリースしたとき、nodejs-polarsはサポート対象のデータサイエンス中核ライブラリの一つだった
    https://blog.jupyter.org/bringing-modern-javascript-to-the-jupyter-notebook-fc998095081e
    個人的にはデータサイエンス側の人間ではないが、JS/Jupyterエコシステムがまだ初期段階であることを考えると、TypeScriptでpola.rsベースの分析を立ち上げるのは驚くほど速かった
    JSバインディングには確かに手を入れるべき部分があるが、アクセスしやすくなった分、反復的な改善が起きることを願っている

    • JSでPandasのようなものをずっと欲しいと思っていたが、初めて知った
  • Polarsには本当に期待しているし速度性能も印象的だが、vaex、modin、daskをすべて同じベンチマークで比較しているのは気になる
    これらのライブラリはいずれもアウトオブコアデータ処理、つまりデータが大きすぎて複数マシンにまたがって計算する用途を狙っている。単一マシンのデータフレームライブラリと比較するのは変だし、必然的にオーバーヘッドが大きいので遅くならざるを得ない
    そうしたライブラリと同じ文脈でPolarsを使うことはあまりないのに、同格のようにベンチマークに示すのは少しおかしい。しかもPolarsと同じ文脈で使えて、多くの場合より高速なDuckDBはベンチマークに入っていない
    Polarsのソフトウェアエンジニアリングは素晴らしい仕事であり、こうした誤解を招くベンチマークは必要ない

    • 他は分からないが、Daskは単一マシンでも使えるし、それがDaskを使う最も簡単な方法でもある。データフレームをパーティションに分け、各コアで処理して演算を並列化する
      設定なしでPandas比2倍の性能向上が可能で、特定の演算では5倍まで見たことがある
    • Pandasの創始者が作ったPythonデータフレームであるIbisはDuckDBをデフォルトバックエンドとして使い、一部のクエリ例外を除けば、通常こうしたベンチマークでPolarsに勝つ
  • Polarsを直接使っているわけではなく、DuckDBのワークフローで具現化形式として使っている
    duckdb.query(sql).pl()duckdb.query(sql).df() よりずっと速い。Polarsではゼロコピーなので即座に終わるが、PandasはDataFrameが大きいとかなり時間がかかる。そして構文が少し違うだけで、Pandas DataFrameのように操作できる
    大規模データセットを扱うのに非常に良い

  • Greenspunの第10法則([https://en.wikipedia.org/wiki/Greenspun's_tenth_rule)](https://en.wikipedia.org/wiki/Greenspun's_tenth_rule)))に対する系がありそうだ。十分に複雑なデータ分析ライブラリは、SQLの半分を場当たり的で非公式仕様で、バグが多く遅い形で実装することになる、という感じだ
    Pandasはたまに使うし、これもおそらく試すだろうが、作業中のデータをただPostgresに入れて始めればよかったといつも思う
    私はデータベースの専門家でもないし、Pythonのほうがずっと楽なのに、表形式データの選択・並べ替え・フィルタ・結合の機能はSQLのほうがはるかに優れている

    • DuckDBduckdb-prql 拡張を見ることを勧める
      DuckDBは、データのコピーや重複なしに、Polars、Pandas、そしてArrow形式のデータをSQLで直接扱えるようにしてくれる
      duckdb-prql はPRQL(prql-lang.org)を使えるようにしてくれ、個人的にはSQLの力と普遍性に、PolarsやPandasの使用感と開発者体験を組み合わせてくれるものだと思っている。ちなみに私はPRQLのコントリビューターだ
    • そうすることもできるが、「分析系」のクエリなら性能がかなり悪くなり、柔軟性と表現力も落ちる可能性が高い
      代わりにDuckDBを見てみる価値がある。SQL実装は場当たり的でもないし、バグだらけでも遅くも不完全でもない。仕様の形式性はよく分からないが、Polarsと互換がある
    • 個人的には遅延データフレーム構文は、クエリエンジンのフロントエンドとしてはるかに優れている。PolarsもSQLをサポートしているが、バグはたいていフロントエンドではなくクエリエンジンから出る
      こうしたエンジンで行う種類のクエリでは、PostgresはOLAPクエリエンジンより一桁倍は遅いはずだ
    • Pandasの創始者は、こうした理由でPostgresバックエンドを持つIbisを作った: https://ibis-project.org/backends/postgresql
      PythonのデータフレームとSQLを併用する、より良いアプローチだ
  • 数か月前、大きなPandasコードベースをPolarsへ移行しようとした。Pythonで分析やデータパイプラインをやるのはあまり好きではないのだが、複雑な変換はPandasだとJuliaやR(dataframes.jl、dplyr使用)より2〜5倍時間がかかる
    残念ながらPolarsも答えではなかった。標準的な演算にバグが多すぎ、Pandasとの相互運用性も不安定だった。多くのライブラリが入力としてPandas DataFrameを要求するので、これは問題だ。APIも現代的なデータフレームライブラリにしては非常に冗長だが、それでもPandasよりはましだ
    時間とともに解決されることを願うが、今のところはPandasの上でDuckDBを使うのがいちばん良かった。Polars並みに速く、より安定していて相互運用性も良い
    いつかPythonのデータフレームエコシステムも、Rのように直感的なAPIの分析志向データフレームライブラリ(dplyr)と高性能データフレームライブラリ(data.table)を一緒に簡単に使える地点に到達してほしい

    • 私も冗長さにはいら立った。Pandasもdata.tableのようなものと比べるとかなり冗長だが、Polarsは「データ操作ツール」というよりAPIを使っている感じが強い
      探索的データ分析や研究にはたぶん使わないと思うが、より良い性能のために一部の本番スクリプトでは使い始めている
      Rのdplyr + data.tableの組み合わせが、今でもいちばん気に入っているデータ操作体験だ。ただ、RにMatplotlibのようなものがあればよいのにと思う。ggplotは高水準すぎ、基本グラフィックスは低水準すぎる。Scikit-LearnもCaretよりずっとモジュール式なので、Caretが恋しいわけでもない
    • PRQL(prql-lang.org)をどう見ているのか気になる。SQLを使うどこででもdplyrの使用感を提供することを目指していて、SQLにコンパイルされる
      個人的には、dplyr、Polars、Pandasの開発者体験と、SQLの力と普遍性を組み合わせるものだと思っている。クエリはPolars、Pandasだけでなく、DuckDB、ClickHouse、BigQuery、Redshift、Postgres、Trino/Presto、SQLiteなど、好きなSQL互換実行エンジンで動かせる
      考えをGitHub Discussions(https://github.com/PRQL/prql/discussions)やDiscord(https://discord.com/invite/XWxbCrWr)で聞きたい。ちなみに私はPRQLのコントリビューターだ
    • R、Python、Juliaのデータフレームをすべて使った経験があるとはいいね。その中でどれがいちばん気に入っているのか気になる。エコシステムは直接比較できないだろうが、主要な演算のような作業基準ではどれがいちばん良かった?
    • DuckDBバックエンドのIbisも一度試してみる価値がある。個人的にはPolarsもかなり気に入っている。開発者たちは全体的にIssueへかなり素早く対応している
  • 私たちのデータサイエンスチームが Polars を評価しましたが、結果はまちまちでした。性能が重要な箇所があるなら導入を検討しますが、それ以外では数十のプロジェクトで Pandas を置き換えるコストのため、やや否定的でした

    • その判断は正しいと思います。今は、すでにうまく動いている Pandas を置き換える時期というより、実験する時期だと思います
      API にはまだ予想される破壊的変更があり、複数のプロジェクトにまたがると保守負担になり得ます。それでも API はすでにより一貫しているように感じられ、全体として正しい方向に進んでいるようです
    • コードをすべて書き直すのは避けたほうがよいです。ただし新しいコードでは導入したり評価したりする価値があります
      特に Pandas との相互運用コストは非常に低く、Arrow バックエンドを使えば Pandas への ゼロコピー変換もかなり簡単にできます
    • 今後は https://github.com/fugue-project/fugue があります
    • チームで pandasql を使っているのか、それとも主に Pandas API を直接使っているのか気になります