¿El nuevo rey del procesamiento de datos? Diferencias entre polares y pandas


Si ha seguido el progreso de Python DataFrames durante el año pasado, debe haber oído hablar de  Polars , una potente biblioteca DataFrame diseñada para trabajar con grandes conjuntos de datos .


A diferencia de otras bibliotecas como  Spark , Dask  y  Ray  que manejan grandes conjuntos de datos, Polars se usa en una sola máquina, lo que ha generado muchas   comparaciones con pandas . De hecho, Polars se diferencia de los pandas en muchos aspectos importantes, incluida la forma en que maneja los datos y sus mejores aplicaciones. A continuación se explorarán las diferencias técnicas entre las dos bibliotecas DataFrame y se analizarán sus respectivas ventajas y limitaciones.


Si quieres escucharlo  de Ritchie Vink , el creador de Polars  , ¡puedes ver nuestra entrevista con él!



¿Por qué utilizar polares? 

¿En lugar de pandas?


Dos palabras: rendimiento . Los polares han sido extremadamente rápidos desde el principio, realizando operaciones comunes de 5 a 10 veces más rápido que los pandas. Además, los requisitos de memoria de las operaciones de Polars son significativamente menores que los de los pandas: los pandas requieren entre 5 y 10 veces la RAM del tamaño del conjunto de datos para realizar operaciones, mientras que los Polars requieren de 2 a 4 veces.


Puede conocer cómo se compara el rendimiento de Polars con otras bibliotecas DataFrame aquí . Para operaciones comunes, Polars es de 10 a 100 veces más rápido que pandas y es una de las bibliotecas DataFrame más rápidas. Además, puede manejar conjuntos de datos más grandes que los pandas antes de que se produzcan errores de falta de memoria.



¿Por qué los polares son tan rápidos?


Estos resultados son tan impresionantes que quizás te preguntes: ¿Cómo logra Polars este tipo de rendimiento cuando se ejecuta en una sola máquina? Porque la biblioteca se diseñó pensando en el rendimiento desde el principio y lo logró de diversas formas.


Escrito en óxido


Uno de los hechos más famosos sobre Polars es que  está escrito en  Rust , un lenguaje de bajo nivel que es casi tan rápido como C y C++. Y pandas está construido sobre bibliotecas de Python, una de las cuales es  NumPy . Aunque el núcleo de NumPy está escrito en C, todavía sufre problemas inherentes al manejo de Python de ciertos tipos en la memoria (como cadenas para datos categóricos), lo que resulta en un rendimiento deficiente al manejar estos tipos (consulte este artículo de Wes McKinney  Un  gran para más detalles).


Otra ventaja de utilizar Rust es que permite una concurrencia segura , haciendo que el paralelismo sea lo más predecible posible. Esto significa que Polars puede usar de forma segura todos los núcleos de la máquina para ejecutar consultas complejas que involucran múltiples columnas, lo que llevó a Ritchie Vink a describir el desempeño de Polar como "demasiado paralelo". Por tanto, el rendimiento de los Polars es mucho mayor que el de los Pandas, que utilizan un solo núcleo para realizar las operaciones. Mire la gran charla de Nico Kreiling en la PyCon DE de este año que detalla cómo Polars logra este objetivo.


Basado en flecha


Otro factor en el sorprendente desempeño de Polars es Apache Arrow , un formato de memoria independiente del idioma. En realidad, Arrow fue co-creado por Wes McKinney para resolver un problema que vio con los pandas cuando la cantidad de datos se disparó. También es el backend de pandas 2.0, una versión de mayor rendimiento de pandas lanzada en marzo de este año. Sin embargo, el backend Arrow de la biblioteca es ligeramente diferente: mientras pandas 2.0 se basa en PyArrow, el equipo de Polars creó su propia implementación Arrow.


Una de las principales ventajas de crear una base de datos en Arrow es la interoperabilidad . Arrow fue diseñado para estandarizar el formato de datos en memoria utilizado en todas las bibliotecas y ya se utiliza en muchas bibliotecas y bases de datos importantes, como siguiente figura .


Esta interoperabilidad mejora el rendimiento porque evita la necesidad de convertir datos a diferentes formatos para pasar entre diferentes pasos de la canalización de datos (en otras palabras, evita la necesidad de serializar y deserializar los datos). También es más eficiente en cuanto a memoria porque dos procesos pueden compartir los mismos datos sin crear copias. Se estima que la serialización/deserialización  representa entre el 80% y el 90% de la sobrecarga computacional en los flujos de trabajo de datos , y el formato de datos universal de Arrow ha aportado importantes mejoras de rendimiento a Polars.


