Pandas で関数をベクトル化する

Hira Arif 2023年6月21日
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")

出力 (コンソールに出力):

pandas で関数をベクトル化する - vectorized

上記のコードに少し変更を加えることで、meansqrt などの 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 データ フレームのベクトル化の柔軟な性質は、高速なデータ分析と操作に役立ちます。

関連記事 - Pandas DataFrame