Polars
(pola.rs)- Bibliothèque DataFrame open source destinée aux environnements nécessitant un traitement rapide des données sur une seule machine, avec plus de 575 millions de téléchargements et plus de 38 000 étoiles GitHub
- Ses performances reposent principalement sur un moteur de requêtes multithread basé sur Rust, le traitement orienté colonnes, la vectorisation, SIMD et l’exécution parallèle
- Elle reste disponible comme bibliothèque open source sous licence MIT, avec également Polars Cloud, qui permet d’étendre les workloads de production avec la même API
- Revendique des performances plus de 30 fois supérieures à pandas ; le benchmark TPC-H dérivé a été exécuté sur c3-highmem-22 avec un scale factor de 10 et en incluant les E/S
- Prend en charge CSV, JSON, Parquet, Delta Lake, AVRO, Excel, Arrow, les principales bases de données, ainsi que le stockage S3 et Azure, ce qui facilite son intégration aux stacks de données existantes
Modes de distribution de Polars
- Polars est une bibliothèque open source de manipulation de données, qui s’impose comme l’une des solutions de traitement de données les plus rapides sur une seule machine
- Elle fournit une API structurée et typée, avec pour objectifs à la fois l’expressivité et la facilité d’utilisation
- Les indicateurs publics actuels sont les suivants
- Plus de 575 M de téléchargements
- Plus de 38 k étoiles GitHub
- La documentation de démarrage est disponible sur Get started
-
Polars open source
- Polars est une bibliothèque open source utilisable gratuitement sous licence MIT
- Elle est proposée comme bibliothèque DataFrame haute performance, avec une installation simple
- Exemples d’installation
- Python :
pip install polars - Rust :
polars = { version = "x", features = ["lazy", ...]} - Node.js :
const pl = require('nodejs-polars');
- Python :
-
Polars Cloud
- Polars Cloud est une solution managée qui étend les requêtes Polars exécutées dans des environnements notebook vers des workloads de production dans le cloud ou on-premise
- Elle permet de passer à l’échelle avec la même API, sans modifier le code
- Les modes de déploiement Cloud et On-Prem sont pris en charge
- La facturation ne porte que sur l’exécution des requêtes
- L’essai est disponible sur Polars Cloud
Modèle de performance et intégration des données
- Les performances de Polars reposent sur un moteur de requêtes multithread basé sur Rust et une conception axée sur le traitement parallèle
- La vectorisation et le traitement orienté colonnes permettent des algorithmes cohérents avec le cache et des performances élevées sur les processeurs modernes
- Polars a été comparé à plusieurs solutions dans un benchmark TPC-H indépendant dérivé, visant à reproduire des tâches pratiques de préparation de données
- Des gains de performance de plus de 30 fois sont possibles par rapport à pandas
- Le benchmark a été exécuté sur c3-highmem-22 avec un scale factor de 10 et en incluant les E/S
- Les requêtes sont publiées en open source
- Plus d’informations sont disponibles sur Learn more
-
Ergonomie et optimisation de l’exécution
- Les utilisateurs écrivent leurs requêtes de la manière souhaitée, et l’optimiseur de requêtes de Polars détermine le mode d’exécution efficace
- Les tâches sont réparties entre les cœurs CPU disponibles pour une exécution parallèle, sans configuration supplémentaire ni surcharge de sérialisation
- Le modèle mémoire Apache Arrow permet l’intégration avec les outils de données existants
- Le partage de données en zero-copy réduit le coût de collaboration entre outils
- Conçu au plus près de la machine, sans dépendances externes, il permet de contrôler l’API, la mémoire et l’exécution
- Les jeux de données plus grands que la mémoire peuvent être traités avec l’API de streaming, sans charger l’intégralité des données en mémoire
-
Formats de données pris en charge
- Polars prend en charge la lecture et l’écriture des formats de données courants afin de s’intégrer aux stacks de données existantes
- La prise en charge couvre les éléments suivants
- Texte : CSV, JSON
- Binaire : Parquet, Delta Lake, AVRO, Excel
- IPC : Feather, Arrow
- Bases de données : MySQL, Postgres, SQL Server, Sqlite, Redshift, Oracle
- Stockage cloud : S3, Azure Blob, Azure File
1 commentaires
Avis sur Hacker News
Il est très clair que cette page s’adresse à des gens qui savent déjà ce qu’ils regardent. Dès la première phrase, elle ne décrit pas l’outil, mais parle de qualité avec « Polars is written from the ground up with performance in mind », et le reste suit la même logique.
Quelqu’un peut-il expliquer comme à un enfant de 5 ans ce que c’est et à quels besoins cela répond bien ?
Mise à jour : j’ai fini par comprendre qu’il s’agit d’une implémentation alternative au DataFrame de Pandas. D’après l’explication trouvée sur Google à l’adresse https://realpython.com/pandas-dataframe/, un DataFrame est une structure qui contient des données bidimensionnelles et des libellés ; il est largement utilisé dans des domaines intensifs en données comme la data science, le machine learning et le calcul scientifique, et ressemble à une table SQL ou à une feuille de calcul Excel/Calc.
Je fais partie du public cible de Polars et j’essaie de m’y mettre depuis des mois, mais je repousse sans cesse. Je garde une certaine loyauté envers Pandas parce que Wes McKinney, son créateur, a écrit un livre utile qui explique les outils d’analyse courants : https://wesmckinney.com/book/.
Il y a un graphique qui compare avec des choses appelées pandas, modin, vaex, mais comme je ne les connais pas du tout non plus, je me dis finalement que ce n’est pas fait pour moi. J’aime lire et apprendre sur de nouvelles technologies ou de nouveaux projets, mais ici je n’ai rien à quoi me raccrocher.
C’est probablement ce que vivent les gens ordinaires quand je parle de mon petit monde du développement web.
Ce qui est intéressant avec Polars, c’est que c’est similaire à Pandas, mais qu’il utilise Arrow, un backend Rust plus efficace, et qu’il dispose d’un planificateur de requêtes ou quelque chose du genre pour rendre les combinaisons d’opérations plus efficaces. En général, Polars est bien plus efficace que Pandas, si bien que des tâches qui nécessitaient auparavant une infrastructure complexe peuvent souvent être exécutées sur une seule machine.
C’est une concurrence très amicale, créée par un développeur clé de Pandas ; tout le monde semble l’apprécier et, avec le temps, il paraît très probable que Polars remplace Pandas.
Articles liés :
Detailed Comparison Between Polars, DuckDB, Pandas, Modin, Ponder, Fugue, Daft - https://news.ycombinator.com/item?id=37087279 - août 2023
Polars: Company Formation Announcement - https://news.ycombinator.com/item?id=36984611 - août 2023
Replacing Pandas with Polars - https://news.ycombinator.com/item?id=34452526 - janvier 2023
Fast DataFrames for Ruby - https://news.ycombinator.com/item?id=34423221 - janvier 2023
Modern Polars: A comparison of the Polars and Pandas dataframe libraries - https://news.ycombinator.com/item?id=34275818 - janvier 2023
Rust polars 0.26 is released - https://news.ycombinator.com/item?id=34092566 - décembre 2022
Polars: Fast DataFrame library for Rust and Python - https://news.ycombinator.com/item?id=29584698 - décembre 2021
Polars: Rust DataFrames Based on Apache Arrow - https://news.ycombinator.com/item?id=23768227 - juillet 2020
J’ai utilisé Pandas pendant des années, mais j’ai toujours eu l’impression de pousser une boule en haut d’une colline. Rien que pour des opérations simples comme les jointures, et il ne faut pas oublier non plus de réinitialiser l’index
Polars me paraît meilleur que Pandas à presque tous les égards. Il est plus rapide, utilise plusieurs cœurs, consomme moins de mémoire et son API est plus intuitive. Comme c’est encore une bibliothèque relativement jeune, elle a des défauts, mais pour un nouveau projet, elle mérite au moins d’être examinée
Le fait de pouvoir exploiter facilement l’écosystème Rust est aussi excellent. J’ai écrit moi-même un plugin pour paralléliser une fonction, et rendu une partie de mon code géospatial 100 fois plus rapide
À ses débuts, Pandas a été fortement influencé par la terminologie et les usages de R, où “merge” était déjà un terme courant pour dire “join”. Si on ne connaissait pas déjà R vers 2015, quand on commençait à apprendre Pandas, ça devait être difficile à assimiler rapidement
Les requêtes peuvent s’exécuter non seulement avec Polars et Pandas, mais aussi sur le moteur d’exécution compatible SQL de votre choix : DuckDB, ClickHouse, BigQuery, Redshift, Postgres, Trino/Presto, SQLite, etc.
La syntaxe et la sémantique des jointures font partie des points les plus délicats, et nous en rediscutons récemment. C’est au cœur de l’algèbre relationnelle, et c’est aussi le R de PRQL. La plupart des transformations de base de PRQL sont de simples manipulations de listes comme map, filter ou reduce, mais les jointures demandent de l’attention si l’on veut préserver la composition monadique. J’ai laissé mes réflexions ici : https://github.com/PRQL/prql/issues/3782#issuecomment-1811312787
Cette issue est fermée, mais n’hésitez pas à en ouvrir une nouvelle ou à me taguer avec @snth pour donner votre avis. À noter que je suis contributeur de PRQL
Après évaluation, le plus gros avantage était que l’API était bien plus cohérente et facile à comprendre que celle de Pandas. C’est aussi logique, puisqu’ils ont pu apprendre des 20 grandes versions de Pandas
En revanche, comme Polars est beaucoup moins utilisé, Copilot écrivait mal le code Polars. Donc pour l’instant, je continue avec Pandas et Copilot. C’est la première fois que je ressens ce genre de barrière pour les nouvelles bibliothèques en général
Cela dit, Copilot apprend très vite dans un dépôt. J’utilise une stack extrêmement personnalisée construite avec TS-Plus, un fork de TypeScript que même son auteur n’utilise ni ne recommande, et Copilot produit du code TS-Plus plutôt bon
Après avoir vu quelques exemples, il ne faut pas sous-estimer à quel point Copilot peut devenir assez bon sur le code répétitif
Ce n’était pas un gros problème, puisqu’il suffit de lire la documentation, mais c’était pénible que Copilot ne puisse pas recracher directement ce dont j’avais besoin
J’ai longtemps utilisé l’API de Pandas et je l’ai détestée. Je suis plutôt proactif quand il s’agit de continuer à améliorer mon apprentissage, mes outils, ma façon de penser et mes compétences
with_columnest devenuwith_columns, et en ajoutant le contenu de la documentation, j’ai obtenu de très bons résultats avec ChatGPTQuand Deno a lancé le support de Jupyter,
nodejs-polarsfaisait partie des bibliothèques clés de data science prises en chargehttps://blog.jupyter.org/bringing-modern-javascript-to-the-jupyter-notebook-fc998095081e
Personnellement, je ne viens pas du monde de la data science, mais vu que l’écosystème JS/Jupyter en est encore à ses débuts, j’ai été surpris de voir à quel point il était rapide de lancer de l’analyse basée sur pola.rs en TypeScript
Les bindings JS ont clairement des points à améliorer, mais j’espère que cette accessibilité accrue entraînera des améliorations itératives
Polars me paraît vraiment prometteur et ses performances sont impressionnantes, mais ça me gêne de voir vaex, modin et dask comparés dans le même benchmark
Toutes ces bibliothèques visent le traitement de données hors mémoire, c’est-à-dire les cas où les données sont trop volumineuses et où les calculs se font sur plusieurs machines. Les comparer à une bibliothèque de dataframes pour une seule machine est étrange, et comme elles ont forcément beaucoup d’overhead, elles seront nécessairement plus lentes
On utilise rarement Polars dans le même contexte que ces bibliothèques, donc le présenter comme équivalent dans un benchmark est un peu ridicule. En plus, DuckDB, qui peut être utilisé dans les mêmes contextes que Polars et qui est souvent plus rapide, n’apparaît pas dans le benchmark
Le travail d’ingénierie logicielle derrière Polars est excellent, et il n’a pas besoin de benchmarks aussi trompeurs
Sans configuration, on peut obtenir 2 fois les performances de Pandas, et j’ai vu jusqu’à 5 fois sur certaines opérations
Je n’utilise pas directement Polars, mais comme format matérialisé dans un workflow DuckDB.
duckdb.query(sql).pl()est beaucoup plus rapide queduckdb.query(sql).df(). Avec Polars, c’est du zéro copie et ça se termine instantanément, alors qu’avec Pandas, si le DataFrame est gros, cela peut prendre un bon moment. Et, à quelques différences de syntaxe près, on peut le manipuler comme un DataFrame Pandas.C’est très bien pour traiter de gros jeux de données.
Il doit exister un corollaire à la dixième règle de Greenspun (https://en.wikipedia.org/wiki/Greenspun's_tenth_rule)) : toute bibliothèque d’analyse de données suffisamment complexe finit par implémenter la moitié de SQL de façon bricolée, non spécifiée, pleine de bugs et lente.
J’utilise Pandas de temps en temps et j’essaierai probablement aussi celui-ci, mais je me dis toujours que j’aurais mieux fait de mettre dès le départ les données sur lesquelles je travaille dans Postgres.
Je ne suis pas expert en bases de données et Python m’est beaucoup plus confortable, mais pour sélectionner, trier, filtrer et joindre des données tabulaires, SQL est nettement meilleur.
duckdb-prql.DuckDB permet de manipuler directement en SQL des données aux formats Polars, Pandas et Arrow, sans copie ni duplication des données.
duckdb-prqlpermet d’utiliser PRQL (prql-lang.org) et, personnellement, je trouve que cela combine la puissance et l’universalité de SQL avec le ressenti d’utilisation et l’expérience développeur de Polars ou Pandas. À noter que je contribue à PRQL.À la place, DuckDB vaut le coup d’œil. Son implémentation de SQL n’est pas bricolée, ni truffée de bugs, lente ou incomplète. Je ne sais pas trop ce qu’il en est de la formalité de la spécification, mais il est compatible avec Polars.
Pour les types de requêtes que l’on exécute avec ce genre de moteur, Postgres sera probablement plus lent d’un ordre de grandeur qu’un moteur de requêtes OLAP.
C’est une meilleure approche pour utiliser ensemble les dataframes Python et SQL.
Il y a quelques mois, j’ai essayé de porter une grosse base de code Pandas vers Polars. Je n’aime pas beaucoup faire de l’analyse ou du data pipelining en Python, car les transformations complexes prennent 2 à 5 fois plus de temps dans Pandas qu’en Julia ou en R (avec dataframes.jl, dplyr).
Malheureusement, Polars n’était pas non plus la solution. Il y avait trop de bugs dans les opérations standard, et l’interopérabilité avec Pandas était fragile. C’est un problème, car beaucoup de bibliothèques exigent un DataFrame Pandas en entrée. L’API est aussi très verbeuse pour une bibliothèque de dataframes moderne, même si elle reste meilleure que Pandas.
J’espère que cela se réglera avec le temps, mais pour l’instant, le mieux a été d’utiliser DuckDB par-dessus Pandas. C’est aussi rapide que Polars, tout en étant plus stable et avec une meilleure interopérabilité.
J’espère qu’un jour l’écosystème Python des dataframes atteindra un stade comparable à R, où l’on peut utiliser facilement à la fois une bibliothèque de dataframes orientée analyse avec une API intuitive (dplyr) et une bibliothèque de dataframes haute performance (data.table).
Je ne pense pas que je l’utiliserai pour l’analyse exploratoire ou la recherche, mais j’ai commencé à l’employer dans certains scripts de production grâce à ses meilleures performances.
La combinaison dplyr + data.table en R reste mon expérience préférée pour la manipulation de données. J’aimerais simplement que R ait quelque chose comme Matplotlib. ggplot est trop haut niveau, et les graphiques de base sont trop bas niveau. Scikit-Learn est aussi beaucoup plus modulaire que Caret, donc Caret ne me manque pas.
Personnellement, je trouve qu’il combine l’expérience développeur de dplyr, Polars et Pandas avec la puissance et l’universalité de SQL. Les requêtes peuvent s’exécuter sur le moteur compatible SQL de votre choix, non seulement Polars et Pandas, mais aussi DuckDB, ClickHouse, BigQuery, Redshift, Postgres, Trino/Presto, SQLite, etc.
J’aimerais connaître votre avis dans les discussions GitHub (https://github.com/PRQL/prql/discussions) ou sur Discord (https://discord.com/invite/XWxbCrWr). À noter que je contribue à PRQL.
Notre équipe data science a évalué Polars, avec des résultats mitigés. S’il y a des sections où les performances sont critiques, nous envisagerions de l’adopter, mais en dehors de cela, nous étions plutôt réservés à cause du coût de remplacement de Pandas dans des dizaines de projets.
L’API comporte encore des changements cassants prévisibles, ce qui peut devenir une charge de maintenance sur plusieurs projets. Cela dit, l’API semble déjà plus cohérente, et dans l’ensemble elle paraît aller dans la bonne direction.
En particulier, le coût d’interopérabilité avec Pandas est très faible, et avec le backend Arrow, il est même assez facile de passer à Pandas en zéro copie.