Arrow también tiene soporte integrado para una gama más amplia de tipos de datos que pandas. Dado que pandas se basa en NumPy, es excelente para manejar columnas de números enteros y de punto flotante, pero tiene problemas con otros tipos de datos. Por el contrario , Arrow proporciona soporte sofisticado para tipos de columnas de fecha y hora, booleanas, binarias e incluso complejas, como las que contienen listas. Además, Arrow puede manejar datos faltantes de forma nativa, lo que requiere pasos adicionales en NumPy.


Finalmente, Arrow utiliza almacenamiento de datos en columnas , donde todas las columnas se almacenan en bloques de memoria contiguos independientemente del tipo de datos. Esto no sólo facilita la paralelización, sino que también acelera la recuperación de datos.


Optimización de consultas


Otra parte fundamental del rendimiento de Polars es cómo evalúa su código. Pandas utiliza la ejecución Eager de forma predeterminada y las operaciones se realizan en el orden escrito. Por el contrario, Polars realiza ejecuciones ansiosas y diferidas , donde el optimizador de consultas evalúa todas las operaciones requeridas y formula la forma más eficiente de ejecutar el código. Esto puede incluir reescribir el orden en que se realizan las operaciones o eliminar cálculos redundantes. Por ejemplo, utilice la siguiente expresión para obtener la media de las columnas de cada categoría "A" y "B" Categoryen .Number1

(
df
.groupby(by = "Category").agg(pl.col("Number1").mean())
.filter(pl.col("Category").is_in(["A""B"]))
)


Si se ejecuta la expresión Eager, todo el DataFrame se evalúa innecesariamente groupbyy luego Categoryse filtra. Con la ejecución diferida, el DataFrame se filtra y ejecuta solo en los datos requeridos groupby.


API expresiva


最后,Polars 拥有一个极具表达性的 API,基本上您想执行的任何运算都可以用 Polars 方法表达。相比之下,pandas 中更复杂的运算通常需要作为 lambda 表达式传递给apply方法。apply方法的问题是它循环遍历 DataFrame 的行,对每一行按顺序执行运算。内置方法能够让您在列级别上工作并利用另一种称为 SIMD 的并行形式。



什么时候应该继续使用 pandas?


这一切看起来都棒极了,您可能现在就想抛弃 pandas。先别急!虽然 Polars 非常适合进行极其高效的数据转换,但它目前并不是数据探索或机器学习管道的最佳选择。 这些都是 pandas 可以继续崭露头角的领域。


其中一个原因是,虽然 Polars 与其他使用 Arrow 的软件包具有良好的互操作性,但它尚不兼容大多数 Python 数据可视化软件包或机器学习库,例如 scikit-learn PyTorch 唯一的例外是 Plotly,它允许您直接从 Polars DataFrame 创建图表。


当前讨论较多的解决方案是在这些软件包中使用 Python DataFrame 交换协议,以允许其支持一系列 DataFrame 库,让数据科学和机器学习工作流不再遭遇 pandas 的瓶颈。不过,这个想法相对较新,项目距离实现还有一段时间。



Polars 和 pandas 的工具


想亲自尝试 Polars 了吗?DataSpell 和 PyCharm Professional 2023.2 都提供了出色的工具,可在 Jupyter Notebook 中处理 pandas 和 Polars。特别是,pandas 和 Polars DataFrame 以交互功能显示,使数据探索更快、更舒适。


我最喜欢的功能包括 DataFrame 所有行和列的不截断滚动浏览、DataFrame 值聚合的一键获取以及 DataFrame 的多种格式导出(包括 Markdown!)。


如果您还没有使用 DataSpell,可以立即开始 30 天试用。



本博文英文原作者:Jodie Burchell

DataSpell 相关阅读

关于 DataSpell

DataSpell 是一款专门用于探索性数据分析和机器学习模型原型设计的 IDE。它在一个人性化环境中将 Jupyter Notebook 的交互性与 PyCharm 的智能 Python 和 R 编码辅助相结合。


DataSpell 具有智能代码辅助、版本控制和其他特定于 IDE 的功能,以及诸如表、图和微件等交互式输出功能,这些交互式输出功能可以帮助您可视化数据并从中获取洞见。

进一步了解 DataSpell

⏬ 戳「阅读原文」了解更多

本文分享自微信公众号 - JetBrains(JetBrainsChina)。
如有侵权,请联系 [email protected] 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

阿里云严重故障,全线产品受影响(已恢复) 俄罗斯操作系统 Aurora OS 5.0 全新 UI 亮相 汤不热 (Tumblr) 凉了 多家互联网公司急招鸿蒙程序员 .NET 8 正式 GA,最新 LTS 版本 UNIX 时间即将进入 17 亿纪元(已进入) 小米官宣 Xiaomi Vela 全面开源,底层内核为 NuttX Linux 上的 .NET 8 独立体积减少 50% FFmpeg 6.1 "Heaviside" 发布 微软推出全新“Windows App”
{{o.name}}
{{m.name}}

Supongo que te gusta

Origin my.oschina.net/u/5494143/blog/10114360
Recomendado
Clasificación