Hub documentation
Transformer votre jeu de données
Transformer votre jeu de données
Sur cette page, nous vous guidons à travers certaines des opérations les plus courantes utilisées lors de l’analyse de données. Il s’agit d’un petit sous-ensemble de ce qui est possible avec Polars. Pour plus d’informations, veuillez consulter la Documentation.
Pour l’exemple, nous utiliserons le jeu de données Common Crawl statistics. Ces statistiques incluent : le nombre de pages, la distribution des domaines de premier niveau, les chevauchements de crawl, etc. Pour des informations et des graphiques plus détaillés, veuillez consulter leur page de statistiques officielle.
Lecture
import polars as pl
df = pl.read_csv(
"hf://datasets/commoncrawl/statistics/tlds.csv",
try_parse_dates=True,
)
df.head(3)┌─────┬────────┬───────────────────┬────────────┬───┬───────┬──────┬───────┬─────────┐
│ ┆ suffix ┆ crawl ┆ date ┆ … ┆ pages ┆ urls ┆ hosts ┆ domains │
│ --- ┆ --- ┆ --- ┆ --- ┆ ┆ --- ┆ --- ┆ --- ┆ --- │
│ i64 ┆ str ┆ str ┆ date ┆ ┆ i64 ┆ i64 ┆ f64 ┆ f64 │
╞═════╪════════╪═══════════════════╪════════════╪═══╪═══════╪══════╪═══════╪═════════╡
│ 0 ┆ a.se ┆ CC-MAIN-2008-2009 ┆ 2009-01-12 ┆ … ┆ 18 ┆ 18 ┆ 1.0 ┆ 1.0 │
│ 1 ┆ a.se ┆ CC-MAIN-2009-2010 ┆ 2010-09-25 ┆ … ┆ 3462 ┆ 3259 ┆ 166.0 ┆ 151.0 │
│ 2 ┆ a.se ┆ CC-MAIN-2012 ┆ 2012-11-02 ┆ … ┆ 6957 ┆ 6794 ┆ 172.0 ┆ 150.0 │
└─────┴────────┴───────────────────┴────────────┴───┴───────┴──────┴───────┴─────────┘Sélection de colonnes
Le jeu de données contient certaines colonnes dont nous n'avons pas besoin. Pour les supprimer, nous utiliserons la méthode select :
df = df.select("suffix", "date", "tld", "pages", "domains")
df.head(3)┌────────┬───────────────────┬────────────┬─────┬───────┬─────────┐
│ suffix ┆ crawl ┆ date ┆ tld ┆ pages ┆ domains │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ str ┆ date ┆ str ┆ i64 ┆ f64 │
╞════════╪═══════════════════╪════════════╪═════╪═══════╪═════════╡
│ a.se ┆ CC-MAIN-2008-2009 ┆ 2009-01-12 ┆ se ┆ 18 ┆ 1.0 │
│ a.se ┆ CC-MAIN-2009-2010 ┆ 2010-09-25 ┆ se ┆ 3462 ┆ 151.0 │
│ a.se ┆ CC-MAIN-2012 ┆ 2012-11-02 ┆ se ┆ 6957 ┆ 150.0 │
└────────┴───────────────────┴────────────┴─────┴───────┴─────────┘Filtrage
Nous pouvons filtrer le jeu de données à l'aide de la méthode filter. Cette méthode accepte des expressions complexes, mais commençons simplement en filtrant sur la date de collecte :
import datetime
df = df.filter(pl.col("date") >= datetime.date(2020, 1, 1))Vous pouvez combiner plusieurs prédicats avec les opérateurs & ou | :
df = df.filter(
(pl.col("date") >= datetime.date(2020, 1, 1)) |
pl.col("crawl").str.contains("CC")
)Transformation
Pour ajouter de nouvelles colonnes au jeu de données, utilisez with_columns. Dans l'exemple ci-dessous, nous calculons le nombre total de pages par domaine et ajoutons une nouvelle colonne pages_per_domain à l'aide de la méthode alias. L'ensemble de la déclaration dans with_columns est appelé une expression. En savoir plus sur les expressions et leur utilisation dans le guide utilisateur Polars
df = df.with_columns(
(pl.col("pages") / pl.col("domains")).alias("pages_per_domain")
)
df.sample(3)┌────────┬─────────────────┬────────────┬─────┬───────┬─────────┬──────────────────┐
│ suffix ┆ crawl ┆ date ┆ tld ┆ pages ┆ domains ┆ pages_per_domain │
│ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ str ┆ date ┆ str ┆ i64 ┆ f64 ┆ f64 │
╞════════╪═════════════════╪════════════╪═════╪═══════╪═════════╪══════════════════╡
│ net.bt ┆ CC-MAIN-2014-41 ┆ 2014-10-06 ┆ bt ┆ 4 ┆ 1.0 ┆ 4.0 │
│ org.mk ┆ CC-MAIN-2016-44 ┆ 2016-10-31 ┆ mk ┆ 1445 ┆ 430.0 ┆ 3.360465 │
│ com.lc ┆ CC-MAIN-2016-44 ┆ 2016-10-31 ┆ lc ┆ 1 ┆ 1.0 ┆ 1.0 │
└────────┴─────────────────┴────────────┴─────┴───────┴─────────┴──────────────────┘Agrégation et tri
Pour agréger des données, vous pouvez utiliser les méthodes group_by, agg et sort. Dans le contexte d'agrégation, vous pouvez combiner des expressions pour créer des déclarations puissantes qui restent faciles à lire.
Tout d'abord, nous agrégons toutes les données au niveau du domaine de plus haut niveau tld par date de collecte :
df = df.group_by("tld", "date").agg(
pl.col("pages").sum(),
pl.col("domains").sum(),
)Nous pouvons maintenant calculer plusieurs statistiques par domaine de premier niveau :
- Nombre de dates de collecte uniques
- Nombre moyen de domaines sur la période de collecte
- Taux de croissance moyen en nombre de pages
df = df.group_by("tld").agg(
pl.col("date").unique().count().alias("number_of_scrapes"),
pl.col("domains").mean().alias("avg_number_of_domains"),
pl.col("pages").sort_by("date").pct_change().mean().alias("avg_page_growth_rate"),
)
df = df.sort("avg_number_of_domains", descending=True)
df.head(10)┌─────┬───────────────────┬───────────────────────┬─────────────────────────────────┐
│ tld ┆ number_of_scrapes ┆ avg_number_of_domains ┆ avg_percent_change_in_number_o… │
│ --- ┆ --- ┆ --- ┆ --- │
│ str ┆ u32 ┆ f64 ┆ f64 │
╞═════╪═══════════════════╪═══════════════════════╪═════════════════════════════════╡
│ com ┆ 101 ┆ 1.9571e7 ┆ 0.022182 │
│ de ┆ 101 ┆ 1.8633e6 ┆ 0.5232 │
│ org ┆ 101 ┆ 1.5049e6 ┆ 0.019604 │
│ net ┆ 101 ┆ 1.5020e6 ┆ 0.021002 │
│ cn ┆ 101 ┆ 1.1101e6 ┆ 0.281726 │
│ ru ┆ 101 ┆ 1.0561e6 ┆ 0.416303 │
│ uk ┆ 101 ┆ 827453.732673 ┆ 0.065299 │
│ nl ┆ 101 ┆ 710492.623762 ┆ 1.040096 │
│ fr ┆ 101 ┆ 615471.594059 ┆ 0.419181 │
│ jp ┆ 101 ┆ 615391.455446 ┆ 0.246162 │
└─────┴───────────────────┴───────────────────────┴─────────────────────────────────┘