Polars est 5 a 50 fois plus rapide que pandas sur les agregations. En 2025, les equipes data migrent vers Polars pour les traitements intensifs. Voici ce qu on evalue en entretien.
Quelles sont les raisons techniques pour lesquelles Polars est plus rapide que pandas ?
Dans quel cas utilisez-vous l API Lazy plutot que l API Eager ?
import polars as pl
# API Eager : execution immediate
df = pl.read_csv('data.csv')
result = (
df
.filter(pl.col('amount') > 100)
.group_by('category')
.agg(pl.col('amount').sum().alias('total'))
)
# API Lazy : execution differee et optimisee
result = (
pl.scan_csv('data.csv') # scan = lecture lazy
.filter(pl.col('amount') > 100)
.group_by('category')
.agg(pl.col('amount').sum().alias('total'))
.collect() # declenche l execution
)
# Voir le plan d execution optimise
print(result.explain())Quelle est la difference entre les contextes select, filter, group_by et with_columns ?
# Expressions : le coeur de Polars
df.select([
pl.col('revenue'),
pl.col('revenue').log(base=10).alias('log_revenue'),
(pl.col('revenue') / pl.col('cost') - 1).alias('margin_pct'),
pl.col('date').dt.month().alias('month'),
pl.col('name').str.to_uppercase().alias('name_upper')
])
# Agregations complexes
df.group_by('category').agg([
pl.col('revenue').sum(),
pl.col('revenue').mean().alias('avg_revenue'),
pl.col('customer_id').n_unique().alias('nb_clients'),
pl.col('amount').filter(pl.col('status') == 'completed').sum().alias('completed_sum')
])Quels types de join Polars propose-t-il ? Quand utilisez-vous un semi-join ?
# Conversion zero-copy vers pandas via Apache Arrow
pandas_df = polars_df.to_pandas()
polars_df = pl.from_pandas(pandas_df)
# DuckDB peut requeter directement un LazyFrame Polars
import duckdb
result = duckdb.sql('SELECT category, SUM(amount) FROM polars_df GROUP BY 1').pl()
# Lire/ecrire Parquet (format natif Apache Arrow)
df = pl.read_parquet('data/*.parquet')
df.write_parquet('output.parquet', compression='zstd')| pandas | Polars equivalent |
|---|---|
| df['col'] | df['col'] ou pl.col('col') |
| df.rename(columns={}) | df.rename({}) |
| df.fillna(0) | df.fill_null(0) |
| df.apply(func) | df.map_elements(func) ou expressions natives |
| pd.to_datetime() | pl.col('date').str.to_datetime('%Y-%m-%d') |
| df.merge() | df.join() |
| Niveau | Maitrise | Signal GO | NO-GO |
|---|---|---|---|
| Confirme | API Eager, expressions courantes, read/write Parquet | Sait recrire un pipeline pandas en Polars, connait les expressions de base | N a jamais utilise Polars |
| Senior | API Lazy, query planning, join strategies, benchmarks | Utilise scan_parquet + lazy par defaut, connait semi/anti join, a benchmarke vs pandas | Ne sait pas expliquer le query planning Polars |
Premier entretien gratuit. Rapport GO/NO-GO sous 48h.