見出し画像

pandasの代替案: Fireducks,Vaex, Polars, Modinを徹底比較!どれが最適?

本記事はFireDucksユーザー記事シリーズの第4弾です.本記事は黒柳茂様に執筆して頂きました


1. はじめに

pandasの一般的な使用と課題

Pandasはデータ分析の世界でよく使われるPythonライブラリで、データの読み込み、加工、分析を簡単に行えます。特にその使いやすさと柔軟性は、多くのデータサイエンティストやアナリストに愛用されています(私も10年以上愛用しています!)しかし、Pandasは大きなデータセットを扱うときにメモリ消費が高くなり、処理速度が低下するという課題があり、これは特にメモリ容量が限られているノートパソコンなどの環境や、高速な処理が要求される本番環境のような状況で問題となることがあります。このため、より効率的なデータ処理を実現するために、Pandasの代替ライブラリへの関心が高まっています。

なぜ代替モジュールが必要とされているのか

昨今のデジタル化の加速により、企業に蓄積されているデータ量が増加しています。Statistaによると2025年には181ZB(ゼタバイト=1000ペタバイト)になるとの予測が出ています。そのようなデータ増大に処理するハードウェアもソフトウェアも対応していく必要があります。

データが非常に大きい場合、PySparkなどを利用して複数のマシンで分散処理させるのですが、一方、シングルマシンのローカル環境でアドホックなスクリプトもしくはNotebookを使ってテストや分析をするということもまだまだ日常茶飯事です。そのような時、データが大きければ大きいほど処理時間が大きくなり、データサイエンティストの待ち時間は多くなります。

この待ち時間。本当に無駄なんですよね。。。

「他のことやればいいじゃない?」と思われるかもしれないのですが、気になるんです。分析結果が良いのか、悪いのか。僕が書いたコードが最後の最後でエラーを吐かないか。そして今待っているこの処理が1分で終わるのか、30分かかるか分からないので処理が終わっていないか画面をみてしまう。
受験生の合格発表のような気分で他のタスクに集中し切れない(僕だけかもしれませんが。。。)

このような待ち時間はできるだけ少ない方が良いです。色々調査してみると前回の記事で紹介したFireducks以外にもどうやら様々な高速化ライブラリが存在しておりました。今回はそれらのライブラリの比較をしてみて色々と知見を共有していきたいと思います。


2. 各モジュールの紹介

前回の記事でFireducksを紹介しましたが、それ以外にも有名どころとして下記のようなモジュールが存在しました。それぞれのモジュールを紹介していきたいと思います。

  • Fireducks:NECが開発した高速化ライブラリ。NECの30年以上のスーパーコンピュータ開発のノウハウが詰まっている。Pandasのデータ処理速度を大幅に向上させ、データ分析にかかる時間とコストを削減することができる

  • Vaex:オープンソースのデータフレームライブラリです。大規模なデータセットを効率的に処理するために、メモリマッピング、ゼロメモリコピー方針、遅延計算などの機能を持っている

  • Polars:Rustで書かれたマルチスレッド、ベクトル化されたクエリエンジンを搭載したデータフレームライブラリです。パフォーマンスを重視して設計されており、効果的な並行処理を可能にするRustで書かれたマルチスレッドクエリエンジンを備えています。Polarsは、キャッシュ効率の良いアルゴリズムや高性能なプロセッサーを利用し、ベクトル化およびカラムベースの処理を実現しています。

  • Modin:Modinは、Pandasのワークフローを単一のコード行の変更でスケーリングするためのライブラリです。Snowflakeが2023年に買収しました。Ray、Dask、またはUnidistを使用して、Pandasのノートブック、スクリプト、ライブラリを高速化する方法を提供します。ModinはPandasとのシームレスな統合と互換性を持ち、DataFrameのコンストラクターの使用もPandasと同じです。事前に利用可能なハードウェアリソースを知る必要はなく、データの分散や配置を指定する必要もありません。

3. 分析の条件

前提条件

WSL2(Windows Subsystem for Linux)というWindows上でLinuxを動かせる環境から試しています。私が試した環境は下記の通りです。

OS Microsoft Windows 11 Pro
バージョン 10.0.22631 ビルド 22631
システムモデル Z690 Pro RS
システムの種類 x64-ベース PC プロセッサ 12th Gen Intel(R) Core(TM) i3-12100、3300 Mhz、 4 個のコア、8 個のロジカル プロセッサ
ベースボード製品 Z690 Pro RS
プラットフォームの役割 デスクトップ
インストール済みの物理メモリ (RAM)64.0 GB

