Calcul des quantiles et des histogrammes

Transformation de données avec Polars

Liam Brannigan

Data Scientist & Polars Contributor

Quantiles et histogrammes

reviews = pl.read_csv("restaurants_quantiles.csv")
shape: (15, 4)
| business         | location      | review | price |
| ---              | ---           | ---    | ---   |
| str              | str           | f64    | i64   |
|------------------|---------------|--------|-------|
| 7burgers         | Wakey Wakey   | 4.2    | 15    |
| Bang Bang Burger | Forest Rd.    | 3.8    | 12    |
| ...              | ...           | ...    | ...   |
| The Old Ivy      | Angel         | 4.1    | 28    |
| Franco Manca     | Brixton Rd.   | 4.0    | 22    |
Transformation de données avec Polars

Catégorisation par quantiles

Histogramme en barres montrant les prix des restaurants par ordre croissant.

Transformation de données avec Polars

Catégorisation par quantiles

Histogramme en barres montrant les prix des restaurants par ordre croissant avec la ligne de référence au 33e centile.

Transformation de données avec Polars

Catégorisation par quantiles

Histogramme en barres montrant les prix des restaurants par ordre croissant avec des lignes de référence aux 33e et 67e centiles.

Transformation de données avec Polars

Jeu de données des avis

reviews = pl.read_csv("restaurants_quantiles.csv")
shape: (15, 4)
| business         | location      | review | price |
| ---              | ---           | ---    | ---   |
| str              | str           | f64    | i64   |
|------------------|---------------|--------|-------|
| 7burgers         | Wakey Wakey   | 4.2    | 15    |
| Bang Bang Burger | Forest Rd.    | 3.8    | 12    |
| ...              | ...           | ...    | ...   |
| The Old Ivy      | Angel         | 4.1    | 28    |
| Franco Manca     | Brixton Rd.   | 4.0    | 22    |
Transformation de données avec Polars

Calculer des quantiles

reviews.select(


)
Transformation de données avec Polars

Calculer des quantiles

reviews.select(
    pl.col("price")

)
Transformation de données avec Polars

Calculer des quantiles

reviews.select(
    pl.col("price").quantile(0.33)

)
Transformation de données avec Polars

Calculer des quantiles

reviews.select(
    pl.col("price").quantile(0.33).alias("budget_cutoff"),

)
Transformation de données avec Polars

Calculer des quantiles

reviews.select(
    pl.col("price").quantile(0.33).alias("budget_cutoff"),
    pl.col("price").quantile(0.67).alias("mid_cutoff")
)
shape: (1, 2)
| budget_cutoff | mid_cutoff |
| ---           | ---        |
| f64           | f64        |
|---------------|------------|
| 14.0          | 20.0       |
Transformation de données avec Polars

Créer des catégories avec des quantiles

reviews.with_columns(
    pl.when(pl.col("price") <= pl.col("price").quantile(0.33)).then(pl.lit("budget"))


)
Transformation de données avec Polars

Créer des catégories avec des quantiles

reviews.with_columns(
    pl.when(pl.col("price") <= pl.col("price").quantile(0.33)).then(pl.lit("budget"))
    .when(pl.col("price") <= pl.col("price").quantile(0.67)).then(pl.lit("mid"))

)
Transformation de données avec Polars

Créer des catégories avec des quantiles

reviews.with_columns(
    pl.when(pl.col("price") <= pl.col("price").quantile(0.33)).then(pl.lit("budget"))
    .when(pl.col("price") <= pl.col("price").quantile(0.67)).then(pl.lit("mid"))
    .otherwise(pl.lit("premium")).alias("price_band")
)
shape: (15, 5)
| business         | location      | review | price | price_band |
| ---              | ---           | ---    | ---   | ---        |
| str              | str           | f64    | i64   | str        |
|------------------|---------------|--------|-------|------------|
| 7burgers         | Wakey Wakey   | 4.2    | 15    | mid        |
| Bang Bang Burger | Forest Rd.    | 3.8    | 12    | budget     |
| ...              | ...           | ...    | ...   | ...        |
Transformation de données avec Polars

