Skip to content

Pandas Rolling Window: Janelas Rolling, Expanding e EWM

Updated on

Médias móveis e sinais suavizados são centrais em análise de séries temporais, mas muitas equipes têm dificuldades com alinhamento de janelas, valores ausentes e loops lentos em Python.

  • Problema: Calcular estatísticas rolling “na mão” é propenso a erros e muitas vezes fica desalinhado com os timestamps.
  • Agravante: Loops e shifts ad hoc produzem erros de off-by-one, lacunas nos períodos iniciais e notebooks lentos.
  • Solução: Use rolling, expanding e ewm com as definições corretas de janela (min_periods, janelas baseadas em tempo, center, adjust) para obter resultados corretos, rápidos e vetorizados.

Want an AI agent that understands your pandas notebooks and rolling-window features?

RunCell is a JupyterLab AI agent that can read your code, analyze DataFrames, understand notebook context, debug errors, and even generate & execute code for you. It works directly inside JupyterLab—no switching windows or copy-pasting.

👉 Try RunCell: runcell.dev (opens in a new tab)


Referência Rápida

Tipo de janelaMelhor usoPrincipais parâmetros
rollingMédias móveis, volatilidade, funções personalizadas de janelawindow=3 (ou "7D"), min_periods, center, win_type, on
expandingEstatísticas cumulativas desde o iníciomin_periods
ewmSuavização com decaimento exponencial ou métricas ponderadasspan, alpha, halflife, adjust, times

Dados de Exemplo

import pandas as pd
 
dates = pd.date_range("2024-01-01", periods=8, freq="D")
sales = pd.DataFrame({"date": dates, "revenue": [10, 12, 9, 14, 15, 13, 11, 16]})
sales = sales.set_index("date")

Janelas Rolling (Fixas e Baseadas em Tempo)

Janelas de tamanho fixo

sales["rev_ma3"] = (
    sales["revenue"]
    .rolling(window=3, min_periods=2)
    .mean()
)
  • min_periods controla quando os resultados começam; as primeiras linhas ficam como NaN até que a contagem mínima seja atingida.
  • center=True alinha a estatística ao meio da janela (útil para gráficos).

Janelas baseadas em tempo em índice datetime ou coluna on=

sales_reset = sales.reset_index()
sales_reset["rev_7d_mean"] = (
    sales_reset.rolling("7D", on="date")["revenue"].mean()
)
  • Use strings de duração ("7D", "48H") para amostragem irregular; o pandas escolhe as linhas dentro do horizonte de lookback em vez de uma contagem fixa.
  • Para controlar se o intervalo inclui bordas antes/depois, ajuste closed="left" ou "right" conforme necessário.

Funções de janela personalizadas

sales["rev_range"] = (
    sales["revenue"].rolling(4).apply(lambda x: x.max() - x.min(), raw=True)
)

Defina raw=True para trabalhar com arrays NumPy dentro de apply e ganhar desempenho.


Janelas Expanding (Cumulativas)

sales["rev_cum_mean"] = sales["revenue"].expanding(min_periods=2).mean()
  • Use expanding quando cada observação deve enxergar tudo o que veio antes (média móvel cumulativa, razões cumulativas).
  • Combine com shift() para comparar o valor mais recente com a média histórica.

Janelas Exponentially Weighted (EWM)

sales["rev_ewm_span4"] = sales["revenue"].ewm(span=4, adjust=False).mean()
  • adjust=False usa a fórmula recursiva que espelha a suavização típica em dashboards de analytics.
  • halflife oferece um decaimento intuitivo: ewm(halflife=3) reduz o peso pela metade a cada 3 períodos.
  • Para timestamps irregulares, passe times="date" (ou defina o índice) para ponderar por deltas de tempo reais em vez de contagem de linhas.

Escolhendo a Janela Certa (Cheat Sheet)

ObjetivoMétodo recomendadoObservações
Suavizar ruído de curto prazorolling com window pequeno e center=TrueFunciona em colunas numéricas; mantenha min_periods ≥ 1 para visibilidade inicial
Totais ou médias corridas desde o inícioexpandingNão tem janela fixa; ótimo para KPIs acumulativos
Dar menos peso a observações antigasewm(span=...)Melhor que janelas rolling grandes para sinais de momentum
Timestamps irregularesrolling("7D", on="date") baseado em tempo ou ewm(..., times="date")Evita viés de dias com amostragem mais densa
Geração de featuresrolling().agg(["mean","std","min","max"])Multi-agregação cria conjuntos de features organizados rapidamente

Dicas de Performance e Corretude

  • Mantenha colunas de data/hora como datetime64[ns] e defina um índice ao trabalhar intensamente com janelas baseadas em tempo.
  • Prefira agregações nativas (mean, std, sum, count) em vez de apply em Python para melhor desempenho.
  • Evite viés com visão para o futuro: use shift() antes de aplicar rolling ao construir features para aprendizado supervisionado.
  • Combine com resample para normalizar a frequência antes de aplicar rolling se os dados de origem forem irregulares.

Janelas rolling, expanding e exponenciais cobrem a maior parte das necessidades de suavização e feature engineering sem loops. Combine-as com pandas-to-datetime e pandas-resample para eixos de tempo limpos, e você terá métricas rápidas e confiáveis, prontas para gráficos ou modelos.