Transformera data per grupp

Datatransformation med Polars

Liam Brannigan

Data Scientist & Polars Contributor

Varför jämföra med gruppstatistik?

Tidsseriegraf över elpriser under en dag

  • Är priserna högre eller lägre än normalt?
Datatransformation med Polars

Varför jämföra med gruppstatistik?

Tidsseriegraf över elpriser under en dag med timvisa genomsnittspriser

Datatransformation med Polars

Varför jämföra med gruppstatistik?

Tidsseriegraf över elpriser under en dag med timvisa genomsnittspriser och en anteckning om låga priser vid lunchtid

Datatransformation med Polars

Varför jämföra med gruppstatistik?

Tidsseriegraf över elpriser under en dag med timvisa genomsnittspriser och en anteckning om normala priser på kvällen

Datatransformation med Polars

Extrahera timmen

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   |
Datatransformation med Polars

Fönsterfunktion med .over()

prices.with_columns(
    pl.col("price").mean()
)
Datatransformation med Polars

Fönsterfunktion med .over()

prices.with_columns(
    pl.col("price").mean().over("hour")
)
Datatransformation med Polars

Fönsterfunktion med .over()

prices.with_columns(
    pl.col("price").mean().over("hour").alias("hourly_avg")
)
Datatransformation med Polars

Fönsterfunktion med .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       |
Datatransformation med Polars

Skapa en väderkategori

  • Soligt: solar > 400 W/m²
  • Molnigt: solar <= 400 W/m²
Datatransformation med Polars

Skapa en väderkategori

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  |
Datatransformation med Polars

Gruppera efter flera kolumner

prices.with_columns(
    pl.col("price").mean()
)
Datatransformation med Polars

Gruppera efter flera kolumner

prices.with_columns(
    pl.col("price").mean().over("hour", "weather")
)
Datatransformation med Polars

Gruppera efter flera kolumner

prices.with_columns(
    pl.col("price").mean().over("hour", "weather").alias("avg_by_hour_weather")
)
Datatransformation med Polars

Gruppera efter flera kolumner

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                |
Datatransformation med Polars

Jämföra med gruppmedelvärdet

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

)
Datatransformation med Polars

Jämföra med gruppmedelvärdet

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

)
Datatransformation med Polars

Jämföra med gruppmedelvärdet

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                |
Datatransformation med Polars

Andra fönsteraggregationer

.over() fungerar med många aggregationer:

  • .sum().over() – gruppsummor
  • .max().over() – gruppmaximum
  • .count().over() – gruppstorlekar
Datatransformation med Polars

Nu kör vi en övning!

Datatransformation med Polars

Preparing Video For Download...