📑

既存のコードをほぼ書き換えずにデータ分析処理を高速化するmodinの紹介

に公開

簡単にまとめ

  • pandasのインポート文をmodin用のインポート文に変えるだけで、処理が高速化できる
  • インポート文の変更だけで済むので移行コストは極めて低い
  • 本格的に高速化したい場合は従来通り、polarsやdask-dataframeを用いた高速化を試すと良い
  • つよつよGPUが使えるかつ、処理を変えたくないという要件があるならばcuDF Pandasを使うほうがおそらく良い

準備

modinの概要

import pandas as pd # pandas用のインポート文
import modin.pandas as pd # modin用のインポート文
- 上記のようにpandasをインポートする際のインポート文を1行目から2行目に変更するだけで適用可能
- pandasだけでなく、dask等への利活用も可能
- globを用いてファイルをまとめて読み込む等、分析処理を楽にする機能が備わっている
- [snowflakeが買収済み](https://www.snowflake.com/en/blog/snowflake-to-acquire-ponder/)の為、クラウド上(具体的にはsnowpark for python)でも活用することができる。

### 環境構築
1. modinのインストール
google colaboratoryを開き、
```python
pip install "modin[all]"

でmodin関連パッケージを一通りインストール。
2. テストデータ作成
numpyを用いて100万行×10列の乱数データを作成する

import numpy as np
# 厳密性は不要だとは思うが、念の為、シード値を設定
np.random.seed(100)
# 100万×10列の乱数データ生成
num_rows = 1_000_000
num_cols = 10

test_data = np.random.rand(num_rows, num_cols)

Modinの使用例

ファイルの読み込み

環境構築で作成したテストデータをmodinで読み込む

import modin.pandas as pd
test_dataframe = pd.DataFrame(test_data)

複数ファイルの読み込み

modinのexperimentalパッケージにはglobを用いずともまとめてファイルを読み込む関数がある。
pandasのread〇〇で読み込めるcsvやparquet、json等の一般的なデータ形式はread_〇〇_globを用いることで、ワイルドカードを使ってまとめて読み込める。
詳細はこちらを参照

import pandas as pd
import numpy as np

# 先程作成したテストデータを20万行×10列の5つのデータセットに分割
num_splits = 5
data_parts = np.array_split(test_data, num_splits)

# 分割したファイルをCSVで書き出し
for i, part in enumerate(data_parts):
    df_part = pd.DataFrame(part)
    file_name = f'test_data_part_{i+1}.csv'
    df_part.to_csv(file_name, index=False)
    print(f'Saved {file_name} with shape {part.shape}')

# modinのread_csv_globを用いてワイルドカードでまとめて読み込み
import modin.experimental.pandas as pd
df = pd.read_csv_glob("test_data_part_*")


20万行×10列のデータを5つ読み込んだが、自動で結合されている

別データ形式からの変換

modinはpandasやdask等のデータベースからの相互変換機能も持つ。インポート文を変えるだけで、modin化できる為、あまり使わないと思うが紹介

import pandas as pd
import modin.pandas as mpd

df = pd.DataFrame(test_data)
# pandasからmodin.pandasへ変換
mdf = mpd.from_pandas(df)
# modin.pandasからpandasへ変換
mpd.to_pandas(mdf)

便利機能

tqdmを処理時に表示する

pip install tqdm
from modin.config import ProgressBar
ProgressBar.enable()

スプレッドシート形式で結果を表示する

import modin.pandas as pd
import modin.experimental.spreadsheet as mss
df = pd.read_csv('https://raw.githubusercontent.com/fivethirtyeight/data/master/college-majors/all-ages.csv')
spreadsheet = mss.from_dataframe(df)
spreadsheet

Discussion