¿Pandas 2.0 ¿Un cambio de juego para los científicos de datos?
¿Pandas 2.0, un cambio de juego para científicos de datos?
Las 5 mejores características para la manipulación eficiente de datos
Debido a su extensa funcionalidad y versatilidad, pandas
ha asegurado un lugar en el corazón de cada científico de datos.
Desde la entrada/salida de datos hasta la limpieza y transformación de datos, es casi imposible pensar en la manipulación de datos sin import pandas as pd
, ¿verdad?
Ahora, aguanta conmigo: con tanto revuelo alrededor de LLMs en los últimos meses, ¡de alguna manera dejé pasar el hecho de que pandas
acaba de sufrir una gran actualización! Sí, ¡pandas 2.0
está disponible y llegó con todo!
Aunque no estaba al tanto de todo el revuelo, la comunidad de AI centrada en datos acudió rápidamente al rescate:

Dato curioso: ¿sabías que esta versión se encontraba en desarrollo durante asombrosos 3 años? ¡Eso es lo que yo llamo “compromiso con la comunidad”!
- Evolución del panorama de los datos.
- Inteligencia Artificial Verde Métodos y Soluciones para Mejorar la ...
- Ludwig – Un marco de aprendizaje profundo más amigable
Entonces, ¿qué trae pandas 2.0
a la mesa? ¡Sumergámonos en ello!
1. Rendimiento, Velocidad y Eficiencia de Memoria
Como todos sabemos, pandas
fue construido utilizando numpy
, que no fue diseñado intencionalmente como un backend para las bibliotecas de dataframe. Por esa razón, una de las principales limitaciones de pandas
era el manejo de procesamiento en memoria para conjuntos de datos más grandes.
En esta versión, el gran cambio viene de la introducción del backend Apache Arrow para los datos de pandas.
Essencialmente, Arrow es un formato de datos de columnas en memoria estandarizado con bibliotecas disponibles para varios lenguajes de programación (C, C++, R, Python, entre otros). Para Python hay PyArrow, que se basa en la implementación de Arrow en C++, ¡y por lo tanto, es rápido!
Entonces, resumiendo, PyArrow se encarga de nuestras limitaciones de memoria anteriores a las versiones 1.X y nos permite realizar operaciones de datos más rápidas y eficientes en memoria, especialmente para conjuntos de datos más grandes.
Aquí hay una comparación entre la lectura de datos sin y con el backend pyarrow
, utilizando el conjunto de datos de Hacker News, que tiene alrededor de 650 MB (Licencia CC BY-NC-SA 4.0):
Comparación de read_csv(): Usando el backend pyarrow es 35 veces más rápido. Fragmento del autor.
Como puede ver, el uso del nuevo backend hace que la lectura de los datos sea casi 35 veces más rápida. Otros aspectos dignos de señalar son:
- Sin el backend
pyarrow
, cada columna/función se almacena como su propio tipo de datos único: las características numéricas se almacenan comoint64
ofloat64
, mientras que los valores de cadena se almacenan como objetos; - Con
pyarrow
, todas las funciones están utilizando los tipos de datos Arrow: observe la anotación[pyarrow]
y los diferentes tipos de datos:int64
,float64
,string
,timestamp
ydouble
:
df.info(): Investigando los tipos de datos de cada DataFrame. Fragmento por Autor.
2. Tipos de datos Arrow e índices de Numpy
Más allá de leer datos, que es el caso más simple, puedes esperar mejoras adicionales para una serie de otras operaciones, especialmente aquellas que involucran operaciones de cadena , ya que la implementación de pyarrow
del tipo de dato cadena es bastante eficiente:
Comparando operaciones de cadena: mostrando la eficiencia de la implementación de Arrow. Fragmento por Autor.
De hecho, Arrow tiene más (y mejor soporte para) tipos de datos que numpy
, que se necesitan fuera del ámbito científico (numérico): fechas y horas , duración , binarios , decimales , listas y mapas . Revisar la equivalencia entre los tipos de datos respaldados por pyarrow y numpy
realmente podría ser un buen ejercicio en caso de que desees aprender cómo aprovecharlos.
También es posible ahora tener más tipos numéricos de numpy en los índices. Los tradicionales int64
, uint64
y float64
han abierto espacio para todos los valores de índices de tipos numéricos de numpy, de modo que podemos, por ejemplo, especificar su versión de 32 bits en vez de la de 64 bits:
Aprovechando los índices de 32 bits de numpy, haciendo que el código sea más eficiente en términos de memoria. Fragmento por Autor.
Este es un cambio bienvenido ya que los índices son una de las funcionalidades más utilizadas en pandas
, permitiendo a los usuarios filtrar, unir y reorganizar los datos, entre otras operaciones de datos. Básicamente, cuanto más ligero sea el índice, más eficientes serán esos procesos.
3. Manejo más fácil de valores faltantes
Al estar construido sobre numpy
, fue difícil para pandas
manejar valores faltantes de manera sencilla y flexible, ya que numpy
no admite valores nulos para algunos tipos de datos.
Por ejemplo, los enteros se convierten automáticamente en flotantes , lo cual no es ideal:
Valores faltantes: Conversión a flotante. Fragmento por Autor.
Observa cómo points
cambia automáticamente de int64
a float64
después de la introducción de un único valor None
.
No hay nada peor para un flujo de datos que tener tipos incorrectos , especialmente dentro de un paradigma de inteligencia artificial centrado en los datos.
Los tipos incorrectos afectan directamente las decisiones de preparación de datos, causan incompatibilidades entre diferentes fragmentos de datos e incluso, cuando pasan desapercibidos, pueden comprometer ciertas operaciones que devuelven resultados sin sentido a cambio.
Como ejemplo, en la Comunidad de IA Centrada en los Datos , actualmente estamos trabajando en un proyecto sobre datos sintéticos para la privacidad de los datos . Una de las características, NOC
(número de hijos), tiene valores faltantes y, por lo tanto, se convierte automáticamente en flotante
cuando se cargan los datos. Luego, al pasar los datos a un modelo generativo como un flotante
, podemos obtener valores de salida como decimales, como 2,5 — a menos que seas un matemático con 2 hijos, un recién nacido y un sentido del humor extraño, tener 2,5 hijos no está bien.
En pandas 2.0, podemos aprovechar dtype = 'numpy_nullable'
, donde los valores faltantes se tienen en cuenta sin cambios en los tipos de datos , para que podamos mantener nuestros tipos de datos originales ( int64
en este caso):
Aprovechando ‘numpy_nullable’, pandas 2.0 puede manejar valores faltantes sin cambiar los tipos de datos originales. Fragmento por Autor.
Puede parecer un cambio sutil , pero debajo del capó significa que ahora pandas
puede utilizar nativamente la implementación de Arrow para manejar valores nulos . Esto hace que las operaciones sean mucho más eficientes , ya que pandas
no tiene que implementar su propia versión para manejar valores nulos para cada tipo de dato.
4. Optimización de Copia por Escritura
Pandas 2.0 también agrega un nuevo mecanismo de copia perezosa que pospone la copia de los objetos DataFrames y Series hasta que sean modificados.
Esto significa que ciertos métodos devolverán vistas en lugar de copias cuando la copia por escritura esté habilitada, lo que mejora la eficiencia de la memoria al minimizar la duplicación innecesaria de datos.
También significa que debes tener mucho cuidado al usar asignaciones encadenadas.
Si el modo de copia por escritura está habilitado, las asignaciones encadenadas no funcionarán porque apuntan a un objeto temporal que es el resultado de una operación de indexación (que bajo la copia por escritura actúa como una copia).
Cuando copy_on_write
está desactivado, operaciones como el rebanado pueden cambiar el DataFrame original si el nuevo dataframe se cambia:
Copia por Escritura Deshabilitada: el dataframe original cambia en las asignaciones encadenadas. Fragmento por el autor.
Cuando copy_on_write
está habilitado, se crea una copia en la asignación y, por lo tanto, el dataframe original nunca cambia. Pandas 2.0 generará un ChainedAssignmentError
en estas situaciones para evitar errores silenciosos:
Copia por Escritura Habilitada: el dataframe original no cambia en las asignaciones encadenadas. Fragmento por el autor.
5. Dependencias Opcionales
Al usar pip
, la versión 2.0 nos brinda la flexibilidad de instalar dependencias opcionales, lo que es una ventaja en términos de personalización y optimización de recursos.
Podemos adaptar la instalación a nuestros requisitos específicos, sin gastar espacio en disco en lo que realmente no necesitamos.
Además, ahorra muchos “dolores de cabeza” de dependencias, reduciendo la probabilidad de problemas de compatibilidad o conflictos con otros paquetes que podemos tener en nuestros entornos de desarrollo:
Instalación de dependencias opcionales. Fragmento por el autor.
¡Poniéndolo a prueba!
Aún así, la pregunta persistió: ¿realmente está justificado el alboroto? Tenía curiosidad por ver si pandas 2.0
proporcionaba mejoras significativas en relación con algunos paquetes que uso a diario: ydata-profiling, matplotlib, seaborn, scikit-learn.
De esos, decidí probar ydata-profiling —acaba de agregar soporte para pandas 2.0, lo que parecía imprescindible para la comunidad! En la nueva versión, los usuarios pueden estar seguros de que sus pipelines no se romperán si están utilizando pandas 2.0, ¡y eso es una gran ventaja! Pero, ¿qué más?
A decir verdad, ydata-profiling ha sido una de mis herramientas favoritas para el análisis exploratorio de datos, y es una referencia agradable y rápida también — una línea de código en mi lado, pero bajo el capó está lleno de cálculos que como científico de datos necesito trabajar — estadísticas descriptivas, trazado de histogramas, análisis de correlaciones, y así sucesivamente.
¿Qué mejor manera de probar el impacto del motor pyarrow
en todo eso de una sola vez con un esfuerzo mínimo?
Pruebas de referencia con ydata-profiling. Fragmento por el autor.
Nuevamente, la lectura de datos es definitivamente mejor con el motor pyarrow
, aunque la creación del perfil de datos no ha cambiado significativamente en términos de velocidad.
Sin embargo, las diferencias pueden depender de la eficiencia de la memoria, para lo cual tendríamos que realizar un análisis diferente. Además, podríamos investigar aún más el tipo de análisis que se está realizando sobre los datos: para algunas operaciones, la diferencia entre las versiones 1.5.2 y 2.0 parece ser insignificante.
Pero lo principal que noté que podría marcar una diferencia a este respecto es que ydata-profiling aún no aprovecha los tipos de datos pyarrow
. Esta actualización podría tener un gran impacto tanto en la velocidad como en la memoria, ¡y es algo que espero en futuros desarrollos!
El Veredicto: ¡Rendimiento, Flexibilidad, Interoperabilidad!
Esta nueva versión de pandas 2.0
trae mucha flexibilidad y optimización de rendimiento con modificaciones sutiles pero cruciales “debajo del capó”.
Tal vez no sean “llamativas” para los recién llegados al campo de la manipulación de datos, pero seguramente son como agua en el desierto para los veteranos científicos de datos que solían saltar a través de aros para superar las limitaciones de las versiones anteriores.
En resumen, estas son las principales ventajas introducidas en la nueva versión:
- Optimización de rendimiento: Con la introducción del backend de Apache Arrow, más índices de dtype de numpy y modo de copia en escritura;
- Flexibilidad y personalización agregadas: Permitiendo a los usuarios controlar dependencias opcionales y aprovechar los tipos de datos de Apache Arrow (¡incluyendo la nulabilidad desde el principio!);
- Interoperabilidad: Quizás una ventaja menos “aclamada” de la nueva versión pero con un gran impacto. ¡Como Arrow es independiente del lenguaje, los datos en memoria se pueden transferir entre programas construidos no solo en Python, sino también en R, Spark y otros que usan el backend de Apache Arrow!
¡Y ahí lo tienes, amigos! Espero que este resumen haya calmado algunas de sus preguntas sobre pandas 2.0
y su aplicabilidad en nuestras tareas de manipulación de datos.
¡Todavía tengo curiosidad por saber si has encontrado diferencias importantes en tu codificación diaria con la introducción de pandas 2.0
también! Si estás interesado, ven y encuéntrame en la Comunidad de IA Centrada en Datos y hazme saber tus pensamientos. ¿Nos vemos allí?
Sobre mí
Ph.D., Investigador de Aprendizaje Automático, Educador, Defensor de Datos y en general “hombre para todo”. Aquí en Zepes, escribo sobre IA centrada en datos y calidad de datos, educando a las comunidades de Ciencia de Datos y Aprendizaje Automático sobre cómo pasar de datos imperfectos a datos inteligentes.
Relaciones con Desarrolladores @ YData | Comunidad de IA Centrada en Datos | GitHub | Instagram | Google Scholar | LinkedIn