🌊

Pythonにおけるデータ分析の軽量化ライブラリ・拡張子の紹介(データ分析編)

に公開

簡単なまとめ

拡張子変換やライブラリを変換することで、大容量のデータを読み込むことができるが、互換性等を踏まえると下記の拡張子とライブラリに変換して動作を試してみるのが良いと考える

  • parquet(拡張子)
  • dask-dataframe(ライブラリ)
    ただ、処理を可能な限り書き換えたくないのであれば、Modinを使うのもおすすめである。Modinであればimport文を
    import pandas as pdからimport modin.pandas as pd
    に変える以外の変更は不要である。

背景

大規模なデータを取り扱う場合、メモリ量の制約や処理時間が非常にかかる問題があります。
これらの問題の考慮が漏れていた場合、

  • 処理中にメモリ切れで動作が停止
  • 処理に誤りがあったとしても、結果の出力に数時間や数日待つ

等、作業時間を無駄にしてしまう。かといって、データの軽量化のために列や行を減らすと、データが欠損することにより、分析結果が歪められる。また、JuliaやRustなど、メモリ効率の良い言語を使う方法も考えられるが、近年はCopilot等のコーディングエージェントがあるとはいえ、分析業務に取り掛かるのに必要以上にコストが掛かる為、業務や期限が決まっているタスクでは現実的ではない。
その為、一旦は普段分析に用いているPythonのライブラリや拡張子を変えることで何かできないか分析ライブラリや拡張子の調査を行った。

注意点

  • Lambdaなど、ローカル以外で使う場合、今回紹介するライブラリはファイルサイズが大きすぎるため、コンテナイメージ化してデプロイする必要がある点に注意してください。やり方に関してはこちらの記事でわかりやすく解説されている。

利用しているデータ

# 1億行のデータを持つPandas DataFrameを作成
num_rows = 1_000_000_00

# サンプルデータとしてランダムな整数を生成
data = {
    'col1': np.random.randint(0, 1000, size=num_rows),
    'col2': np.random.rand(num_rows),
}

テストで使っているのは1億行・2列のランダムな数値が格納された比較的小さめなデータフレームであり、決して大きなデータではない。欠損値も存在しない為、特にクレンジングも不要。

分析ライブラリ

行毎の列数が同じ等、既にある程度クレンジングされたデータに関しては

  1. polarsで読み込み
  2. 拡張子を軽量な拡張子であるparquetに変更
  3. 再度polarsで読み込み
  4. 加工後、分析or可視化

行毎の列数が異なる等、未クレンジングのデータに関しては

  1. vaex等のPandasベースかつ軽量なライブラリで読み込み、列数を揃える等の最低限の加工
  2. hdf5に変換して出力
  3. polarsでhdf5を読み込み
  4. 加工後、分析or可視化
    上記のような流れが良いと考える。
    ※vaexはcondaでないと環境構築がしづらいのとバージョンが古いので、別のpandasベースのライブラリの利用を推奨。

pandas

  • Pythonでデータ分析を行う際に(おそらく)最も基本となるライブラリ。

メリット

  • 情報量も多く、エラー等が起きた際でも検索すれば情報は出てくる。
  • データの整形にも優れており、関数のオプションのパラメータも多いので、未クレンジングのデータの取り扱いに非常に便利
  • Lambdaで利用する場合でも、有志により、Lambdaレイヤーが作られている等、コンテナ化する必要がない

デメリット

  • 処理速度は早くはない
  • メモリの効率が良くないため、数GB単位のデータだと処理することが難しい

dask-dataframe

pandasのように書ける並列処理に特化したライブラリ。メモリに乗らない量のデータも取り扱える。

メリット

  • 大容量データも読み込むことができ、そのまま簡易的な処理も可能
  • compute()をする前にクレンジングを行えば、メモリ消費量は少なく分析が可能
  • pandasベースなので、処理時に利用するコマンドはほぼ同じ

デメリット

  • compute()を行うまで、データの中身を見ながら方針を立てて作業ができない。
  • 0フィル等はcompute()を行うまでできない。(データの中身を確認せず、欠測値の処理をされるよりはマシですが)

polars

  • Rustベースの超高速なデータ分析ライブラリ。
  • 大規模データや処理速度が求められる用途に特化している。
  • polars-ds等の拡張機能を用いることで、データ分析により特化させることも可能。

メリット

  • メモリの効率も非常によく、大容量データも読み込むことができ、処理自体も圧倒的に高速
  • dask-dataframeとは異なり、データの中身を見つつ、加工等が可能

デメリット

  • pandasとは書き方がかなり異なるので、学習コストが比較的高い(最近はpolarifyとLLMのお陰でかなり低くはなっている)
  • 未クレンジングのデータを読み込もうとすると、Rustベースなのも相まって、エラーになることが多い

拡張子

分析ではなく、サービスで使う場合は、parquet等で加工後、csvかjson形式あたりに変更するのが良いと考える。

parquet

効率的なデータ処理用に作られた圧縮率が非常に高いデータ形式。

メリット

  • データの圧縮率が高く、Pythonだとライブラリによっては圧縮方法も細かく調整可能
  • 読み書きがCSVと比べると圧倒的に早い
  • csvやjson等の一般に流通しているファイル形式と比べると互換性は低いが、Snowflakeで使える等、互換性は決して低くはない

デメリット

  • あくまで分析用の形式なので、サービスで使う場合はデータ形式が必要になる可能性が高い
  • TS等、別の言語でファイルを読み込む場合、データ使用者に負担が多少かかる

hdf5

データ分析や科学計算に特化した階層化されたデータ形式。

メリット

  • データ分析や機械学習関連だとドキュメントが豊富

デメリット

  • pythonやC、Fortranのような分析に使われる言語以外だと使用は難しい
  • サービス等の互換性は高くない(分析以外にhdf5を使う事自体が稀ではあるが)

参考文献

Discussion