各モジュールの処理速度、メモリ使用量、使い勝手などを比較

 データサイエンティストとして色々処理に待たされてきましたが、いくつかのデータ処理フェーズにおいて処理に時間がかかるところがあります、下記の4つにおいて評価ができると良いなと思っています。

  1. 入出力 (I/O)
    「入出力 (I/O)」の段階では、データの入力と出力を処理します。データベース、CSVファイルなどのデータソースからデータを読み込んだり、データを保存したりする作業が含まれます。

  2. 探索的データ分析 (EDA)
    「探索的データ分析 (EDA)」では、データの特徴を理解し、データ内のエラーや異常を検出することに注目します。この段階では、データの分布、欠損値、異常値、相関関係などを視覚的に分析するために、グラフや統計的要約を多用します。EDAは、データの潜在的な洞察を得るための重要なステップです。

  3. データ変換 (DT)
    「データ変換 (DT)」の段階では、データを分析に適した形式に変換します。これには、カテゴリカルデータのエンコーディング、データの結合、集約などが含まれます。例えば、テキストデータを数値に変換したり、複数のデータソースを統合したりすることがあります。このプロセスは、データを分析モデルに適した形に整えることで、より精度の高い分析結果を得るために不可欠です。

  4. データクリーニング (DC)
    最後に「データクリーニング (DC)」では、データの品質を確保し、分析結果の信頼性を高めるために、データのクリーニングを行います。これには、欠損データの処理、誤ったデータの修正、外れ値の検出と除去などが含まれます。

使用するデータセット


Kaggleのデータセットをお借りして評価をしていきたいと思います。
2.8GBのCSVファイル(deleted_post.csv)を使います。

4. 比較結果


パフォーマンス比較

3GB近いデータをEDAしたりデータ前処理をするのには時間がかかる。Pandasで実施した時間と比較して、すべてのモジュールで早くなった。PolarsとFireDucksはほぼ変わらないパフォーマンスだった。
Polars, FireDucks, Vaexという順で高速化された。

グループ毎パフォーマンス比較

GBスケールのデータ分析で一番処理としてかかるのはI/Oであり、この処理を削減できるfireducks, polarsに大きな魅力を感じる。

詳細パフォーマンス比較

Pandasで良く利用する関数をI/O, EDA, データ変換, データクレンジングというグループに分けて各モジュールの処理時間を計測した結果が以下だ。
一番処理に時間がかかるのは、I/O read_csv, to_csv, dedup, groupby, sortであり、私の感覚と一致する。そのような処理で一番パフォーマンスが良かったのがPolarsとFireducksだった。
CSVを読み込むのに17秒かかっていたのが、polarsを利用すれば1.4秒で処理が終わるというのは驚愕である。

各モジュールの総評

私としては、FireDucksを推したい。なぜならコードを書き換える必要がないのにも関わらず、二番手のパフォーマンス向上を果たせたからだ。polarsとvaexには少し手を焼いた。pandasの記述に踏襲している部分は多いが、細かいところで書き換えが必要になってくる。

書き換えることなくパフォーマンス向上できるというのは大きな利点である。FireducksはNECによって開発されたもので、メンテナンスされていく安心感がある。

VaexはI/O以外の処理には目覚ましいものがあったが、肝心のI/O処理が速くない。また、使い勝手にはPandasとの違いがあり、ある程度の学習曲線が必要だ。

PolarsはRustに基づいており、非常に高速なパフォーマンスであった。しかし、PolarsもまたPandasとは異なるAPIを持っており、ユーザーは新しいAPIに慣れる必要がある。

ModinにおいてもPandasを書き換えることはなく、パフォーマンス向上を見られた。ModinはRayやDaskのような分散計算エンジンを持っており、シングルサーバーというよりは、TBスケールのデータを扱うのが得意なのだと感じる。

#pandas
df['ParentPostID'] = df['ParentPostID'].fillna(' ')
df['ProfileID'] = df['ProfileID'].replace(to_replace=r'^ABC.*', value='Unknown', regex=True)

#polars
df = df.with_columns(df['ParentPostID'].fill_null(' ').alias('ProfileID'))
df = df.with_columns(
  pl.col('ProfileID').apply(lambda x: 'Unknown' if re.match(r'^ABC.*', x) else x).alias('ProfileID')
 )

企業のデータサイエンティストやエンジニアがどのように利用できるかの最終的な意見

データサイエンティストの皆様
・ノールックでimport pandas as pd⇒import fireducks.pandas as pdとするだけで高速化はかなりメリットが大きいのではないだろうか?日常のEDA、分析などでも利用でき、テーブルデータを処理して中間テーブル作る系のETLなどでpandas使っていたら一度検討しても良いと感じる。

ガチでデータ処理のパフォーマンス向上を目指している方
・polarsとFireDucksの中でどれくらい処理速度が違うかを検証した方が良い。polarsは学習コストとコードのリファクタリングに一定の時間はかかルガ、一度習得したら非常に強い味方になること間違いなしだ。

参考文献


この記事が気に入ったらサポートをしてみませんか?