¿Cómo Procesar un DataFrame con Millones de Filas en Segundos?

Roman Orac
Aug 21, 2021

¿Cómo Procesar un DataFrame con Millones de Filas en Segundos?

Aug 21, 2021 7 minutes read

Otra biblioteca de Python para el análisis de datos que deberías conocer - y no, no estoy hablando de Spark o Dask

El análisis de Big Data en Python está teniendo su renacimiento. Todo comenzó con NumPy, que es también uno de los bloques de construcción detrás de la herramienta que estoy presentando en este artículo.

Puedes leer más artículos de Data Science en español aquí

En 2006, el Big Data era un tema que estaba ganando terreno poco a poco, especialmente con el lanzamiento de Hadoop. Pandas le siguió poco después con sus DataFrames. 2014 fue el año en que Big Data se convirtió en la corriente principal, también Apache Spark fue lanzado ese año. En 2018 llegó Dask y otras librerías para la analítica de datos en Python.

Cada mes encuentro una nueva herramienta de Data Analytics, que estoy deseando aprender. Merece la pena invertir una o dos horas en tutoriales, ya que a la larga puede ahorrarte mucho tiempo. También es importante mantenerse en contacto con las últimas tecnologías.

Si bien puedes esperar que este artículo sea sobre Dask, estás equivocado. He encontrado otra biblioteca de Python para el análisis de datos que deberías conocer.

Al igual que Python, es igual de importante que te hagas con el dominio de SQL. En caso de que no estés familiarizado con él, y tengas algo de dinero de sobra, echa un vistazo a este curso: Master SQL, the core language for Big Data analysis.

El análisis de Big Data en Python está teniendo su renacimiento

Conoce Vaex


Vaex es una biblioteca de Python de alto rendimiento para lazy Out-of-Core DataFrames (similar a Pandas), para visualizar y explorar grandes conjuntos de datos tabulares. 
 
Puede calcular estadísticas básicas para más de mil millones de filas por segundo. Soporta múltiples visualizaciones que permiten la exploración interactiva de big data. 
 
¿Cuál es la diferencia entre Vaex y Dask?


Vaex no es similar a Dask, pero sí a los DataFrames de Dask, que están construidos sobre los DataFrames de pandas. Esto significa que Dask hereda los problemas de pandas, como el alto uso de memoria. Este no es el caso de Vaex.

Vaex no hace copias de DataFrame por lo que puede procesar DataFrame más grandes en máquinas con menos memoria principal.

Tanto Vaex como Dask utilizan el procesamiento "perezoso". La única diferencia es que Vaex calcula el campo cuando es necesario, mientras que con Dask tenemos que utilizar explícitamente la función de cálculo.

Los datos deben estar en formato HDF5 o Apache Arrow para aprovechar al máximo las ventajas de Vaex.

Puedes leer más artículos de Data Science en español aquí 

¿Cómo se instala Vaex?

Instalar Vaex es tan sencillo como instalar cualquier otro paquete de Python:

pip install vaex

Vamos a hacer un test drive de Vaex 



Vamos a crear un DataFrame de pandas con 1 millón de filas y 1000 columnas para crear un archivo de big data.

import vaex
import pandas as pd
import numpy as np
n_rows = 1000000
n_cols = 1000
df = pd.DataFrame(np.random.randint(0, 100, size=(n_rows, n_cols)), columns=['col%d' % i for i in range(n_cols)])
df.head()


First few lines in a Pandas Dataframe (image made by author)

¿Cuánta memoria principal utiliza este DataFrame?

df.info(memory_usage='deep')


Guardémoslo en el disco para poder leerlo después con Vaex.

file_path = 'big_file.csv'
df.to_csv(file_path, index=False)

No ganaríamos mucho leyendo todo el CSV directamente con Vaex ya que la velocidad sería similar a la de pandas. Ambos necesitan aproximadamente 85 segundos en mi portátil.

Tenemos que convertir el CSV a HDF5 (el Formato de Datos Jerárquicos versión 5) para ver el beneficio con Vaex. Vaex tiene una función para la conversión, que incluso soporta archivos más grandes que la memoria principal mediante la conversión de trozos más pequeños.

