Hub documentation
Biến đổi bộ dữ liệu của bạn
Biến đổi bộ dữ liệu của bạn
Trên trang này, chúng tôi sẽ hướng dẫn bạn thực hiện một số thao tác phổ biến nhất khi phân tích dữ liệu. Đây chỉ là một phần nhỏ trong những gì có thể làm được với Polars. Để biết thêm thông tin, vui lòng truy cập Tài liệu.
Trong ví dụ, chúng ta sẽ sử dụng bộ dữ liệu thống kê Common Crawl. Các thống kê này bao gồm: số lượng trang, phân bố các tên miền cấp cao nhất, sự chồng chéo giữa các lần thu thập dữ liệu, v.v. Để biết thêm thông tin chi tiết và biểu đồ, vui lòng truy cập trang thống kê chính thức của họ.
Đọc
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 │
└─────┴────────┴───────────────────┴────────────┴───┴───────┴──────┴───────┴─────────┘Chọn các cột
Bộ dữ liệu chứa một số cột không cần thiết. Để loại bỏ chúng, chúng ta sẽ sử dụng phương thức 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 │
└────────┴───────────────────┴────────────┴─────┴───────┴─────────┘Lọc
Chúng ta có thể lọc bộ dữ liệu bằng phương thức filter. Phương thức này chấp nhận các biểu thức phức tạp, nhưng hãy bắt đầu đơn giản bằng cách lọc dựa trên ngày thu thập:
import datetime
df = df.filter(pl.col("date") >= datetime.date(2020, 1, 1))Bạn có thể kết hợp nhiều điều kiện với toán tử & hoặc |:
df = df.filter(
(pl.col("date") >= datetime.date(2020, 1, 1)) |
pl.col("crawl").str.contains("CC")
)Biến đổi
Để thêm các cột mới vào dataset, hãy sử dụng with_columns. Trong ví dụ bên dưới, chúng ta tính tổng số trang cho mỗi domain và thêm một cột mới pages_per_domain bằng phương thức alias. Toàn bộ câu lệnh bên trong with_columns được gọi là một biểu thức. Đọc thêm về biểu thức và cách sử dụng chúng trong Polars user guide
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 │
└────────┴─────────────────┴────────────┴─────┴───────┴─────────┴──────────────────┘Tổng hợp & Sắp xếp
Để tổng hợp dữ liệu, bạn có thể sử dụng các phương thức group_by, agg và sort. Trong ngữ cảnh tổng hợp, bạn có thể kết hợp các biểu thức để tạo ra các câu lệnh mạnh mẽ mà vẫn dễ đọc.
Đầu tiên, chúng tôi tổng hợp tất cả dữ liệu theo tên miền cấp cao nhất tld cho mỗi ngày thu thập:
df = df.group_by("tld", "date").agg(
pl.col("pages").sum(),
pl.col("domains").sum(),
)Bây giờ chúng ta có thể tính toán một số thống kê cho mỗi tên miền cấp cao nhất:
- Số lượng ngày thu thập dữ liệu duy nhất
- Số lượng trung bình các miền trong khoảng thời gian thu thập
- Tốc độ tăng trưởng trung bình theo số trang
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 │
└─────┴───────────────────┴───────────────────────┴─────────────────────────────────┘