Polars : le DataFrame en Rust qui laisse Pandas dans le rétroviseur

Polars : le DataFrame en Rust qui laisse Pandas dans le rétroviseur

De quoi avez-vous besoin

Version de Python

3.x

Packages

  • {"nom": "polars", "version": "2.0.0"}

Difficulté

Intermédiaire

Tu attends que Pandas finisse de mouliner ton CSV du matin ? Normal : il exécute tout en Python, cœur par cœur, et n'exploite qu'une fraction de ta machine. Polars, lui, est écrit en Rust et traite tes données en parallèle sur tous les cœurs disponibles. Résultat : jusqu'à dix fois plus rapide, avec nettement moins de mémoire. Voyons comment l'adopter en quelques minutes, sans tout réécrire.

Polars n'est pas un simple Pandas dopé aux stéroïdes. Il apporte deux idées neuves : une API d'expressions (pl.col(...)) qui remplace les boucles et les .apply() douloureux, et l'évaluation paresseuse, qui optimise ton pipeline avant même de l'exécuter. On démarre.

Installe Polars

Un simple pip, rien de plus. Polars est un paquet autonome, sans dépendance lourde.

bash
pip install polars

Crée ton premier DataFrame

On reprend les ventes d'une petite boutique. La construction ressemble à Pandas, tu ne seras pas dépaysé.

python
import polars as pl

df = pl.DataFrame({
    "ville": ["Paris", "Lyon", "Paris", "Marseille", "Lyon"],
    "produit": ["chaise", "table", "chaise", "table", "chaise"],
    "prix": [49.9, 129.0, 59.9, 149.0, 39.9],
    "quantite": [2, 1, 3, 1, 5],
})

print(df)

L'affichage est propre : chaque colonne montre son type (str, f64, i64), et le tableau est aligné sans effort.

Filtre et crée des colonnes

Ici, on oublie les df["colonne"] à rallonge. Tout passe par pl.col("colonne"), que l'on combine comme des blocs de Lego.

python
# Garder uniquement les chaises
chaises = df.filter(pl.col("produit") == "chaise")

# Ajouter une colonne "ca" (chiffre d'affaires)
df = df.with_columns(
    (pl.col("prix") * pl.col("quantite")).alias("ca")
)

print(df)

L'opération (prix * quantite) s'écrit comme une expression mathématique, et Polars la vectorise tout seul. Pas de boucle, pas de .apply(), et c'est du code que tu peux relire dans six mois.

Regroupe et agrège

Le chiffre d'affaires par ville, trié, tient en trois lignes chaînées.

python
ca_par_ville = (
    df.group_by("ville")
    .agg(pl.col("ca").sum().alias("total_ca"))
    .sort("total_ca", descending=True)
)

print(ca_par_ville)

group_by, agg, sort : la grammaire ressemble au SQL que tu connais déjà, mais chaînée en Python et donc testable, lisible, versionnable.

L'évaluation paresseuse

C'est le vrai tour de force. Ajoute .lazy() au début et .collect() à la fin : Polars construit alors un plan d'exécution optimisé avant de calculer quoi que ce soit.

python
lazy = (
    df.lazy()
    .filter(pl.col("produit") == "chaise")
    .group_by("ville")
    .agg(pl.col("ca").sum().alias("total_ca"))
    .sort("total_ca", descending=True)
)

print(lazy.explain())      # le plan, sans rien calculer
resultat = lazy.collect()  # l'exécution réelle
print(resultat)

explain() te montre exactement ce que Polars va faire : il peut réordonner les filtres, supprimer les colonnes inutiles et fusionner des étapes. Sur des millions de lignes, cette réorganisation fait toute la différence.

Lis des fichiers et fais la navette avec Pandas

CSV, Parquet, JSON : tout est intégré et nettement plus rapide qu'en Python pur.

python
df = pl.read_csv("ventes.csv")
df = pl.read_parquet("ventes.parquet")  # format binaire, encore plus rapide

# Faire la navette avec ton code Pandas existant
import pandas as pd
mon_df_pandas = pd.DataFrame({"a": [1, 2, 3]})
df_pl = pl.from_pandas(mon_df_pandas)
retour_pandas = df_pl.to_pandas()

Tu n'as donc pas à tout migrer d'un coup : pl.from_pandas() et df.to_pandas() laissent tes vieux scripts cohabiter avec les nouveaux.

Quand garder Pandas, quand passer à Polars

Pandas reste roi pour les petites données, les notebooks exploratoires et l'écosystème d'extensions. Dès que ton CSV dépasse quelques centaines de milliers de lignes, que la RAM grimpe ou que ton script tourne en batch, passe à Polars : la différence est flagrante, souvent sans changer grand-chose à ta logique. Commence par un seul script, mesure, et laisse Rust faire le sale boulot.

K

Auteur

Krugz

Développeur fullstack

Développeur fullstack qui tente, tant bien que mal, de suivre l'actualité de l'IA au milieu d'une marée d'informations imbuvables et des milliers d'outils et de modèles qui sortent chaque jour.