Hub documentation
Преобразование набора данных
Преобразование набора данных
На этой странице мы рассмотрим некоторые из наиболее распространённых операций, используемых при анализе данных. Это лишь небольшая часть возможностей Polars. Для получения дополнительной информации посетите Документацию.
В качестве примера мы будем использовать датасет Common Crawl statistics. Эти статистические данные включают: количество страниц, распределение доменов верхнего уровня, пересечения при обходе и т. д. Более подробную информацию и графики можно найти на их официальной странице со статистикой.
Чтение
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 │
└─────┴────────┴───────────────────┴────────────┴───┴───────┴──────┴───────┴─────────┘Выбор столбцов
Набор данных содержит некоторые столбцы, которые нам не нужны. Чтобы удалить их, мы воспользуемся методом 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 │
└────────┴───────────────────┴────────────┴─────┴───────┴─────────┘Фильтрация
Мы можем отфильтровать набор данных с помощью метода filter. Этот метод принимает сложные выражения, но начнём с простого: отфильтруем данные по дате сбора:
import datetime
df = df.filter(pl.col("date") >= datetime.date(2020, 1, 1))Можно объединять несколько предикатов с помощью операторов & или |:
df = df.filter(
(pl.col("date") >= datetime.date(2020, 1, 1)) |
pl.col("crawl").str.contains("CC")
)Преобразование
Чтобы добавить новые столбцы в набор данных, используйте with_columns. В примере ниже мы вычисляем общее количество страниц для каждого домена и добавляем новый столбец pages_per_domain с помощью метода alias. Всё выражение внутри with_columns называется выражением. Подробнее об выражениях и о том, как их использовать, читайте в пользовательском руководстве 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 │
└────────┴─────────────────┴────────────┴─────┴───────┴─────────┴──────────────────┘Агрегация и сортировка
Для агрегации данных можно использовать методы group_by, agg и sort. В контексте агрегации можно комбинировать выражения, создавая мощные, но при этом легко читаемые конструкции.
Сначала мы агрегируем все данные по верхнеуровневому домену tld для каждой даты скрейпинга:
df = df.group_by("tld", "date").agg(
pl.col("pages").sum(),
pl.col("domains").sum(),
)Теперь мы можем вычислить несколько статистических показателей для каждого домена верхнего уровня:
- Количество уникальных дат скрейпинга
- Среднее количество доменов за период сбора
- Средний темп роста по количеству страниц
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 │
└─────┴───────────────────┴───────────────────────┴─────────────────────────────────┘