Quantiles vs seuils fixes

$$

Seuils par quantiles

  • Basés sur les données actuelles
  • Tailles de groupes équilibrées
  • S’adaptent si les données changent

$$

Seuils fixes

  • Exemple : 10 et 20 livres
  • Tailles de groupes inconnues
  • Faciles à comprendre
Transformation de données avec Polars

Catégories avec seuils fixes

reviews.with_columns(


)
Transformation de données avec Polars

Catégories avec seuils fixes

reviews.with_columns(
    pl.col("price")

)
Transformation de données avec Polars

Catégories avec seuils fixes

reviews.with_columns(
    pl.col("price")
    .cut(
)
Transformation de données avec Polars

Catégories avec seuils fixes

reviews.with_columns(
    pl.col("price")
    .cut(breaks=[10, 20] 
)
Transformation de données avec Polars

Catégories avec seuils fixes

reviews.with_columns(
    pl.col("price")
    .cut(breaks=[10, 20], labels=["budget", "mid", "premium"]) 
)
Transformation de données avec Polars

Catégories avec seuils fixes

reviews.with_columns(
    pl.col("price")
    .cut(breaks=[10, 20], labels=["budget", "mid", "premium"]).alias("price_band")
)
shape: (15, 5)
| business         | location      | review | price | price_band |
| ---              | ---           | ---    | ---   | ---        |
| str              | str           | f64    | i64   | cat        |
|------------------|---------------|--------|-------|------------|
| 7burgers         | Wakey Wakey   | 4.2    | 15    | mid        |
| Costa Coffee     | City Point    | 4.5    | 8     | budget     |
| The Queens Head  | Denman St.    | 4.7    | 25    | premium    |
| ...              | ...           | ...    | ...   | ...        |
Transformation de données avec Polars

Construire un histogramme

reviews["price"]
Transformation de données avec Polars

Construire un histogramme

reviews["price"].hist()
shape: (10, 3)
| breakpoint | category     | count |
| ---        | ---          | ---   |
| f64        | cat          | u32   |
|------------|--------------|-------|
| 8.4        | [6.0, 8.4]   | 3     |
| 10.8       | (8.4, 10.8]  | 1     |
| ...        | ...          | ...   |
| 27.6       | (25.2, 27.6] | 0     |
| 30.0       | (27.6, 30.0] | 2     |
Transformation de données avec Polars

Histogramme avec nombre de classes défini

reviews["price"].hist(bin_count=5)
shape: (5, 3)
| breakpoint | category      | count |
| ---        | ---           | ---   |
| f64        | cat           | u32   |
|------------|---------------|-------|
| 10.8       | [6.0, 10.8]   | 4     |
| 15.6       | (10.8, 15.6]  | 3     |
| 20.4       | (15.6, 20.4]  | 3     |
| 25.2       | (20.4, 25.2]  | 3     |
| 30.0       | (25.2, 30.0]  | 2     |
Transformation de données avec Polars

Histogramme avec bornes définies

reviews["price"].hist(bins=[0, 10, 20, 100])
shape: (3, 3)
| breakpoint | category       | count |
| ---        | ---            | ---   |
| f64        | cat            | u32   |
|------------|----------------|-------|
| 10.0       | [0.0, 10.0]    | 4     |
| 20.0       | (10.0, 20.0]   | 6     |
| 100.0      | (20.0, 100.0]  | 5     |
Transformation de données avec Polars

Tracer l’histogramme

import plotly.express as px


hist = reviews["price"].hist(bins=[0, 10, 20, 100])
Transformation de données avec Polars

Tracer l’histogramme

import plotly.express as px

hist = reviews["price"].hist(bins=[0, 10, 20, 100])

fig = px.bar(hist, x="category", y="count")

fig.show()
Transformation de données avec Polars

Tracer l’histogramme

Transformation de données avec Polars

Passons à la pratique !

Transformation de données avec Polars

Preparing Video For Download...