Transformando dados por grupo

Transformação de Dados com Polars

Liam Brannigan

Data Scientist & Polars Contributor

Por que comparar com estatísticas do grupo?

Gráfico de série temporal dos preços de eletricidade ao longo de um dia

  • Os preços estão acima ou abaixo do normal?
Transformação de Dados com Polars

Por que comparar com estatísticas do grupo?

Gráfico de série temporal dos preços de eletricidade ao longo de um dia com as médias por hora

Transformação de Dados com Polars

Por que comparar com estatísticas do grupo?

Gráfico de série temporal dos preços de eletricidade ao longo de um dia com as médias por hora e uma anotação mostrando preços baixos ao meio-dia

Transformação de Dados com Polars

Por que comparar com estatísticas do grupo?

Gráfico de série temporal dos preços de eletricidade ao longo de um dia com as médias por hora e uma anotação mostrando preços normais à noite

Transformação de Dados com Polars

Extraindo a hora

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   |
Transformação de Dados com Polars

Função janela com .over()

prices.with_columns(
    pl.col("price").mean()
)
Transformação de Dados com Polars

Função janela com .over()

prices.with_columns(
    pl.col("price").mean().over("hour")
)
Transformação de Dados com Polars

Função janela com .over()

prices.with_columns(
    pl.col("price").mean().over("hour").alias("hourly_avg")
)
Transformação de Dados com Polars

Função janela com .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       |
Transformação de Dados com Polars

Criando uma categoria de clima

  • Ensolarado: solar > 400 W/m²
  • Nublado: solar <= 400 W/m²
Transformação de Dados com Polars

Criando uma categoria de clima

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  |
Transformação de Dados com Polars

Agrupando por várias colunas

prices.with_columns(
    pl.col("price").mean()
)
Transformação de Dados com Polars

Agrupando por várias colunas

prices.with_columns(
    pl.col("price").mean().over("hour", "weather")
)
Transformação de Dados com Polars

Agrupando por várias colunas

prices.with_columns(
    pl.col("price").mean().over("hour", "weather").alias("avg_by_hour_weather")
)
Transformação de Dados com Polars

Agrupando por várias colunas

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                |
Transformação de Dados com Polars

Comparando com a média do grupo

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

)
Transformação de Dados com Polars

Comparando com a média do grupo

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

)
Transformação de Dados com Polars

Comparando com a média do grupo

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                |
Transformação de Dados com Polars

Outras agregações de janela

.over() funciona com várias agregações:

  • .sum().over() - totais do grupo
  • .max().over() - máximos do grupo
  • .count().over() - tamanhos do grupo
Transformação de Dados com Polars

Vamos praticar!

Transformação de Dados com Polars

Preparing Video For Download...