📑
既存のコードをほぼ書き換えずにデータ分析処理を高速化する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