Mejora del rendimiento de pandas con Modin

Una de las bibliotecas más utilizada para la manipulación y análisis de datos en Python es pandas. Con ella es posible manipular tablas y series temporales. Además, ofrece la posibilidad de importar datos desde archivos CSV o Excel para su posterior manipulación. Al trabajar con grandes conjuntos de datos el tiempo de procesado puede ser un problema. Por lo que cualquier mejora del rendimiento de pandas es siempre interesante. Un paquete que promete mejorar el rendimiento de pandas es modin, en esta entrada se va a probar si esto es así.

Instalación de Modin

La instalación de Modin se puede realizar a través de pip como la mayoría de las librerías de Python. La instalación solamente requiere que se escriba en la terminal el siguiente comando.

pip install modin

Modin acelerar el rendimiento de los objetos DataFrame mediante la paralelización de las tareas. Una de sus grandes ventajas es que puede reemplazar a pandas y funcionar con el mismo código. Por lo que cambiar de pandas a Modin solo requiere cambiar la línea en la que se importa la librería.

Evaluación de la mejora del rendimiento de pandas con Modin

La mejora del rendimiento que ofrece Modin dependerá del número de núcleos del ordenador en el que se ejecute. Esperándose un factor de mejora igual al de núcleos disponibles. Una forma de comprobar esto es ver cómo mejora la carga de archivos con Modin respecto a pandas.

Para ello se procederá a importar archivos de diferente tamaño con pandas y Modin. Cada uno de los archivos se importará cinco veces y se medirá su tiempo medio de carga.

Carga de archivos con pandas

La carga de los archivos con pandas se puede realizar y medir con el siguiente código.

from timeit import default_timer as timer
import pandas as pd

files = ['001Mb.csv', '006Mb.csv', '015Mb.csv', '033Mb.csv',
         '090Mb.csv', '271Mb.csv', '723Mb.csv']
sizes = [1, 6, 15, 33, 90, 271, 723]

time = [ [] for i in range(len(files)) ]

for file in range (len(files)):
    for i in range(5):
        start = timer()
        df = pd.read_csv(files[file])
        end = timer()
        time[file].append((end - start)) 

pandas = [sum(t)/len(t) for t in time]

En este se carga cada uno de los archivos cinco veces y se calcula el tiempo necesario para ello. Este tiempo se agrega a un vector y finalmente se calcula la media para cada uno de los archivos.

Carga de archivos con Modin

La carga de los archivos con Modin solamente requiere cambiar una línea de código. En lugar de importar pandas se ha de importar modin.pandas. Esto es lo que se muestra en el siguiente código.

import modin.pandas as pd

time = [ [] for i in range(len(files)) ]

for file in range (len(files)):
    for i in range(5):
        start = timer()
        df = pd.read_csv(files[file])
        end = timer()
        time[file].append((end - start)) 

modin = [sum(t)/len(t) for t in time]

Comparación de los resultados

La mejor forma de comprar los resultados es de forma gráfica. Simplemente representado el tiempo transcurrido con cada una de las librerías. También se puede comprobar cual ha sido la mejora, si esta existe, de utilizar Modin en lugar de pandas. Esto es lo que se hace con el siguiente código.

import matplotlib.pyplot as plt
import numpy as np

index = np.arange(len(sizes))
width = 0.35

fig, ax1 = plt.subplots()

ax1.bar(index, pandas, width, label='pandas')
ax1.bar(index + width, modin, width, label='modin')
ax2 = ax1.twinx()
plt.plot(index, [ m/p for m, p in zip(modin, pandas) ])

ax1.set_xlabel(u'Tamaño (Mb)')
ax1.set_ylabel(u'Tiempo (s)')
ax2.set_ylabel(u'modin / pandas')
ax1.legend()
plt.xticks(index, sizes)

plt.show()

Obteniéndose la siguiente gráfica.

Comparación de la carga de archivos en Modin frente a pandas
Comparación de la carga de archivos en Modin frente a pandas

En esta se puede ver el tiempo necesario para importar los diferentes archivos. Además, en el eje de la derecha se puede apreciar la ratio entre el tiempo que necesita Modin y pandas. Lo primero que se puede apreciar es que, con archivos pequeños, aproximadamente de 1 Mb, Modin es considerablemente más lento que pandas (tarda 12 veces). Pero eso ya cambia cuando el tamaño del archivo supera los 6 Mb. A partir de ahí la mejora que se obtiene es considerable. En la configuración utilizada, un procesador con dos núcleos, Modin tarda en importar los archivos menos de la mitad (0,47 veces) con los archivos más grandes.

Conclusiones

En esta entrada se ha comparado el rendimiento de dos librerías para trabajar con objetos DataFrame en Python: pandas y Modin. Observándose que se puede obtener una mejora del rendimiento de pandas con Modin en un factor proporcional a número de procesadores. Eso sí, cuando el tamaño del archivo supera un cierto límite. En las pruebas este ha sido de 6 Mb.

Así se puede concluir que Modin es una buena opción para reemplazar pandas cuando es necesario trabajar con archivos de cierto tamaño. Aunque, cuando se trabaja con archivos de tamaños modestos, por debajo del par de Mb, no es aconsejable.

Imágenes: Pixabay (Free-Photos)

Sin votos
Por favor espera...

Suscríbete a nuestro boletín

Si te ha gustado el contenido puedes suscribirte al boletín semanal para recibir en su correo electrónico todas las novedades publicadas en Analytics Lane.
La dirección de correo suministradas se utilizará únicamente para enviar un correo semanal con las últimas publicaciones aparecidas en el blog. Los datos nunca serán utilizados para otros fines diferentes. Para más información puede consular nuestra Política de Privacidad.

Contenido relacionado

Etiquetas:

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *