En un proyecto reciente, tuve que comparar varios conjuntos de datos almacenados externamente. Después de haber usado Python durante más de cinco años, instintivamente recurrí a Pandas para mis necesidades de disputa de datos.
Pandas
Pandas es una biblioteca de Python utilizada para el análisis de datos y la manipulación en conjuntos de datos etiquetados. La misión central del equipo de desarrollo de Pandas es “… ser el bloque de construcción de alto nivel basic para realizar un análisis práctico de datos del mundo actual en Python. Además, tiene el objetivo más amplio de convertirse en la herramienta de análisis/manipulación de datos de código abierto más potente y versatile disponible en cualquier idioma”. Proporciona herramientas y métodos para alinear, fusionar, transformar y cargar y escribir datos de varias tiendas persistentes, como bases de datos Excel, CSV y SQL. Ha existido desde 2008 y ahora se considera la herramienta definitiva para el análisis de datos en Python, con un amplio uso de las ventas a la bioinformática.
A medida que los conjuntos de datos se hicieron más grandes, con algunas tablas superiores a 5 millones de filas, noté tiempos de espera más largos para funciones específicas. Fue entonces cuando comencé a explorar formas de optimizar mi código y descubrí polares.
Polares
Los polares, que es relativamente nuevo, se originó en 2020. Funciona de manera comparable a los pandas y ofrece herramientas y métodos para alinear, fusionar, transformar y cargar, así como escribir datos de varios formatos, incluidos Excel, CSV, SQL y el formato IPC de Apache Arrow.
Algunos de los objetivos centrales del equipo de desarrollo de Polars son:
- Utiliza todos los núcleos disponibles en su máquina.
- Optimiza consultas para reducir las asignaciones de trabajo/memoria innecesarias.
- Maneja los conjuntos de datos mucho más grandes que su RAM disponible.
- Una API consistente y predecible.
- Se adhiere a un esquema estricto (se deben conocer los tipos de datos antes de ejecutar la consulta).
Inicialmente, nada parece destacar significativamente. Ambas bibliotecas manejan datos tabulares y buscas de soporte, agregaciones y otros cálculos en conjuntos de datos. También aprovechan la serie (una estructura de datos comparable a una matriz etiquetada) y los marcos de datos (una colección de sequence) como elementos centrales. También puede crear funciones de Python personalizadas para generar nuevos datos a partir de datos existentes. Sin embargo, después de refactorizar algunas tareas básicas, desde los pandas hasta los polares y el uso del comando Magic %% TimeIT, pude notar objetivamente mejoras significativas de rendimiento, que se alinean con la filosofía central.
Metodología de prueba
Mis pruebas implicaron generar un conjunto de datos aleatorio de seis millones de filas para probar cuatro operaciones básicas:
- Filtración
- Operaciones aritméticas (por ejemplo, agregar columnas juntas)
- Manipulación de cuerdas
- y transformación utilizando una función de pitón personalizada
El conjunto de datos de prueba consta de los siguientes campos:
uuid: cadena
ip_address: cadena
Fecha: cadena
País: cadena
200: entero
400: entero
500: entero
Y se generó usando el siguiente código:
import random
import uuid
from faker import Faker
large_data_set = {'uuid': [str(uuid.uuid4()) for _ in range(0,6000000)],
'ip_address': [f"{random.randint(1,254)}.{random.randint(1,254)}.{random.randint(1,254)}.{random.randint(1,254)}" for _ in range(0,6000000)],
'date': [f"{random.randint(1990,2026)}-{random.randint(1,13):02}-{random.randint(1,29):02}" for _ in range(0,6000000)],
'nation':[f"{Faker().country()}" for _ in range(0,6000000)],
'200': [random.randint(1,300) for _ in range(0,6000000)],
'400': [random.randint(1,300) for _ in range(0,6000000)],
'500': [random.randint(1,300) for _ in range(0,6000000)]
}
Uso básico
Instalación
Ambos se pueden instalar convenientemente usando PIP
Pandas:
pip set up pandas
Polares:
pip set up polars
Cargando un conjunto de datos
Tanto los pandas como los polares apoyan la lectura de CSV, y las declaraciones de importación son idénticas.
Pandas:
import pandas as pd
large_df = pd.read_csv('large_dataset_20250728.csv')
Polares:
import polars as pl
large_df = pl.read_csv('large_dataset_20250728.csv')
Ambos representan sus respectivos marcos de datos en un formato tabular; Sin embargo, Pandas también incluye una serie índice.
Pandas:
Polares:
Filtración
La sintaxis de filtrado es ligeramente diferente. La sintaxis de filtrado de pandas es algo más compacta, donde Polars presenta un método explícito “Filtro”. En este ejemplo, estoy filtrando en función del país, “Guam” y la fecha, “2023-07-11”. ¡De los resultados, puede ver que los polares son muy rápido!
Pandas:
Polares:
Suma
Además del filtrado, ocasionalmente necesito realizar un poco de aritmética ligera en las columnas. En este ejemplo, estoy sumando tres columnas, “200”, “400” y “500”, luego almacenando el resultado en una nueva columna “whole”. Con polares, esto es significativamente más rápido.
Pandas:
Polares:
Operaciones de cadena
Tanto los pandas como los polares ofrecen métodos para realizar diversas operaciones en los tipos de datos de cadenas. Con los pandas, la sintaxis es sencilla y más pitónica. Sin embargo, la sintaxis para una operación comparable en polares parece ser más compleja, pero proporciona un impulso de rendimiento significativo. En este ejemplo, estoy dividiendo la columna “Fecha”, que contiene cadenas que parecen “yyyy-mm-dd”, en columnas separadas de “año”, “mes” y “día”.
Pandas:
Polares:
Operaciones en elementos
¡Aquí es donde las cosas comienzan a ser un poco más interesantes! Si bien la función establecida en pandas y polares es bastante potente, hay momentos en que es posible que necesite escribir una función personalizada para iterar sobre todos los elementos de una serie para generar nuevos datos para su uso posterior. En este ejemplo, estoy usando la biblioteca de iPaddress de Python para determinar la versión IP de la columna IP_Address, devolviendo el valor como un entero y creando una nueva columna con el resultado.
Nuevamente, la sintaxis de Pandas parece ser mucho más easy en comparación con los polares. Sin embargo, no parece haber un aumento significativo de rendimiento en el uso de polares para una transformación por elemento. Esto se debe a que la función IP_Version no es un método de polares inherentes y, por lo tanto, está sujeta al bloqueo de intérprete world (GIL). Python no optimiza de forma nativa el rendimiento de la forma en que lo hace Polars, y no hay ventaja en el uso de polares para operaciones como esta.
Pandas:
Polares:
Conclusión
Resumen de resultados
Tiempo en segundos | Pandas | Polares | Diferencia | % Mejora |
Consulta | 0.43 | 0.00249 | 0.42751 | 99.42 |
Suma | 0.0157 | 0.00254 | 0.01316 | 83.82 |
Operaciones de cadena | 3.21 | 0.0324 | 3.1776 | 98.99 |
Funciones personalizadas en elementos | 10.5 | 9.9 | 0.6 | 5.71 |
Algunos puntos clave
- Polars ofrece ganancias de rendimiento significativas para las sequence nativas y las operaciones de marco de datos.
- Las operaciones que no son métodos polares nativos no heredan las ganancias de rendimiento en ningún grado significativo.
- La sintaxis es ligeramente más compleja que los pandas.
- Pandas es una biblioteca más madura que juega bien con otras herramientas de análisis de datos.
Según mi experiencia con ambas herramientas, utilizaría las siguientes pautas:
Use polares cuando:
- Los cálculos y operaciones de DataFrame se pueden realizar utilizando las herramientas de polares nativos.
- La velocidad de las operaciones es esencial, y el conjunto de datos puede caber en la memoria.
- Si las bibliotecas o módulos que utilizarán un marcador de datos Polars como entrada admiten explícitamente Polars DataFrames.
Usa pandas cuando:
- La velocidad de los cálculos y operaciones no es crítica o actualmente cae dentro de los estándares aceptables.
- Desea utilizar una biblioteca de análisis de datos de Python que actualmente tenga el alcance más amplio entre equipos u organizaciones.
- DataFrame puede usarse como una entrada o junto con otras bibliotecas, o es posible que desee aprovechar el conjunto más amplio de bibliotecas y módulos.
Polars ofrece un método para exportar un marcador de datos de Polars a un marco de datos PANDAS para compensar la limitación, con la biblioteca Pyarrow adicional. Esto le permite trabajar con Polars Dataframes, donde hay una ganancia de rendimiento y la capacidad de exportarlo a un marco de datos PANDAS para otras empresas de servicios públicos y bibliotecas que lo esperan dentro de un proyecto.
import polars as pl
import pandas as pd
large_polars_df = pl.read_csv('large_dataset_20250728.csv')
large_pandas_df = large_polars_df.to_pandas()
En última instancia, dependerá de su caso de uso específico para determinar si vale la pena refactuar los proyectos existentes para usar polares o integrarlo en proyectos futuros.