Medias móviles y acumulados

Transformación de datos con Polars

Liam Brannigan

Data Scientist & Polars Contributor

¿Por qué estadísticas móviles?

Gráfico de líneas de precios de electricidad

Transformación de datos con Polars

¿Por qué estadísticas móviles?

Gráfico de líneas de precios de electricidad con estadísticas móviles

Transformación de datos con Polars

Media móvil en una columna

prices.with_columns(

)
Transformación de datos con Polars

Media móvil en una columna

prices.with_columns(
    pl.col("price").rolling_mean(            )
)
Transformación de datos con Polars

Media móvil en una columna

prices.with_columns(
    pl.col("price").rolling_mean(window_size=3)
)
Transformación de datos con Polars

Media móvil en una columna

prices.with_columns(
    pl.col("price").rolling_mean(window_size=3).alias("smoothed")
)
Transformación de datos con Polars

Media móvil en una columna

prices.with_columns(
    pl.col("price").rolling_mean(window_size=3).alias("smoothed")
)
| time                | price | solar | smoothed |
| ---                 | ---   | ---   | ---      |
| datetime[µs]        | f64   | f64   | f64      |
|---------------------|-------|-------|----------|
| 2025-07-05 00:00:00 | 34.2  | 0.0   | null     |
| 2025-07-05 01:00:00 | 28.7  | 0.0   | null     |

Transformación de datos con Polars

Media móvil en una columna

prices.with_columns(
    pl.col("price").rolling_mean(window_size=3).alias("smoothed")
)
| time                | price | solar | smoothed |
| ---                 | ---   | ---   | ---      |
| datetime[µs]        | f64   | f64   | f64      |
|---------------------|-------|-------|----------|
| 2025-07-05 00:00:00 | 34.2  | 0.0   | null     |
| 2025-07-05 01:00:00 | 28.7  | 0.0   | null     |
| 2025-07-05 02:00:00 | 27.5  | 0.0   | 30.1     |
Transformación de datos con Polars

Centrar la ventana

prices.with_columns(
    pl.col("price").rolling_mean(window_size=3,            )
)
Transformación de datos con Polars

Centrar la ventana

prices.with_columns(
    pl.col("price").rolling_mean(window_size=3, center=True).alias("centered")
)
| time                | price | solar | centered |
| ---                 | ---   | ---   | ---      |
| datetime[µs]        | f64   | f64   | f64      |
|---------------------|-------|-------|----------|
| 2025-07-05 00:00:00 | 34.2  | 0.0   | null     |
| 2025-07-05 01:00:00 | 28.7  | 0.0   | 30.1     |
| 2025-07-05 02:00:00 | 27.5  | 0.0   | 27.1     |
Transformación de datos con Polars

Otras expresiones móviles

  • .rolling_sum() - total móvil
  • .rolling_std() - desviación estándar móvil
  • .rolling_max() / .rolling_min()
Transformación de datos con Polars

Rolling en un DataFrame

prices.rolling(                                )


Transformación de datos con Polars

Rolling en un DataFrame

prices.rolling(index_column="time",            )


Transformación de datos con Polars

Rolling en un DataFrame

prices.rolling(index_column="time", period="3h")


Transformación de datos con Polars

Rolling en un DataFrame

prices.rolling(index_column="time", period="3h").agg(
    pl.all().mean()
)
Transformación de datos con Polars

Rolling en un DataFrame

prices.rolling(index_column="time", period="3h").agg(
    pl.all().mean()
)
| time                | price | solar  |
| ---                 | ---   | ---    |
| datetime[µs]        | f64   | f64    |
|---------------------|-------|------- |
| 2025-07-05 10:00:00 | 1.8   | 247.3  |
| 2025-07-05 11:00:00 | 1.4   | 347.7  |
| 2025-07-05 12:00:00 | 0.9   | 420.7  |
Transformación de datos con Polars

¿Por qué estadísticas acumuladas?

Gráfico temporal de potencia solar

  • Tarea: calcula valores acumulados
Transformación de datos con Polars

¿Por qué estadísticas acumuladas?

Gráfico temporal de potencia solar con máximo acumulado

Transformación de datos con Polars

Estadísticas acumuladas

prices.with_columns(
    pl.col("solar")
)
Transformación de datos con Polars

Estadísticas acumuladas

prices.with_columns(
    pl.col("solar").cum_max()
)
Transformación de datos con Polars

Estadísticas acumuladas

prices.with_columns(
    pl.col("solar").cum_max().alias("cumulative_solar")
)
Transformación de datos con Polars

Estadísticas acumuladas

prices.with_columns(
    pl.col("solar").cum_max().alias("cumulative_solar")
)
| time                | price | solar | cumulative_solar |
| ---                 | ---   | ---   | ---              |
| datetime[µs]        | f64   | f64   | f64              |
|---------------------|-------|-------|------------------|
| ...                 | ...   | ...   | ...              |
| 2025-07-05 10:00:00 | 2.3   | 419.0 | 419.0            |
| 2025-07-05 11:00:00 | 0.5   | 481.0 | 481.0            |
| 2025-07-05 12:00:00 | 0.0   | 462.0 | 481.0            |
| ...                 | ...   | ...   | ...              |
Transformación de datos con Polars

Suma acumulada para totales corrientes

prices.with_columns(
    pl.col("solar").cum_sum().alias("total_energy")
)
| time                | price | solar | total_energy |
| ---                 | ---   | ---   | ---          |
| datetime[µs]        | f64   | f64   | f64          |
|---------------------|-------|-------|--------------|
| 2025-07-05 06:00:00 | 22.1  | 62.0  | 62.0         |
| 2025-07-05 07:00:00 | 4.5   | 100.0 | 162.0        |
| 2025-07-05 08:00:00 | 1.7   | 180.0 | 342.0        |
Transformación de datos con Polars

¡Vamos a practicar!

Transformación de datos con Polars

Preparing Video For Download...