Si no puedes abrir un archivo grande con pandas, por limitaciones de memoria, puedes convertirlo a HDF5 y procesarlo con Vaex.

Puedes leer más artículos de Data Science en español aquí 


dv = vaex.from_csv(file_path, convert=True, chunk_size=5_000_000)

Esta función crea un archivo HDF5 y lo persigue en el disco. 
 
¿Cuál es el tipo de datos de dv?

type(dv)
# output
vaex.hdf5.dataset.Hdf5MemoryMapped

Ahora, vamos a leer el conjunto de datos de 7,5 GB con Vaex - No necesitaríamos leerlo de nuevo porque ya lo tenemos en la variable dv. Esto es sólo para probar la velocidad.

dv = vaex.open('big_file.csv.hdf5')

Vaex necesitó menos de 1 segundo para ejecutar el comando anterior. Pero Vaex no leyó realmente el archivo, debido a la carga perezosa, ¿verdad? 
 
Vamos a forzar a leerlo calculando una suma de col1.

suma = dv.col1.sum()
suma
# Output
# array(49486599)

Este me sorprendió mucho. Vaex necesitó menos de 1 segundo para calcular la suma. ¿Cómo es posible? 
 
La apertura de estos datos es instantánea, independientemente del tamaño del archivo en el disco. Vaex se limitará a mapear en memoria los datos en lugar de leerlos en memoria. Esta es la forma óptima de trabajar con grandes conjuntos de datos que son mayores que la memoria RAM disponible. 
 
Ploteando
 
Vaex también es rápido a la hora de graficar los datos. Dispone de funciones especiales de trazado: plot1d, plot2d y plot2d_contour.

dv.plot1d(dv.col2, figsize=(14, 7))


Plotting with Vaex (image made by author)

Columnas virtuales 
 
Vaex crea una columna virtual al añadir una nueva columna, una columna que no ocupa la memoria principal ya que se calcula sobre la marcha.

dv['col1_plus_col2'] = dv.col1 + dv.col2
dv['col1_plus_col2']


The virtual column in Vaex (image made by author)

Filtrado eficiente 
 
Vaex no crea copias de DataFrame al filtrar los datos, lo cual es mucho más eficiente en cuanto a la memoria.

dvv = dv[dv.col1 > 90]

Aggregations


Las agregaciones funcionan de forma ligeramente diferente que en pandas, pero lo más importante es que son rapidísimas. 
 
Añadamos una columna virtual binaria donde col1 ≥ 50. 

dv['col1_50'] = dv.col1 >= 50
 
Vaex combina la agrupación por y la agregación en un solo comando. El siguiente comando agrupa los datos por la columna "col1_50" y calcula la suma de la columna col3.

dv_group = dv.groupby(dv['col1_50'], agg=vaex.agg.sum(dv['col3']))
dv_group


Aggregations in Vaex (image made by author)

Joins

Vaex une datos sin hacer copias de memoria, lo que ahorra la memoria principal. Los usuarios de Pandas estarán familiarizados con la función join:

dv_join = dv.join(dv_group, on=’col1_50')

Conclusión


Al final, te preguntarás: ¿Debemos simplemente cambiar de pandas a Vaex? La respuesta es un gran NO.
 
Pandas sigue siendo la mejor herramienta para el análisis de datos en Python. Tiene funciones bien soportadas para las tareas de análisis de datos más comunes.
 
Cuando se trata de archivos más grandes, pandas puede no ser la herramienta más rápida. Este es un gran momento para usar Vaex.
 
Vaex es una herramienta que deberías añadir a tu caja de herramientas de análisis de datos.
 
Cuando trabajes en una tarea de análisis en la que pandas es demasiado lento o simplemente se bloquea, saca Vaex de tu caja de herramientas, filtra las entradas más importantes y continúa el análisis con pandas.
 
Sígueme en Twitter, donde tuiteo regularmente sobre Ciencia de Datos y Aprendizaje Automático

Join our private community in Discord

Keep up to date by participating in our global community of data scientists and AI enthusiasts. We discuss the latest developments in data science competitions, new techniques for solving complex challenges, AI and machine learning models, and much more!