¿Cómo ayudar a los pandas a procesar grandes cantidades de datos?

La biblioteca de pandas es una de las mejores herramientas para el análisis exploratorio de datos . Pero esto no significa que los pandas sean una herramienta universal adecuada para resolver cualquier problema. En particular, estamos hablando de procesar grandes cantidades de datos. Pasé un tiempo muy, muy largo, esperando que los pandas leyeran muchos archivos o los procesaran, calculando sobre la base de la información contenida en ellos algunos indicadores que me interesan. El hecho es que los pandas no admiten mecanismos paralelos de procesamiento de datos. Como resultado, este paquete no aprovecha al máximo las capacidades de los modernos procesadores multi-core. Grandes conjuntos de datos en pandas se procesan lentamente.



Recientemente, me propuse encontrar algo que me ayudara en el procesamiento de big data. Logré encontrar lo que estaba buscando, incruste la herramienta encontrada en mi canal de procesamiento de datos. Lo uso para trabajar con grandes cantidades de datos. Por ejemplo, para leer archivos que contienen 10 gigabytes de datos, para filtrarlos y agregarlos. Cuando logro resolver tales problemas, guardo lo que obtuve en un archivo CSV más pequeño que es adecuado para pandas, y luego empiezo a trabajar con los datos obtenidos usando pandas.

Aquí hay un cuaderno Jupyter que contiene ejemplos de este material con los que puede experimentar.

Dask


La herramienta que uso para procesar grandes cantidades de datos es la biblioteca Dask . Es compatible con el procesamiento de datos en paralelo, lo que le permite acelerar el trabajo de las herramientas existentes. Esto incluye numpy, pandas y sklearn. Dask es un proyecto de código abierto gratuito. Utiliza API de Python y estructuras de datos, lo que facilita la integración de Dask en proyectos existentes. Si describimos brevemente Dask, entonces podemos decir que esta biblioteca simplifica la solución de problemas ordinarios y hace posible resolver problemas de enorme complejidad.

Comparando pandas y dask


Puedo describir las posibilidades de Dask aquí, ya que esta biblioteca tiene muchas cosas interesantes, pero en cambio, solo considero un ejemplo práctico. En el curso del trabajo, generalmente encuentro conjuntos de archivos grandes, cuyos datos deben ser analizados. Juguemos una de mis tareas típicas y creemos 10 archivos, cada uno de los cuales contiene 100,000 registros. Cada archivo tiene un tamaño de 196 MB.

from sklearn.datasets import make_classification
import pandas as pd
for i in range(1, 11):
    print('Generating trainset %d' % i)
    x, y = make_classification(n_samples=100_000, n_features=100)
    df = pd.DataFrame(data=x)
    df['y'] = y
    df.to_csv('trainset_%d.csv' % i, index=False)

Ahora lea estos archivos con pandas y mida el tiempo requerido para leerlos. No hay soporte integrado en pandas glob, por lo que tenemos que leer los archivos en un bucle:

%%time
import glob
df_list = []
for filename in glob.glob('trainset_*.csv'):
    df_ = pd.read_csv(filename)
    df_list.append(df_)
df = pd.concat(df_list)
df.shape

Los pandas tardaron 16 segundos en leer estos archivos:

CPU times: user 14.6 s, sys: 1.29 s, total: 15.9 s
Wall time: 16 s

Si hablamos de Dask, se puede notar que esta biblioteca le permite procesar archivos que no caben en la memoria. Esto se hace dividiéndolos en bloques y compilando cadenas de tareas. Midamos el tiempo que Dask necesita para leer estos archivos:

import dask.dataframe as dd
%%time
df = dd.read_csv('trainset_*.csv')
CPU times: user 154 ms, sys: 58.6 ms, total: 212 ms
Wall time: 212 ms

¡Dask tardó 154 ms! Como es esto posible? De hecho, esto no es posible. Dask implementa un paradigma de tarea retrasada. Los cálculos se realizan solo cuando se necesitan sus resultados. Describimos el gráfico de ejecución, que le da a Dask la capacidad de optimizar la ejecución de tareas. Repite el experimento. Tenga en cuenta que la función read_csvde Dask tiene soporte incorporado para trabajar con glob:

%%time
df = dd.read_csv('trainset_*.csv').compute()
CPU times: user 39.5 s, sys: 5.3 s, total: 44.8 s
Wall time: 8.21 s

El uso de la función computeobliga a Dask a devolver el resultado, para lo cual debe leer realmente los archivos. El resultado es que Dask lee archivos dos veces más rápido que los pandas.

Se puede decir que Dask le permite equipar proyectos de Python con herramientas de escala.

Comparación del uso de CPU en Pandas y Dask


¿Dask utiliza todos los núcleos de procesador en el sistema? Compare el uso de los recursos del procesador en pandas y en Dask al leer archivos. El mismo código que revisamos anteriormente se aplica aquí.


Uso de recursos del procesador al leer archivos con pandas


Uso de recursos del procesador al leer archivos con Dask

Un par de las imágenes animadas anteriores le permiten ver claramente cómo los pandas y Dask usan los recursos del procesador al leer archivos.

¿Qué pasa en las entrañas de Dask?


Un marco de datos de Dask consta de varios marcos de datos de pandas, que están separados por índices. Cuando ejecutamos una función read_csvdesde Dask, lee el mismo archivo mediante varios procesos.

Incluso podemos visualizar un gráfico de esta tarea.

exec_graph = dd.read_csv('trainset_*.csv')
exec_graph.visualize()


Gráfico de tiempo de ejecución de Dask al leer varios archivos

Desventajas de Dask


Quizás ahora tenga el siguiente pensamiento: "Si la biblioteca Dask es tan buena, ¿por qué no usarla en lugar de pandas?" Pero no tan simple. Solo algunas funciones de pandas se portan a Dask. El hecho es que ciertas tareas son difíciles de paralelizar. Por ejemplo, ordenar datos y asignar índices a columnas sin clasificar. Dask no es una herramienta que resuelva absolutamente todas las tareas de análisis y procesamiento de datos. Se recomienda usar esta biblioteca solo para trabajar con conjuntos de datos que no caben en la memoria por completo. Dado que la biblioteca Dask se basa en pandas, todo lo que funciona lentamente en pandas permanecerá lento en Dask. Como dije antes, Dask es una herramienta útil que puede incrustar en una tubería de procesamiento de datos, pero esta herramienta no reemplaza a otras bibliotecas.

Instalar Dask


Para instalar Dask, puede usar el siguiente comando:

python -m pip install "dask[complete]"

Resumen


En este artículo, solo toqué superficialmente las capacidades de Dask. Si está interesado en esta biblioteca, eche un vistazo a estos excelentes tutoriales sobre Dask y la documentación de datafreymam Dask. Y si desea saber qué funciones son compatibles con los marcos de datos de Dask, lea la descripción de la API DataFrame.

¿Usarías la biblioteca Dask?

Le recordamos que continuamos con el concurso de predicción en el que puede ganar un nuevo iPhone. Todavía hay tiempo para entrar y hacer el pronóstico más preciso sobre los valores tópicos.


All Articles