데이터셋 변환하기

데이터셋 변환하기 (Transforming your dataset)

이 페이지에서는 데이터 분석에서 가장 흔히 쓰는 작업 몇 가지를 안내해요. 이것은 Polars에서 가능한 것의 일부일 뿐이니 더 자세한 내용은 문서를 방문하세요.

출처: 문서

본문

이 페이지에서는 데이터 분석을 할 때 가장 흔히 사용하는 일부 작업을 안내합니다. 이것은 Polars에서 가능한 것의 작은 부분집합일 뿐이에요. 자세한 내용은 문서를 방문하세요.

예시로 Common Crawl 통계 데이터셋을 사용할 거예요. 이 통계에는 페이지 수, 최상위 도메인 분포, 크롤 중복 등이 포함됩니다. 더 자세한 정보와 그래프는 공식 통계 페이지를 방문하세요.

읽기 (Reading)

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   │
└─────┴────────┴───────────────────┴────────────┴───┴───────┴──────┴───────┴─────────┘

컬럼 선택 (Selecting columns)

데이터셋에는 필요 없는 컬럼이 몇 개 있어요. 제거하려면 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   │
└────────┴───────────────────┴────────────┴─────┴───────┴─────────┘

필터링 (Filtering)

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")
)

변환 (Transforming)

데이터셋에 새 컬럼을 추가하려면 with_columns를 사용하세요. 아래 예시에서 도메인당 총 페이지 수를 계산하고 alias 메서드로 새 컬럼 pages_per_domain을 추가합니다. with_columns 안의 전체 문장을 표현식(expression)이라고 해요. 표현식과 사용법에 대해 더 알아보려면 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              │
└────────┴─────────────────┴────────────┴─────┴───────┴─────────┴──────────────────┘

집계와 정렬 (Aggregation & Sorting)

데이터를 함께 집계하려면 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                        │
└─────┴───────────────────┴───────────────────────┴─────────────────────────────────┘

더 알아보기 (Learn more)

Polars로 hf://datasets/<repo>/<file> 경로로 Hub 데이터셋을 CSV로 읽어 DataFrame으로 만든 뒤, select(컬럼 선택), filter(필터링), with_columns(새 컬럼 추가), group_by+agg+sort(집계·정렬)를 조합해 데이터를 분석할 수 있어요. Common Crawl 통계 데이터셋을 예시로 실습해 보세요. 자세한 내용은 Polars 문서를 참고합니다.