Vectorizar una función en Pandas

Hira Arif 15 febrero 2024
Vectorizar una función en Pandas

La vectorización es una forma de convertir una función en una forma que la evalúe de manera más eficiente. Acelera el procesamiento de datos en Python al convertirlos en matrices. Acelera el código de Python sin usar un bucle.

La biblioteca Pandas es una herramienta popular en Python para el análisis y la manipulación de datos. Usamos Vectorización en Pandas comúnmente en computación numérica para mejorar el rendimiento del código.

Un marco de datos de Pandas es una estructura de datos construida sobre un marco de datos, que proporciona la funcionalidad de los marcos de datos R y los diccionarios de Python. Es como un diccionario de Python pero con todas las capacidades de análisis y manipulación de datos, como tablas de Excel y bases de datos con filas y columnas.

Vectorizar una función en Pandas

Instalemos la biblioteca de Python pandas para importar marcos de datos.

PS C:\> pip install pandas

Para realizar la vectorización en un marco de datos, lo importamos usando la biblioteca de Python pandas. Ejecutemos el siguiente código para importar un marco de datos y hacerlo grande a través de la concatenación.

Código de ejemplo (guardado en demo.py):

import pandas as pd

small_df = pd.read_csv("Salaries.csv")
df = pd.concat([small_df] * 100, ignore_index=True)

Ahora ejecute el siguiente código para calcular el número total de filas del marco de datos para el análisis de datos.

Código de ejemplo (guardado en demo.py):

print(f"No of rows: {len(df)}")

SALIDA (impresa en la consola):

No of rows: 14865400

Veamos el tiempo de consumo de una operación realizada en el marco de datos sin vectorización ejecutando el siguiente código.

Código de ejemplo (guardado en 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")

La función np.zeros() toma el tamaño como len(df) y crea una matriz de ceros del tamaño especificado. El bucle for itera sobre la matriz pay_with_tax y la columna TotalPay de los datos enmarcar como pago.

Calcula el impuesto para cada pago y lo almacena en pago_con_impuestos.

SALIDA (impresa en la consola):

vectorizar una función en pandas - no vectorizada

La vectorización agrega flexibilidad a las operaciones utilizando enfoques SIMD (instrucción única, datos múltiples). En Pandas, una API por lotes acelera las operaciones sin usar bucles.

Ejecutemos el código dado a continuación que usa la vectorización para calcular el consumo de tiempo en el cálculo de salario_con_impuestos.

Código de ejemplo (guardado en 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")

SALIDA (impresa en la consola):

vectorizar una función en pandas - vectorizado

También puede aplicar operaciones estadísticas de la biblioteca numpy, como mean, sqrt, etc., agregando pequeños cambios al código anterior.

Código de ejemplo (guardado en 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)

Puede ver la diferencia en el consumo de tiempo, con o sin vectorización. Las industrias manejan de millones a billones de filas de big data.

Calcular estos datos con un enfoque no vectorizado lleva mucho tiempo. Por lo tanto, la naturaleza flexible de la vectorización en los marcos de datos de Pandas ayuda en el análisis y la manipulación de datos rápidos.

Artículo relacionado - Pandas DataFrame