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,expandingeewmcom 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 janela | Melhor uso | Principais parâmetros |
|---|---|---|
rolling | Médias móveis, volatilidade, funções personalizadas de janela | window=3 (ou "7D"), min_periods, center, win_type, on |
expanding | Estatísticas cumulativas desde o início | min_periods |
ewm | Suavização com decaimento exponencial ou métricas ponderadas | span, 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_periodscontrola quando os resultados começam; as primeiras linhas ficam comoNaNaté que a contagem mínima seja atingida.center=Truealinha 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=Falseusa a fórmula recursiva que espelha a suavização típica em dashboards de analytics.halflifeoferece 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)
| Objetivo | Método recomendado | Observações |
|---|---|---|
| Suavizar ruído de curto prazo | rolling com window pequeno e center=True | Funciona em colunas numéricas; mantenha min_periods ≥ 1 para visibilidade inicial |
| Totais ou médias corridas desde o início | expanding | Não tem janela fixa; ótimo para KPIs acumulativos |
| Dar menos peso a observações antigas | ewm(span=...) | Melhor que janelas rolling grandes para sinais de momentum |
| Timestamps irregulares | rolling("7D", on="date") baseado em tempo ou ewm(..., times="date") | Evita viés de dias com amostragem mais densa |
| Geração de features | rolling().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 deapplyem 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
resamplepara 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.