Utiliser les types Categorical et Enum

Mise à l'échelle et optimisation des pipelines de données avec Polars

Liam Brannigan

Data Scientist & Polars Contributor

Encoder des chaînes répétées

Schéma d'un tableau avec une colonne de titres d'événements et une colonne de secteurs contenant des chaînes répétées.

Mise à l'échelle et optimisation des pipelines de données avec Polars

Encoder des chaînes répétées

Schéma d'un tableau avec une colonne de titres d'événements et une colonne de secteurs où les chaînes sont encodées par des entiers.

Mise à l'échelle et optimisation des pipelines de données avec Polars

Ensemble avec étiquettes répétées

events = pl.read_parquet("chicago_events.parquet")
Mise à l'échelle et optimisation des pipelines de données avec Polars

Ensemble avec étiquettes répétées

events["area"].value_counts(sort=True).head(5)
shape: (5, 2)
| area          | count |
| ---           | ---   |
| str           | u32   |
|-------------  |-------|
| Loop          | 35982 |
| West Loop     | 27432 |
| Andersonville | 24660 |
| Downtown      | 24320 |
| Pullman       | 21985 |
Mise à l'échelle et optimisation des pipelines de données avec Polars

Créer une colonne Categorical

events_cat = events.with_columns(
    pl.col("area").cast(pl.Categorical)
)
Mise à l'échelle et optimisation des pipelines de données avec Polars

Créer une colonne Categorical

events_cat.select("event_title","area").head()
shape: (5, 2)
| event_title        | area          |
| ---                | ---           |
| str                | cat           |
|--------------------|---------------|
| Folk Festival      | Andersonville |
| Fireworks Night    | Downtown      |
| Greektown Market   | West Side     |
| Rail History Day   | Pullman       |
| Grant Park Concert | Loop          |
Mise à l'échelle et optimisation des pipelines de données avec Polars

Créer une colonne Categorical

events_cat.select("event_title","area").with_columns(
    pl.col("area").to_physical().alias("physical")
).head(3)
shape: (3, 3)
| event_title        | area          | physical |
| ---                | ---           | ---      |
| str                | cat           | u32      |
|--------------------|---------------|----------|
| Folk Festival      | Andersonville | 0        |
| Fireworks Night    | Downtown      | 1        |
| Greektown Market   | West Side     | 2        |
Mise à l'échelle et optimisation des pipelines de données avec Polars

Utiliser une expression catégorielle

events_cat.select("event_title","area",
    pl.col("area").cat.starts_with("West").alias("westside"),
)
Mise à l'échelle et optimisation des pipelines de données avec Polars

Utiliser une expression catégorielle

events_cat.select("event_title","area",
    pl.col("area").cat.starts_with("West").alias("westside"),
).filter(pl.col("westside")).head(2)
shape: (2, 3)
| event_title             | area      | westside |
| ---                     | ---       | ---      |
| str                     | cat       | bool     |
|-------------------------|-----------|----------|
| Greektown Market        | West Side | true     |
| West Loop Chef Showcase | West Loop | true     |
  • Autres opérations sur chaînes → reconvertir en String
Mise à l'échelle et optimisation des pipelines de données avec Polars

Categorical et Enum

Schéma d'un tableau avec une colonne de titres d'événements et une colonne de secteurs où les chaînes sont encodées par des entiers.

Mise à l'échelle et optimisation des pipelines de données avec Polars

Créer une colonne Enum

area_enum = pl.Enum([
    "Albany Park",
    "Andersonville",
    ...
    "West Loop",
    "West Side",
    "Wicker Park",
])
Mise à l'échelle et optimisation des pipelines de données avec Polars

Créer une colonne Enum

events_enum = events.with_columns(
    pl.col("area").cast(area_enum)
)
Mise à l'échelle et optimisation des pipelines de données avec Polars

Créer une colonne Enum

events_enum.select("event_title", "area").head()
shape: (5, 2)
| event_title                  | area           |
| ---                          | ---            |
| str                          | enum           |
|------------------------------|----------------|
| Greektown Market             | West Side      |
| Folk Festival                | Andersonville  |
| West Loop Chef Showcase      | West Loop      |
| Rail History Day             | Pullman        |
| Fireworks Night              | Downtown       |
Mise à l'échelle et optimisation des pipelines de données avec Polars

Inspecter le type Enum

events_enum.schema["area"]
Enum(categories=['Albany Park', 'Andersonville', 'Chinatown', 'Downtown', ...])
  • Enum pour un vocabulaire fixe
  • Categorical pour un vocabulaire variable
Mise à l'échelle et optimisation des pipelines de données avec Polars

Efficience mémoire d'Enum

events_enum.select("event_title","area").with_columns(
    pl.col("area").to_physical().alias("physical")
).head(3)
shape: (3, 3)
| event_title        | area          | physical |
| ---                | ---           | ---      |
| str                | enum          | u8       |
|--------------------|---------------|----------|
| Folk Festival      | Andersonville | 1        |
| Fireworks Night    | Downtown      | 3        |
| Greektown Market   | West Side     | 16       |
Mise à l'échelle et optimisation des pipelines de données avec Polars

Passons à la pratique !

Mise à l'échelle et optimisation des pipelines de données avec Polars

Preparing Video For Download...