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.
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)
Deja una respuesta