今回はPandasの上位互換ライブラリ
Polarsのご紹介です。
解説動画はこちら
Polarsについて
導入方法について
Google Colabは導入済みなので
インストール不要です
インストール方法
Pandasで作ったCSVをそのまま読み込みします。
今度は4つのカラムを条件にした
やや複雑な集計です。
こちらは6倍くらい早くなっています。
1億行くらいの計算において
5倍くらいは速いそうなので
触れ込みと同等の性能を感じられます。
まとめ
そのほかにもデータの加工や
前処理も柔軟な記述が実現できたり
Polarsのご紹介です。
解説動画はこちら
Polarsについて
Rustで実装された高速なデータ操作ライブラリ
Pandasに似たAPIを持ち
大規模データセットでより高速に動作するようです
Pandasの上位互換に当たりそうです。
大規模データセットでより高速に動作するようです
Pandasの上位互換に当たりそうです。
導入方法について
Python3.7以上が必要です
Google Colabは導入済みなので
インストール不要です
インストール方法
pip install polars
大容量データの用意
Pandas , Polarsで同様のデータを使用するように
ランダム値で1000万行を用意しました。
こちらがデータ生成のコードです。
こんな感じのデータになります。
Polarsのデータの用意こちらがデータ生成のコードです。
# ライブラリのインポート 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)
こんな感じのデータになります。
# CSVファイルの読み込み df2 = pl.read_csv("dataset.csv")
Pandasで作ったCSVをそのまま読み込みします。
PandasとPolarsの計算比較
1カラムをフィルタリングして
Groupby集計するコードです。
PandasとPolarsで掛かった秒数を計測します。
掛かった時間は3/2くらいになっています。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 秒
今度は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についてお伝えしました。
それでは。
かなりオススメのライブラリになっています。
Pandasももう古いので
今後はPolars等が主流になっていくんだと
考えられますね
今回はPandasの上位互換である
Polarsについてお伝えしました。
それでは。
コメントする