Filtrering och aggregering efter tidsperiod

Datatransformation med Polars

Liam Brannigan

Data Scientist & Polars Contributor

Hitta specifika priser

Tabell med tidsseriedata

Datatransformation med Polars

Hitta specifika priser

Tabell med tidsseriedata där 1 rad är markerad

Datatransformation med Polars

Hitta specifika priser

Tabell med tidsseriedata där 3 rader är markerade

Datatransformation med Polars

Filtrering med pl.datetime

prices.filter(

)

$$

$$

$$

$$

  • Uppgift: hitta priserna kl. 12:00 den 5 juli
Datatransformation med Polars

Filtrering med pl.datetime

prices.filter(
    pl.col("time") == 
)
Datatransformation med Polars

Filtrering med pl.datetime

prices.filter(
    pl.col("time") == pl.datetime(                                  )
)
Datatransformation med Polars

Filtrering med pl.datetime

prices.filter(
    pl.col("time") == pl.datetime(year=2025, month=7, day=5, hour=12)
)
| time                | price | solar |
| ---                 | ---   | ---   |
| datetime[µs]        | f64   | f64   |
|---------------------|-------|-------|
| 2025-07-05 12:00:00 | 0.0   | 462.0 |
Datatransformation med Polars

Filtrering på datum med pl.date

prices.filter(
    pl.col("time").dt.date() == 
)
Datatransformation med Polars

Filtrering på datum med pl.date

prices.filter(
    pl.col("time").dt.date() == pl.date(year=2025, month=7, day=5)
)
Datatransformation med Polars

Filtrering på datum med pl.date

prices.filter(
    pl.col("time").dt.date() == pl.date(year=2025, month=7, day=5)
)
| time                | price | solar |
| ---                 | ---   | ---   |
| datetime[µs]        | f64   | f64   |
|---------------------|-------|-------|
| 2025-07-05 00:00:00 | 34.2  | 0.0   |
| 2025-07-05 01:00:00 | 28.7  | 0.0   |
| ...                 | ...   | ...   |
| 2025-07-05 23:00:00 | 72.3  | 0.0   |
Datatransformation med Polars

Filtrering av ett datetime-intervall

prices.filter(
    pl.col("time").is_between(


    )
)
Datatransformation med Polars

Filtrering av ett datetime-intervall

prices.filter(
    pl.col("time").is_between(
        pl.datetime(2025, 7, 5, 8),
        pl.datetime(2025, 7, 5, 18)
    )
)
Datatransformation med Polars

Filtrering av ett datetime-intervall

prices.filter(
    pl.col("time").is_between(
        pl.datetime(2025, 7, 5, 8),
        pl.datetime(2025, 7, 5, 18)
    )
)
| time                | price | solar |
| ---                 | ---   | ---   |
| datetime[µs]        | f64   | f64   |
|---------------------|-------|-------|
| 2025-07-05 08:00:00 | 1.7   | 180.0 |
| 2025-07-05 09:00:00 | 1.3   | 243.0 |
| ...                 | ...   | ...   |
| 2025-07-05 17:00:00 | 77.8  | 153.0 |
| 2025-07-05 18:00:00 | 87.3  | 119.0 |
Datatransformation med Polars

Aggregering efter tidsperiod

Rader som aggregeras till tidsfönster

  • Aggregera data med .group_by_dynamic()
Datatransformation med Polars

Aggregering efter tidsperiod

prices.sort("time")


Datatransformation med Polars

Aggregering efter tidsperiod

prices.sort("time").group_by_dynamic("time",          )


Datatransformation med Polars

Aggregering efter tidsperiod

prices.sort("time").group_by_dynamic("time", every="6h")


Datatransformation med Polars

Aggregering i 6-timmarsfönster

prices.sort("time").group_by_dynamic("time", every="6h").agg(

)
Datatransformation med Polars

Aggregering i 6-timmarsfönster

prices.sort("time").group_by_dynamic("time", every="6h").agg(
    pl.col("price").mean().alias("avg_price")
)
Datatransformation med Polars

Aggregering i 6-timmarsfönster

prices.sort("time").group_by_dynamic("time", every="6h").agg(
    pl.col("price").mean().alias("avg_price")
)
| time                | avg_price |
| ---                 | ---       |
| datetime[µs]        | f64       |
|---------------------|-----------|
| 2025-07-05 00:00:00 | 28.4      |
| 2025-07-05 06:00:00 | 15.2      |
| 2025-07-05 12:00:00 | 42.1      |
| 2025-07-05 18:00:00 | 68.7      |
Datatransformation med Polars

Aggregering per dag

prices.sort("time").group_by_dynamic("time", every="1d").agg(

pl.col("price").mean().alias("avg_price"), pl.col("solar").mean().alias("avg_solar")
)
Datatransformation med Polars

Aggregering per dag

prices.sort("time").group_by_dynamic("time", every="1d").agg(
    pl.col("price").mean().alias("avg_price"),
    pl.col("solar").mean().alias("avg_solar")
)
| time                | avg_price | avg_solar |
| ---                 | ---       | ---       |
| datetime[µs]        | f64       | f64       |
|---------------------|-----------|-----------|
| 2025-07-05 00:00:00 | 36.7      | 147.1     |
| 2025-07-06 00:00:00 | 42.1      | 133.8     |
Datatransformation med Polars

Styra fönsterstorlek

  • every – hur ofta ett nytt fönster startar
  • period – längden på varje fönster
  • Som standard är period lika med every
Datatransformation med Polars

Styra fönsterstorlek

prices.group_by_dynamic("time", every="2h")
Datatransformation med Polars

Styra fönsterstorlek

Icke-överlappande 2-timmarsfönster

Datatransformation med Polars

Styra fönsterstorlek

prices.group_by_dynamic("time", every="1h", period="2h")
Datatransformation med Polars

Styra fönsterstorlek

Första överlappande fönstret som startar vid 10

Datatransformation med Polars

Styra fönsterstorlek

Andra överlappande fönstret som startar vid 11

Datatransformation med Polars

Nu kör vi en övning!

Datatransformation med Polars

Preparing Video For Download...