cómo acelerar las pandas

Cómo acelerar su código Pandas por 10x

OK, en realidad solo sal de Pandas. Pruebe NumPy, en su lugar.

Como todos sabemos, Pandas es una fantástica herramienta de ciencia de datos. Nos proporciona la estructura DataFrame que necesitamos y poderosas capacidades computacionales, todo en un formato fácil de usar. Incluso tiene documentación de calidad y una gran red de soporte, lo que la convierte en una biblioteca fácil de aprender. Pandas es todo excelente.

Pero Pandas no es particularmente rápido.

Cuando se trata de muchos cálculos y el método de procesamiento es lento, el programa tarda mucho en ejecutarse. Esto significa que, si se trata de millones de cómputos, el tiempo total de cómputo se extiende una y otra vez…

¿Necesita acelerar los pandas? Pruebe NumPy en su lugar.

NumPy tiene todas las capacidades de cálculo de Pandas, pero utiliza métodos optimizados precompilados. Esto significa que NumPy puede ser significativamente más rápido que Pandas. Convertir un DataFrame de Pandas a NumPy es relativamente sencillo. Puede usar la función .to_numpy() de marcos de datos para convertirlo automáticamente, luego crear un diccionario de los nombres de las columnas para permitir el acceso a cada celda (similar a la función .loc de Pandas).

Este es un problema común en el trabajo que hago. Cuando desarrollo modelos de simulación que representan equipos comunes en edificios, creo funciones que emulan los procesos de transferencia de calor y controlo decisiones lógicas en un equipo determinado. Luego paso datos que describen las condiciones de construcción y las opciones de comportamiento de los ocupantes a esos modelos. Los modelos predicen qué hará el equipo, qué tan bien satisfará las necesidades de los ocupantes y cuánta energía consumirá.

Para hacer eso, los modelos deben estar basados ​​en el tiempo y ser capaces de calcular lo que sucede en un punto dado de la simulación. Solo entonces el modelo puede pasar al siguiente conjunto de cálculos. En otras palabras, las salidas en un momento determinado son las entradas para la próxima vez. Por ejemplo, imagina predecir la temperatura de tu horno en cualquier momento. ¿Actualmente está calentando? ¿Cuánto ha aumentado la temperatura desde la última vez que revisó? ¿Cuál era la temperatura en ese momento?

Esta dependencia del tiempo anterior genera un problema: no podemos usar cálculos vectoriales. Debemos usar los temidos bucles for. Los bucles for son lentos. ¿Asi que que hacemos?

Prueba NumPy

Una solución (ya sea posible o no vectorizar los cálculos) es convertir sus cálculos a NumPy. Numpy tiene todas las capacidades de cómputo de Pandas, pero las realiza sin llevar tanta información general mientras usa métodos precompilados y optimizados.

Según Sofia Heisler en Upside Engineering Blog, NumPy realiza una gran cantidad de información de fondo utilizando código C precompilado. Este código C precompilado hace que NumPy sea significativamente más rápido que Pandas al omitir el paso de compilación e incluir optimizaciones de velocidad preprogramadas. Además, NumPy suelta mucha de la información que encuentras en Pandas. Pandas realiza un seguimiento de los tipos de datos, los índices y realiza la verificación de errores, todo lo cual es muy útil, pero también ralentiza los cálculos. NumPy no hace nada de eso, por lo que puede realizar los mismos cálculos mucho más rápido.

Hay varias formas de convertir datos de Pandas a NumPy.

Puede convertir una serie utilizando el .valuesmétodo. Esto crea la misma serie en NumPy. 

Aquí hay un ejemplo: 

import pandas as pd
Series_Pandas = pd.Series(data=[1, 2, 3, 4, 5, 6])
Series_Numpy = Series_Pandas.values

Puede convertir un DataFrame usando la .to_numpy()función. Esto crea un objeto int64 con los mismos valores en NumPy. Tenga en cuenta que esto no conserva los nombres de las columnas, y debe crear un diccionario que convierta los nombres de las columnas de Pandas en números de columnas NumPy. Puedes lograr esto con el siguiente código:

import pandas as pd
import numpy as np
Dataframe_Pandas = pd.DataFrame(data=[[0,1], [2,3], [4,5]], columns = ['First Column', 'Second Column'])
Dataframe_Numpy = Dataframe_Pandas.to_numpy()
Column_Index_Dictionary = dict(zip(Dataframe_Pandas.columns, 
list(range(0,len(Dataframe_Pandas.columns)))))

Ese código convierte el DataFrame en un objeto NumPy int64 y proporciona todas las herramientas que necesita para iterar a través de cada línea y editar valores en columnas específicas, todo de una manera fácil de usar. Puede llamar a cada celda de manera similar a la función Pandas .loc con indexación NumPy siguiendo la estructura int64object[row, Dictionary[‘Pandas Column Name’]]

Por ejemplo, si desea establecer el valor en la primera fila de la Segunda columna en nueve, puede usar el siguiente código:

Dataframe_Numpy[0, Column_Index_Dictionary['Second Column']] = 9

¿Cuánto más rápido hace esto mi código?

La velocidad variará de un proyecto a otro; algunos scripts verán más mejoras al cambiar a NumPy que otros. Depende de los tipos de cálculos utilizados en su secuencia de comandos y el porcentaje de todos los cálculos convertidos a NumPy. Dicho esto, los resultados pueden ser drásticos.

Vectorizando con Pandas y NumPy

Por ejemplo, recientemente usé este proceso para convertir uno de mis modelos de simulación de una base Pandas a una base NumPy. El modelo original basado en Pandas requirió 362 segundos (alrededor de seis minutos) para realizar una simulación anual. Eso no está mal si está ejecutando una simulación con el modelo, pero ¿qué sucede si está ejecutando mil? Eso es 100 horas. Después de convertir el núcleo del modelo a NumPy, la misma simulación anual requirió 32 segundos para calcularse. Esas mismas 1000 simulaciones solo tomarían 8 horas con NumPy.

Eso es el 9 por ciento del tiempo para hacer lo mismo. En este caso, vi un aumento de más de 10 veces en la velocidad después de convertir mi código de Pandas a NumPy. 

Inmersiones profundas en ciencia de datos integrada. Utilice la precisión y la recuperación para evaluar su modelo de clasificación

Este artículo se publicó originalmente en Hacia la ciencia de datos .