Polars
(pola.rs)- Una biblioteca DataFrame de código abierto orientada a entornos que necesitan procesamiento de datos rápido en una sola máquina, con más de 575 millones de descargas y más de 38,000 estrellas en GitHub
- La clave de su rendimiento está en un motor de consultas multihilo basado en Rust, junto con procesamiento orientado a columnas, vectorización, SIMD y ejecución en paralelo
- Sigue ofreciéndose como una biblioteca de código abierto bajo licencia MIT, y también incluye Polars Cloud, que permite escalar hasta cargas de trabajo de producción con la misma API
- Destaca mejoras de rendimiento de más de 30 veces frente a pandas, y el benchmark derivado de TPC-H se ejecutó en c3-highmem-22 con scale factor 10 e incluyendo I/O
- Soporta CSV, JSON, Parquet, Delta Lake, AVRO, Excel, Arrow, bases de datos principales, además de almacenamiento S3 y Azure, por lo que es fácil integrarlo en un stack de datos existente
Cómo se ofrece Polars
- Polars es una biblioteca de código abierto para manipulación de datos, y se ha posicionado como una de las soluciones de procesamiento de datos más rápidas para una sola máquina
- Ofrece una API estructurada y tipada, con el objetivo de combinar expresividad y facilidad de uso
- Las métricas públicas actuales son las siguientes
- 575M+ descargas
- 38k+ estrellas en GitHub
- La documentación inicial puede consultarse en Get started
-
Polars de código abierto
- Polars es una biblioteca de código abierto disponible gratuitamente bajo licencia MIT
- Se ofrece como una biblioteca DataFrame de alto rendimiento y su instalación también es sencilla
- Los ejemplos de instalación son los siguientes
- Python:
pip install polars - Rust:
polars = { version = "x", features = ["lazy", ...]} - Node.js:
const pl = require('nodejs-polars');
- Python:
-
Polars Cloud
- Polars Cloud es una solución administrada que amplía las consultas de Polars en entornos de notebook hacia cargas de trabajo de producción en la nube o on-premises
- Puede escalarse usando la misma API sin cambios en el código
- Soporta despliegue en Cloud o On-Prem
- La facturación se realiza solo por la ejecución de consultas
- Puede probarse en Polars Cloud
Modelo de rendimiento e integración de datos
- La base del rendimiento de Polars es un motor de consultas multihilo basado en Rust y un diseño pensado para el procesamiento en paralelo
- La vectorización y el procesamiento orientado a columnas permiten algoritmos con coherencia de caché y alto rendimiento en procesadores modernos
- Se comparó con varias soluciones en un benchmark TPC-H derivado e independiente, con el objetivo de reproducir tareas reales de limpieza de datos
- Puede ofrecer mejoras de rendimiento de más de 30 veces frente a pandas
- El benchmark se ejecutó en c3-highmem-22 con scale factor 10 e incluyendo I/O
- Las consultas están publicadas como open source
- Más detalles en Learn more
-
Usabilidad y optimización de ejecución
- El usuario escribe las consultas de la forma que desea, y el optimizador de consultas de Polars determina la manera más eficiente de ejecutarlas
- Divide el trabajo entre los núcleos de CPU disponibles y lo ejecuta en paralelo sin configuración adicional ni sobrecarga de serialización
- Usa el modelo de memoria de Apache Arrow, lo que permite integrarlo con herramientas de datos existentes
- El intercambio de datos zero-copy puede reducir el costo de colaboración entre herramientas
- Está diseñado para operar cerca de la máquina sin dependencias externas, lo que permite controlar la API, la memoria y la ejecución
- Los conjuntos de datos más grandes que la memoria pueden procesarse con la API de streaming sin necesidad de cargar todos los datos en memoria
-
Formatos de datos compatibles
- Polars soporta lectura y escritura de formatos de datos comunes, por lo que puede integrarse con un stack de datos existente
- El alcance del soporte es el siguiente
- Text: CSV, JSON
- Binary: Parquet, Delta Lake, AVRO, Excel
- IPC: Feather, Arrow
- Databases: MySQL, Postgres, SQL Server, Sqlite, Redshift, Oracle
- Cloud storage: S3, Azure Blob, Azure File
1 comentarios
Opiniones de Hacker News
Es demasiado evidente que esta página está escrita para gente que ya sabe qué está viendo. Desde la primera frase empieza hablando de calidad, como “Polars is written from the ground up with performance in mind”, en vez de explicar la herramienta, y el resto sigue en la misma línea.
¿Alguien puede decirme como si tuviera 5 años qué es esto y para qué necesidad es una buena solución?
Edición: al final lo entendí como una implementación alternativa de Pandas DataFrame. Según la explicación que encontré en Google en https://realpython.com/pandas-dataframe/, un DataFrame es una estructura que contiene datos bidimensionales y etiquetas, se usa mucho en áreas intensivas en datos como ciencia de datos, machine learning y cómputo científico, y se parece a una tabla SQL o a una hoja de cálculo de Excel/Calc.
Yo soy parte del público objetivo de Polars y llevo meses queriendo probarlo, pero lo sigo posponiendo. Mantengo cierta lealtad a Pandas porque Wes McKinney, su creador, escribió un libro útil que explica herramientas comunes de análisis: https://wesmckinney.com/book/.
Aparece una gráfica comparándolo con cosas llamadas pandas, modin y vaex, pero tampoco sé nada de ellas, así que al final siento que esto no es para mí. Me gusta leer y aprender sobre tecnologías o proyectos nuevos, pero aquí no encuentro de dónde agarrarme.
Probablemente esto es lo que le pasa a la gente común cuando hablo de mis insignificantes temas de desarrollo web.
Lo interesante de Polars es que se parece a Pandas, pero usa Arrow, un backend en Rust más eficiente, y tiene algo como un planificador de consultas que hace más eficientes las combinaciones de operaciones. En general, Polars es mucho más eficiente que Pandas, por lo que muchas tareas que antes requerían infraestructura compleja ahora suelen poder hacerse en una sola máquina.
Es una competencia muy amistosa creada por un desarrollador principal de Pandas; parece que a todos les gusta y, con el tiempo, tiene muchas posibilidades de reemplazar a Pandas.
Artículos relacionados:
Detailed Comparison Between Polars, DuckDB, Pandas, Modin, Ponder, Fugue, Daft - https://news.ycombinator.com/item?id=37087279 - agosto de 2023
Polars: Company Formation Announcement - https://news.ycombinator.com/item?id=36984611 - agosto de 2023
Replacing Pandas with Polars - https://news.ycombinator.com/item?id=34452526 - enero de 2023
Fast DataFrames for Ruby - https://news.ycombinator.com/item?id=34423221 - enero de 2023
Modern Polars: A comparison of the Polars and Pandas dataframe libraries - https://news.ycombinator.com/item?id=34275818 - enero de 2023
Rust polars 0.26 is released - https://news.ycombinator.com/item?id=34092566 - diciembre de 2022
Polars: Fast DataFrame library for Rust and Python - https://news.ycombinator.com/item?id=29584698 - diciembre de 2021
Polars: Rust DataFrames Based on Apache Arrow - https://news.ycombinator.com/item?id=23768227 - julio de 2020
Usé Pandas durante años, pero siempre se sintió como empujar una piedra cuesta arriba. Incluso en tareas simples como los joins, y tampoco hay que olvidarse de restablecer el índice
Polars se siente mejor que Pandas en casi todos los aspectos. Es más rápido, usa múltiples núcleos, consume menos memoria y su API es más intuitiva. Todavía es una biblioteca relativamente joven y tiene desventajas, pero si es un proyecto nuevo, al menos vale la pena evaluarla
También es excelente poder aprovechar fácilmente el ecosistema de Rust. Escribí un plugin propio para paralelizar una función e hice que parte de código geoespacial fuera 100 veces más rápido
Pandas al principio estuvo muy influenciado por la terminología y los patrones de uso de R, y en R “merge” ya era una palabra común para decir “join”. Si cuando empecé a aprender Pandas, alrededor de 2015, no hubiera conocido ya R, creo que me habría costado aprenderlo rápido
Las consultas pueden ejecutarse no solo en Polars y Pandas, sino también en cualquier motor de ejecución compatible con SQL que prefieras, como DuckDB, ClickHouse, BigQuery, Redshift, Postgres, Trino/Presto, SQLite, etc.
La sintaxis y la semántica de los joins son una de las partes más difíciles, así que recientemente las estamos discutiendo de nuevo. Son el núcleo del álgebra relacional y también corresponden a la R de PRQL. La mayoría de las transformaciones básicas de PRQL son manipulaciones simples de listas como map, filter y reduce, pero los joins requieren cuidado si se quiere preservar la composición monádica. Dejé mis ideas aquí: https://github.com/PRQL/prql/issues/3782#issuecomment-1811312787
Ese issue ya está cerrado, pero sería bueno que abrieras uno nuevo o me etiquetaras como @snth para compartir tu opinión. Como referencia, soy contribuidor de PRQL
Al evaluarlo, la mayor ventaja fue que la API era mucho más consistente y fácil de entender que la de Pandas. Tiene sentido, porque seguramente aprendieron de las 20 versiones principales de Pandas
Pero como se usa mucho menos, Copilot no escribía bien código de Polars. Así que por ahora sigo usando Pandas y Copilot. Esta fue la primera vez que sentí que existe esa barrera en general para las bibliotecas nuevas
Aun así, Copilot aprende muy rápido dentro de un repositorio. Yo uso un stack extremadamente personalizado armado con TS-Plus, un fork de TypeScript que ni siquiera su propio autor usa o recomienda, y Copilot produce código TS-Plus bastante bueno
Después de ver algunos ejemplos, conviene no subestimar que Copilot puede volverse bastante bueno en la etapa de código repetitivo
No era un gran problema porque podía leer la documentación, pero era molesto que Copilot no pudiera escupir de inmediato lo que necesitaba
He usado durante mucho tiempo la API de Pandas y la odiaba. Soy bastante proactivo a la hora de seguir mejorando mi aprendizaje, herramientas, formas de pensar y habilidades
with_columncambió awith_columns, y agregando contenido de la documentaciónCuando Deno lanzó soporte para Jupyter,
nodejs-polarsfue una de las bibliotecas clave de ciencia de datos que soportaronhttps://blog.jupyter.org/bringing-modern-javascript-to-the-jupyter-notebook-fc998095081e
Personalmente no soy alguien del área de ciencia de datos, pero considerando que el ecosistema JS/Jupyter todavía está en una etapa temprana, fue sorprendentemente rápido levantar análisis basados en pola.rs desde TypeScript
Los bindings de JS claramente tienen cosas por pulir, pero espero que la mayor accesibilidad impulse mejoras iterativas
Polars realmente me entusiasma y su rendimiento en velocidad es impresionante, pero me molesta que comparen vaex, modin y dask en el mismo benchmark
Todas esas bibliotecas apuntan al procesamiento de datos fuera del núcleo, es decir, a casos en que los datos son demasiado grandes y el cálculo debe distribuirse entre varias máquinas. Compararlas con una biblioteca de dataframes para una sola máquina es raro, y como inevitablemente tienen bastante overhead, van a ser más lentas
No hay muchos casos en los que usarías Polars en el mismo contexto que esas bibliotecas, así que mostrarlas en el benchmark como si fueran equivalentes resulta un poco ridículo. Además, DuckDB, que sí puede usarse en el mismo contexto que Polars y en muchos casos es más rápido, no aparece en el benchmark
La ingeniería de software de Polars es un trabajo excelente y no necesita benchmarks que puedan llevar a malentendidos
Sin configuración, se puede lograr una mejora de rendimiento de 2 veces frente a Pandas, y en ciertas operaciones he visto hasta 5 veces
No uso Polars directamente, sino como formato materializado en un flujo de trabajo con DuckDB.
duckdb.query(sql).pl()es mucho más rápido queduckdb.query(sql).df(). Con Polars es zero-copy y termina de inmediato, pero con Pandas, si el DataFrame es grande, tarda bastante. Además, se puede manipular como un DataFrame de Pandas; la sintaxis solo cambia un poco.Es muy bueno para manejar datasets grandes.
Creo que podría haber un corolario de la décima regla de Greenspun (https://en.wikipedia.org/wiki/Greenspun's_tenth_rule)): toda biblioteca de análisis de datos lo suficientemente compleja termina implementando la mitad de SQL de manera improvisada, con una especificación no oficial, llena de bugs y lenta.
Uso Pandas de vez en cuando y probablemente también pruebe esto, pero siempre pienso que habría sido mejor simplemente meter los datos en los que estoy trabajando en Postgres desde el principio.
Aunque no soy experto en bases de datos y Python me resulta mucho más cómodo, para seleccionar, ordenar, filtrar y unir datos tabulares, SQL es mucho mejor.
duckdb-prql.DuckDB permite trabajar directamente con datos en formato Polars, Pandas y Arrow usando SQL, sin copiar ni duplicar datos.
duckdb-prqlpermite usar PRQL (prql-lang.org) y, personalmente, creo que combina la potencia y universalidad de SQL con la sensación de uso y la experiencia de desarrollo de Polars o Pandas. Como referencia, soy contribuidor de PRQL.En cambio, vale la pena echarle un vistazo a DuckDB. Su implementación de SQL no es improvisada, ni está llena de bugs, ni es lenta o incompleta. No sé qué tan formal sea su especificación, pero es compatible con Polars.
Para el tipo de consultas que se hacen con estos motores, Postgres probablemente sea un orden de magnitud más lento que un motor de consultas OLAP.
Es un mejor enfoque para usar juntos dataframes de Python y SQL.
Hace unos meses intenté migrar una gran base de código en Pandas a Polars. No me gusta mucho hacer análisis o pipelines de datos en Python, porque las transformaciones complejas tardan 2 a 5 veces más en Pandas que en Julia o R (usando dataframes.jl, dplyr).
Lamentablemente, Polars tampoco fue la respuesta. Tenía demasiados bugs en operaciones estándar y la interoperabilidad con Pandas era inestable. Eso es un problema porque muchas bibliotecas exigen un DataFrame de Pandas como entrada. La API también es muy verbosa para una biblioteca moderna de dataframes, aunque aun así es mejor que Pandas.
Espero que se resuelva con el tiempo, pero por ahora lo que mejor me funcionó fue usar DuckDB sobre Pandas. Es tan rápido como Polars, pero más estable y con mejor interoperabilidad.
Ojalá algún día el ecosistema de dataframes en Python llegue a un punto similar al de R, donde sea fácil usar en conjunto una biblioteca de dataframes orientada al análisis con una API intuitiva (dplyr) y una biblioteca de dataframes de alto rendimiento (data.table).
Probablemente no lo usaría para análisis exploratorio de datos o investigación, pero empecé a usarlo en algunos scripts de producción por su mejor rendimiento.
La combinación dplyr + data.table de R sigue siendo mi experiencia favorita para manipulación de datos. Eso sí, ojalá R tuviera algo como Matplotlib. ggplot es demasiado de alto nivel y los gráficos base son demasiado de bajo nivel. Scikit-Learn también es mucho más modular que Caret, así que no extraño Caret.
Personalmente, creo que combina la experiencia de desarrollo de dplyr, Polars y Pandas con la potencia y universalidad de SQL. Las consultas se pueden ejecutar no solo en Polars y Pandas, sino también en cualquier motor de ejecución compatible con SQL que prefieras, como DuckDB, ClickHouse, BigQuery, Redshift, Postgres, Trino/Presto, SQLite, etc.
Me gustaría escuchar tus ideas en las discusiones de GitHub (https://github.com/PRQL/prql/discussions) o en Discord (https://discord.com/invite/XWxbCrWr). Como referencia, soy contribuidor de PRQL.
Nuestro equipo de ciencia de datos evaluó Polars y los resultados fueron mixtos. Si hubiera tramos donde el rendimiento fuera crítico, consideraríamos adoptarlo, pero fuera de eso estuvimos algo negativos por el costo de reemplazar Pandas en decenas de proyectos
La API todavía tiene cambios incompatibles previsibles, y en varios proyectos eso puede convertirse en una carga de mantenimiento. Aun así, la API ya se siente más consistente y, en general, parece ir en la dirección correcta
En especial porque el costo de interoperar con Pandas es muy bajo, y si se usa el backend de Arrow, también es bastante fácil hacer una conversión zero-copy a Pandas