그룹별로 데이터 변환

Polars로 하는 데이터 변환

Liam Brannigan

Data Scientist & Polars Contributor

왜 그룹 통계와 비교할까요?

하루 동안 전기 요금의 시계열 차트

  • 일반보다 가격이 높은가요, 낮은가요?
Polars로 하는 데이터 변환

왜 그룹 통계와 비교할까요?

시간대별 평균 가격이 포함된 하루 전기 요금 시계열 차트

Polars로 하는 데이터 변환

왜 그룹 통계와 비교할까요?

정오에 저렴한 가격을 보여주는 주석과 시간대별 평균 가격이 표시된 하루 전기 요금 시계열 차트

Polars로 하는 데이터 변환

왜 그룹 통계와 비교할까요?

저녁에 정상 가격을 보여주는 주석과 시간대별 평균 가격이 표시된 하루 전기 요금 시계열 차트

Polars로 하는 데이터 변환

시간 추출하기

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   |
Polars로 하는 데이터 변환

.over()로 윈도 함수 사용

prices.with_columns(
    pl.col("price").mean()
)
Polars로 하는 데이터 변환

.over()로 윈도 함수 사용

prices.with_columns(
    pl.col("price").mean().over("hour")
)
Polars로 하는 데이터 변환

.over()로 윈도 함수 사용

prices.with_columns(
    pl.col("price").mean().over("hour").alias("hourly_avg")
)
Polars로 하는 데이터 변환

.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       |
Polars로 하는 데이터 변환

날씨 범주 만들기

  • 맑음: solar > 400 W/m²
  • 흐림: solar <= 400 W/m²
Polars로 하는 데이터 변환

날씨 범주 만들기

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  |
Polars로 하는 데이터 변환

여러 열로 그룹화하기

prices.with_columns(
    pl.col("price").mean()
)
Polars로 하는 데이터 변환

여러 열로 그룹화하기

prices.with_columns(
    pl.col("price").mean().over("hour", "weather")
)
Polars로 하는 데이터 변환

여러 열로 그룹화하기

prices.with_columns(
    pl.col("price").mean().over("hour", "weather").alias("avg_by_hour_weather")
)
Polars로 하는 데이터 변환

여러 열로 그룹화하기

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                |
Polars로 하는 데이터 변환

그룹 평균과 비교하기

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

)
Polars로 하는 데이터 변환

그룹 평균과 비교하기

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

)
Polars로 하는 데이터 변환

그룹 평균과 비교하기

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                |
Polars로 하는 데이터 변환

기타 윈도 집계

.over()는 많은 집계에 사용 가능:

  • .sum().over() - 그룹 합계
  • .max().over() - 그룹 최대값
  • .count().over() - 그룹 크기
Polars로 하는 데이터 변환

Ayo berlatih!

Polars로 하는 데이터 변환

Preparing Video For Download...