今回はPandasの上位互換ライブラリ
Polarsのご紹介です。


解説動画はこちら


 

Polarsについて


Rustで実装された高速なデータ操作ライブラリ
Pandasに似たAPIを持ち
大規模データセットでより高速に動作するようです

Pandasの上位互換に当たりそうです。



導入方法について

Python3.7以上が必要です

Google Colabは導入済みなので
インストール不要です

インストール方法
pip install polars




大容量データの用意

Pandas , Polarsで同様のデータを使用するように
ランダム値で1000万行を用意しました。

こちらがデータ生成のコードです。
# ライブラリのインポート
import pandas as pd
import numpy as np
import polars as pl
import time

# サンプルデータを生成
np.random.seed(0)
num_rows = 10000000
names = ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank', 'Grace', 'Hannah', 'Ivy', 'Jack', 'Karen', 'Leo']
genders = ['Male', 'Female', 'Other']
prefectures = ['Hokkaido', 'Aomori', 'Iwate', 'Miyagi', 'Akita', 'Yamagata', 'Fukushima', 
               'Ibaraki', 'Tochigi', 'Gunma', 'Saitama', 'Chiba', 'Tokyo', 'Kanagawa', 
               'Niigata', 'Toyama', 'Ishikawa', 'Fukui', 'Yamanashi', 'Nagano', 'Gifu', 
               'Shizuoka', 'Aichi', 'Mie', 'Shiga', 'Kyoto', 'Osaka', 'Hyogo', 'Nara', 
               'Wakayama', 'Tottori', 'Shimane', 'Okayama', 'Hiroshima', 'Yamaguchi', 
               'Tokushima', 'Kagawa', 'Ehime', 'Kochi', 'Fukuoka', 'Saga', 'Nagasaki', 
               'Kumamoto', 'Oita', 'Miyazaki', 'Kagoshima', 'Okinawa']
favorite_foods = ['Sushi', 'Ramen', 'Tempura', 'Soba', 'Udon', 'Yakitori', 'Okonomiyaki', 
                  'Takoyaki', 'Sashimi', 'Gyoza', 'Katsudon', 'Tonkatsu']

start_date = np.datetime64('2024-01-01')
end_date = np.datetime64('2024-12-31')
date_range_days = (end_date - start_date).astype(int) + 1

data = {
    'id': np.arange(1, num_rows + 1),
    'name': np.random.choice(names, num_rows),
    'gender': np.random.choice(genders, num_rows),
    'prefecture': np.random.choice(prefectures, num_rows),
    'favorite_food': np.random.choice(favorite_foods, num_rows),
    'age': np.random.randint(18, 70, size=num_rows),
    'salary': np.random.randint(210000, 1690000, size=num_rows),
    'day': start_date + np.random.randint(0, date_range_days, size=num_rows)
}
# データフレームを生成
df = pd.DataFrame(data)

# データを保存
df.to_csv("dataset.csv", index=False)


df.shape
(10000000, 8)

こんな感じのデータになります。
スクリーンショット 2024-08-03 16.55.54


Polarsのデータの用意

# CSVファイルの読み込み
df2 = pl.read_csv("dataset.csv")

Pandasで作ったCSVをそのまま読み込みします。



PandasとPolarsの計算比較

1カラムをフィルタリングして
Groupby集計するコードです。

PandasとPolarsで掛かった秒数を計測します。
# データのフィルタリングと集計(Pandas)

# 計測開始
start_time = time.time()
result = df[df['age'] > 30].groupby('gender')['salary'].sum().reset_index()
print(result)

# 計測終了
end_time = time.time()

# 経過時間を計算
elapsed_time = end_time - start_time

print(f"経過時間: {elapsed_time} 秒")
経過時間: 3.2436938285827637 秒

# データのフィルタリングと集計(Polars)

# 計測開始
start_time = time.time()
result2 = df2.filter(pl.col("age") > 30).group_by("gender").agg(pl.sum("salary"))
print(result2)

# 計測終了
end_time = time.time()

# 経過時間を計算
elapsed_time = end_time - start_time

print(f"経過時間: {elapsed_time} 秒")
経過時間: 1.849299430847168 秒

掛かった時間は3/2くらいになっています。

今度は4つのカラムを条件にした
やや複雑な集計です。
# データのフィルタリングと集計(Pandas)

# 計測開始
start_time = time.time()

# 条件に基づいてデータをフィルタリング
average_salary = df[(df['age'] > 30) & 
                 (df['gender'] == 'Male') & 
                 (df['prefecture'] == 'Tokyo') & 
                 (df['favorite_food'] == 'Sushi')]['salary'].mean()

print(f"Average salary: {average_salary:.2f}")

# 計測終了
end_time = time.time()

# 経過時間を計算
elapsed_time = end_time - start_time

print(f"経過時間: {elapsed_time} 秒")
経過時間: 2.3793530464172363 秒

# データのフィルタリングと集計(Polars)

# 計測開始
start_time = time.time()
average_salary = df2.filter(
    (pl.col('age') > 30) & 
    (pl.col('gender') == 'Male') & 
    (pl.col('prefecture') == 'Tokyo') & 
    (pl.col('favorite_food') == 'Sushi')
)['salary'].mean()

# 結果を表示
print(f"Average salary: {average_salary:.2f}")

# 計測終了
end_time = time.time()

# 経過時間を計算
elapsed_time = end_time - start_time

print(f"経過時間: {elapsed_time} 秒")
経過時間: 0.4078397750854492 秒

こちらは6倍くらい早くなっています。


1億行くらいの計算において
5倍くらいは速いそうなので
触れ込みと同等の性能を感じられます。


まとめ

1000万行でも、条件が複雑になるほど差が出ていて
巨大なデータを扱う業界で
データ分析している人には有用なライブラリです。

そのほかにもデータの加工や
前処理も柔軟な記述が実現できたり
apply などの、加工で遅い部分を解消できるので
かなりオススメのライブラリになっています。

Pandasももう古いので
今後はPolars等が主流になっていくんだと
考えられますね

今回はPandasの上位互換である
Polarsについてお伝えしました。

それでは。