데이터셋 변환하기
데이터셋 변환하기 (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 문서를 참고합니다.