Biến đổi dữ liệu theo nhóm

Biến đổi dữ liệu với Polars

Liam Brannigan

Data Scientist & Polars Contributor

Vì sao so sánh với thống kê theo nhóm?

Biểu đồ chuỗi thời gian giá điện trong một ngày

  • Giá cao hay thấp hơn mức bình thường?
Biến đổi dữ liệu với Polars

Vì sao so sánh với thống kê theo nhóm?

Biểu đồ chuỗi thời gian giá điện trong một ngày với giá trung bình theo giờ

Biến đổi dữ liệu với Polars

Vì sao so sánh với thống kê theo nhóm?

Biểu đồ chuỗi thời gian giá điện trong một ngày với giá trung bình theo giờ và chú thích cho biết giá rẻ vào giữa trưa

Biến đổi dữ liệu với Polars

Vì sao so sánh với thống kê theo nhóm?

Biểu đồ chuỗi thời gian giá điện trong một ngày với giá trung bình theo giờ và chú thích cho biết giá bình thường vào buổi tối

Biến đổi dữ liệu với Polars

Trích xuất giờ

prices.with_columns(
    pl.col("time").dt.hour().alias("hour")
)
| time                | price | solar   | hour |
| ---                 | ---   | ---     | ---  |
| datetime[µs]        | f64   | f64     | i8   |
|---------------------|-------|-------  |------|
| 2025-07-05 10:00:00 | 2.3   | 419.0   | 10   |
| 2025-07-05 11:00:00 | 0.5   | 481.0   | 11   |
| 2025-07-05 12:00:00 | 0.0   | 462.0   | 12   |
Biến đổi dữ liệu với Polars

Hàm cửa sổ với .over()

prices.with_columns(
    pl.col("price").mean()
)
Biến đổi dữ liệu với Polars

Hàm cửa sổ với .over()

prices.with_columns(
    pl.col("price").mean().over("hour")
)
Biến đổi dữ liệu với Polars

Hàm cửa sổ với .over()

prices.with_columns(
    pl.col("price").mean().over("hour").alias("hourly_avg")
)
Biến đổi dữ liệu với Polars

Hàm cửa sổ với .over()

prices.with_columns(
    pl.col("price").mean().over("hour").alias("hourly_avg")
)
| time                | price | solar | hour | hourly_avg |
| ---                 | ---   | ---   | ---  | ---        |
| datetime[µs]        | f64   | f64   | i8   | f64        |
|---------------------|-------|-------|------|------------|
| 2025-07-05 10:00:00 | 2.3   | 419.0 | 10   | 49.6       |
| 2025-07-05 11:00:00 | 0.5   | 481.0 | 11   | 44.4       |
| 2025-07-05 12:00:00 | 0.0   | 462.0 | 12   | 39.5       |
Biến đổi dữ liệu với Polars

Tạo danh mục thời tiết

  • Nắng: solar > 400 W/m²
  • Nhiều mây: solar <= 400 W/m²
Biến đổi dữ liệu với Polars

Tạo danh mục thời tiết

prices.with_columns(
    pl.when(pl.col("solar") > 400)
    .then(pl.lit("sunny"))
    .otherwise(pl.lit("cloudy"))

.alias("weather")
)
| time                | price | solar | weather |
| ---                 | ---   | ---   | ---     |
| datetime[µs]        | f64   | f64   | str     |
|---------------------|-------|-------|---------|
| 2025-07-05 10:00:00 | 2.3   | 419.0 | sunny   |
| 2025-07-06 10:00:00 | 80.5  | 181.0 | cloudy  |
| 2025-07-07 10:00:00 | 41.5  | 150.0 | cloudy  |
Biến đổi dữ liệu với Polars

Nhóm theo nhiều cột

prices.with_columns(
    pl.col("price").mean()
)
Biến đổi dữ liệu với Polars

Nhóm theo nhiều cột

prices.with_columns(
    pl.col("price").mean().over("hour", "weather")
)
Biến đổi dữ liệu với Polars

Nhóm theo nhiều cột

prices.with_columns(
    pl.col("price").mean().over("hour", "weather").alias("avg_by_hour_weather")
)
Biến đổi dữ liệu với Polars

Nhóm theo nhiều cột

prices.with_columns(
    pl.col("price").mean().over("hour", "weather").alias("avg_by_hour_weather")
)
| time                | price | hour | weather | avg_by_hour_weather |
| ---                 | ---   | ---  | ---     | ---                 |
| datetime[µs]        | f64   | i8   | str     | f64                 |
|---------------------|-------|------|---------|---------------------|
| 2025-07-05 10:00:00 | 2.3   | 10   | sunny   | 34.2                |
| 2025-07-06 10:00:00 | 80.5  | 10   | cloudy  | 58.0                |
| 2025-07-07 10:00:00 | 41.5  | 10   | cloudy  | 58.0                |
Biến đổi dữ liệu với Polars

So sánh với trung bình nhóm

prices.with_columns(
    (pl.col("price")                                     )

)
Biến đổi dữ liệu với Polars

So sánh với trung bình nhóm

prices.with_columns(
    (pl.col("price") - pl.col("price").mean().over("hour"))

)
Biến đổi dữ liệu với Polars

So sánh với trung bình nhóm

prices.with_columns(
    (pl.col("price") - pl.col("price").mean().over("hour"))
    .alias("diff_from_hourly_avg")
)
| time                | price | hour | diff_from_hourly_avg |
| ---                 | ---   | ---  | ---                  |
| datetime[µs]        | f64   | i8   | f64                  |
|---------------------|-------|------|----------------------|
| 2025-07-05 10:00:00 | 2.3   | 10   | -47.3                |
| 2025-07-06 10:00:00 | 25.1  | 10   | -24.5                |
| 2025-07-07 10:00:00 | 2.7   | 10   | -46.9                |
Biến đổi dữ liệu với Polars

Các phép tổng hợp cửa sổ khác

.over() dùng với nhiều phép tổng hợp:

  • .sum().over() - tổng theo nhóm
  • .max().over() - giá trị lớn nhất nhóm
  • .count().over() - kích thước nhóm
Biến đổi dữ liệu với Polars

Ayo berlatih!

Biến đổi dữ liệu với Polars

Preparing Video For Download...