Hub documentation

Biến đổi bộ dữ liệu của bạn

Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

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