Pandas で関数をベクトル化する
ベクトル化は、関数をより効率的に評価できる形式に変換する方法です。 それらを配列に変換することにより、Python でのデータ処理を高速化します。 ループを使用せずに Python コードを高速化します。
Pandas ライブラリは、Python でデータの分析と操作を行うための一般的なツールです。 コードのパフォーマンスを向上させるために、Pandas のベクトル化を数値計算でよく使用します。
Pandas データ フレームは、データ フレームの上に構築されたデータ構造であり、R データ フレームと Python 辞書の両方の機能を提供します。 これは Python 辞書に似ていますが、Excel テーブルや行と列を持つデータベースなど、すべてのデータ分析および操作機能を備えています。
Pandas で関数をベクトル化する
Python ライブラリ pandas
をインストールして、データ フレームをインポートしましょう。
PS C:\> pip install pandas
データ フレームでベクトル化を実行するには、Python ライブラリ pandas
を使用してインポートします。 以下のコードを実行してデータ フレームをインポートし、連結によって大きくしてみましょう。
コード例 (demo.py
に保存):
import pandas as pd
small_df = pd.read_csv("Salaries.csv")
df = pd.concat([small_df] * 100, ignore_index=True)
以下のコードを実行して、データ分析用のデータ フレームの合計行数を計算します。
コード例 (demo.py
に保存):
print(f"No of rows: {len(df)}")
出力 (コンソールに出力):
No of rows: 14865400
以下のコードを実行して、ベクトル化せずにデータ フレームで実行された操作の消費時間を見てみましょう。
コード例 (demo.py
に保存):
import time
import numpy
start_time = time.process_time()
pay_with_tax = np.zeros(len(df))
for idx, pay in enumerate(df.TotalPay.values):
pay_with_tax[idx] = pay * 1.05 + 1
end_time = time.process_time()
print("Without using Vectorization")
print(f"pay_with_tax = {pay_with_tax}")
print(f"Computation time = {(1000*(end_time - start_time ))}ms")
関数 np.zeros()
は、サイズを len(df)
として受け取り、指定されたサイズのゼロの配列を作成します。for
ループは、pay_with_tax
配列とデータの TotalPay
列の両方を繰り返します。 有料
としてフレーム。
pay
ごとに税金を計算し、pay_with_tax
に格納します。
出力 (コンソールに出力):
ベクトル化により、SIMD (Single Instruction Multiple Data) アプローチを使用する操作に柔軟性が追加されます。 Pandas では、バッチ API
がループを使用せずに操作を高速化します。
ベクトル化を使用して salary_with_tax
の計算にかかる時間を計算する以下のコードを実行してみましょう。
コード例 (demo.py
に保存):
start_time = time.process_time()
pay_with_tax = df.TotalPay.values * 1.05 + 1
end_time = time.process_time()
print("Using Vectorization")
print(f"pay_with_tax = {pay_with_tax}")
print(f"Computation time = {(1000*(end_time - start_time ))}ms")
出力 (コンソールに出力):
上記のコードに少し変更を加えることで、mean
、sqrt
などの numpy
ライブラリの統計操作を適用することもできます。
コード例 (demo.py
に保存):
import numpy as np
# non vectorized
for idx, pay in enumerate(df.TotalPay.values):
pay_with_tax[idx] = np.mean(pay)
# vectorized
pay_with_tax = df["TotalPay"].apply(np.mean)
ベクトル化の有無にかかわらず、消費時間の違いを確認できます。 業界では、数百万行から数兆行のビッグ データを処理しています。
このデータをベクトル化されていない方法で計算すると、時間がかかります。 したがって、Pandas データ フレームのベクトル化の柔軟な性質は、高速なデータ分析と操作に役立ちます。