API · Pandas
Função Pandas DataFrame.rolling()
A função DataFrame rolling() fornece uma janela contínua para operações matemáticas.
Nesta página
A função DataFrame.rolling() do Python Pandas fornece uma janela rolante para operações matemáticas. Chamar rolling() sozinha não calcula nada: ela retorna um objeto Rolling que define as janelas móveis, e um método de agregação como sum(), mean() ou std() reduz então cada janela a uma linha de resultados. Como uma janela normalmente termina na linha atual, o resultado mantém o mesmo índice do DataFrame original, o que torna rolling() a forma padrão de construir somas acumuladas móveis, médias móveis e outras estatísticas em execução.
Sintaxe de pandas.DataFrame.rolling()
DataFrame.rolling(
window, min_periods=None, center=False, win_type=None, on=None,
closed=None, step=None, method='single'
)
Parâmetros
window |
É um parâmetro do tipo inteiro, deslocamento (offset) ou subclasse de BaseIndexer. Ele especifica o tamanho da janela móvel: um número fixo de observações ou, quando um deslocamento é usado, um intervalo de tempo como '3D'. |
min_periods |
É um parâmetro inteiro. Ele especifica o número mínimo de observações em uma janela que não são NaN; janelas com menos observações retornam NaN. Quando não é definido, o padrão é o tamanho da janela para janelas fixas e 1 para janelas baseadas em tempo. |
center |
É um parâmetro booleano. Quando é True, cada resultado é rotulado no centro de sua janela em vez de na borda direita. |
win_type |
É um parâmetro do tipo string. Ele especifica um tipo de janela ponderada como 'triang', de modo que as observações dentro da janela contribuem com pesos diferentes. A maioria dos tipos de janela ponderados requer o SciPy. |
on |
É um parâmetro do tipo string. Ele especifica o nome da coluna sobre a qual calcular a janela rolante, em vez do índice; é usado com janelas baseadas em tempo quando as datas estão armazenadas em uma coluna. |
closed |
É um parâmetro do tipo string. Ele especifica qual lado do intervalo da janela é fechado. Tem quatro opções: right, left, both ou neither. O padrão é right. |
step |
É um parâmetro inteiro. A janela é avaliada apenas a cada step linhas, portanto o resultado contém somente essas linhas. |
Retorno
Retorna um objeto de janela Rolling. Chamar um método de agregação sobre ele retorna um DataFrame com o mesmo índice da entrada.
A assinatura acima é a atual. O parâmetro axis que os tutoriais mais antigos mostram não existe mais, porque uma janela rolante sempre se move ao longo do índice; passá-lo gera um TypeError, como mostrado na seção de erros abaixo.
Exemplo: soma rolante com uma janela fixa de 2
A forma mais comum usa uma janela inteira que conta linhas. Neste exemplo, rolling(2).sum() soma cada linha à linha diretamente acima dela.
import pandas as pd
dataframe = pd.DataFrame({
'Attendance': {0: 60, 1: 100, 2: 80, 3: 78, 4: 95},
'Obtained Marks': {0: 90, 1: 75, 2: 82, 3: 64, 4: 45},
})
print("The Original DataFrame is:")
print(dataframe)
print("The Rolling Sum With a Window of 2 is:")
print(dataframe.rolling(2).sum())
Resultado:
The Original DataFrame is:
Attendance Obtained Marks
0 60 90
1 100 75
2 80 82
3 78 64
4 95 45
The Rolling Sum With a Window of 2 is:
Attendance Obtained Marks
0 NaN NaN
1 160.0 165.0
2 180.0 157.0
3 158.0 146.0
4 173.0 109.0
A linha 0 não tem nenhuma linha acima dela, portanto sua janela contém uma única observação — menos do que as duas que o min_periods padrão exige — e o resultado é NaN. A partir da linha 1, cada valor é a soma da linha atual com a anterior: 60 + 100 = 160, 100 + 80 = 180, e assim por diante. As colunas inteiras se tornam floats por causa desse primeiro NaN.
Exemplo: média rolante e min_periods
A mesma janela funciona com qualquer agregação. Aqui, rolling(3).mean() calcula a média da linha atual e das duas linhas acima dela. Com o min_periods padrão, as duas primeiras linhas não conseguem preencher uma janela de três linhas e permanecem NaN. Definir min_periods=1 diz ao pandas para trabalhar com quantas observações estiverem disponíveis no início, de modo que o resultado é definido desde a primeira linha.
import pandas as pd
dataframe = pd.DataFrame({
'Attendance': {0: 60, 1: 100, 2: 80, 3: 78, 4: 95},
'Obtained Marks': {0: 90, 1: 75, 2: 82, 3: 64, 4: 45},
})
print("The Rolling Mean With a Window of 3 is:")
print(dataframe.rolling(3).mean())
print("The Rolling Mean With a Window of 3 and min_periods=1 is:")
print(dataframe.rolling(3, min_periods=1).mean())
Resultado:
The Rolling Mean With a Window of 3 is:
Attendance Obtained Marks
0 NaN NaN
1 NaN NaN
2 80.000000 82.333333
3 86.000000 73.666667
4 84.333333 63.666667
The Rolling Mean With a Window of 3 and min_periods=1 is:
Attendance Obtained Marks
0 60.000000 90.000000
1 80.000000 82.500000
2 80.000000 82.333333
3 86.000000 73.666667
4 84.333333 63.666667
As duas saídas coincidem a partir do índice 2. A diferença está no topo: min_periods=1 informa adicionalmente 60.00 para a primeira linha (esse valor sozinho) e 80.00 para a segunda (a média dos dois primeiros valores). Observe que min_periods conta as observações que não são NaN, o que também o torna o principal controle para lacunas dentro dos dados, como mostra o último exemplo.
Exemplo: soma rolante sobre uma janela baseada em tempo
window também pode ser um deslocamento de tempo como '3D'. A janela então cobre um intervalo de tempo em vez de um número fixo de linhas, de modo que os registros só contribuem quando caem dentro do intervalo, não importa o quão irregularmente estejam espaçados. Quando as datas estão em uma coluna em vez de no índice, nomeie essa coluna com on. As vendas abaixo não têm registros para 2026-01-04 e 2026-01-07.
import pandas as pd
sales = pd.DataFrame({
'Date': pd.to_datetime(['2026-01-01', '2026-01-02', '2026-01-03',
'2026-01-05', '2026-01-06', '2026-01-08']),
'Sales': [120, 80, 150, 90, 200, 60],
})
print(sales)
print("The Rolling Sum Over the Previous 3 Days is:")
print(sales.rolling('3D', on='Date').sum())
Resultado:
Date Sales
0 2026-01-01 120
1 2026-01-02 80
2 2026-01-03 150
3 2026-01-05 90
4 2026-01-06 200
5 2026-01-08 60
The Rolling Sum Over the Previous 3 Days is:
Date Sales
0 2026-01-01 120.0
1 2026-01-02 200.0
2 2026-01-03 350.0
3 2026-01-05 240.0
4 2026-01-06 290.0
5 2026-01-08 260.0
Para 2026-01-05, a janela de três dias recua para além de 2026-01-02, portanto contém apenas as vendas de 2026-01-03 e 2026-01-05: 150 + 90 = 240. O 2026-01-04 ausente não contribui em nada e não desloca o intervalo do jeito que uma linha extra deslocaria uma janela fixa. Observe que a primeira linha já tem um resultado: uma janela baseada em tempo usa min_periods=1 por padrão, o padrão oposto ao das janelas fixas.
Exemplo: centralizar os rótulos com center e excluir a linha atual com closed
Dois parâmetros mudam o local ao qual um resultado pertence. Com center=True, o valor agregado é colocado na linha central de sua janela em vez de na última, que é o que você quer quando uma média móvel deve se alinhar aos dados que ela suaviza; a primeira e a última linha perdem seu resultado, porque nenhuma janela completa está centrada nelas. closed controla qual extremidade do intervalo é incluída: com closed='left', a janela de uma linha cobre as linhas anteriores a ela e a própria linha fica fora de sua estatística.
import pandas as pd
temps = pd.DataFrame({'Temperature': [10, 12, 14, 16, 18, 20]})
print("The Centered Rolling Mean With a Window of 3 is:")
print(temps.rolling(3, center=True).mean())
print("The Rolling Sum With a Window of 3 and closed='left' is:")
print(temps.rolling(3, closed='left').sum())
Resultado:
The Centered Rolling Mean With a Window of 3 is:
Temperature
0 NaN
1 12.0
2 14.0
3 16.0
4 18.0
5 NaN
The Rolling Sum With a Window of 3 and closed='left' is:
Temperature
0 NaN
1 NaN
2 NaN
3 36.0
4 42.0
5 48.0
A média centrada no índice 1 é 12.0 — a média de 10, 12 e 14 — e ela fica na linha central dessa janela. As somas com closed='left' mostram o familiar padrão 36, 42, 48 deslocado uma linha para baixo: no índice 3, a janela contém as linhas de 0 a 2 (10 + 12 + 14 = 36), porque a própria linha 3 está excluída.
Erros comuns e casos limites
Três comportamentos surpreendem os usuários com mais frequência, e cada um deles é visível em um pequeno exemplo.
Valores ausentes dentro da janela
Como min_periods conta as observações que não são NaN, um único valor ausente esvazia cada janela fixa que o contém, além da janela seguinte a ela. Reduzir min_periods faz a agregação usar os valores que existem.
import pandas as pd
scores = pd.DataFrame({'Score': [50.0, None, 70.0, 90.0]})
print(scores)
print("The Rolling Sum With a Window of 2 is:")
print(scores.rolling(2).sum())
print("The Rolling Sum With a Window of 2 and min_periods=1 is:")
print(scores.rolling(2, min_periods=1).sum())
Resultado:
Score
0 50.0
1 NaN
2 70.0
3 90.0
The Rolling Sum With a Window of 2 is:
Score
0 NaN
1 NaN
2 NaN
3 160.0
The Rolling Sum With a Window of 2 and min_periods=1 is:
Score
0 50.0
1 50.0
2 70.0
3 160.0
Com as configurações padrão, apenas a última soma, 70 + 90, sobrevive. Com min_periods=1, a janela no índice 2 contém um valor válido, portanto sua soma é 70: a entrada ausente é ignorada em vez de propagada. Nenhum dos dois comportamentos repara os dados — escolha entre eles com base em se uma janela parcial faz sentido para a sua estatística.
Argumentos inválidos geram ValueError
rolling() valida seus argumentos antes de qualquer cálculo. Uma janela negativa falha imediatamente:
import pandas as pd
temps = pd.DataFrame({'Temperature': [10, 12, 14, 16, 18, 20]})
print(temps.rolling(-1).sum())
Resultado:
ValueError: window must be an integer 0 or greater
Um valor closed desconhecido falha da mesma forma, com ValueError: closed must be 'right', 'left', 'both' or 'neither', e uma janela fracionária como 2.5 é rejeitada com a mesma mensagem da janela negativa. Observe que window=0 é aceito, mas é degenerado: cada janela está vazia, portanto sum() retorna 0.0 para cada linha.
Colunas não numéricas geram DataError
As agregações aceitam apenas dados numéricos. Aplicar uma janela rolante a um DataFrame que ainda contém uma coluna de texto gera um erro:
import pandas as pd
mixed = pd.DataFrame({'Name': ['A', 'B', 'C'], 'Value': [1, 2, 3]})
print(mixed.rolling(2).sum())
Resultado:
pandas.errors.DataError: Cannot aggregate non-numeric type: str
Selecione as colunas numéricas antes de aplicar a janela — por exemplo, mixed[['Value']].rolling(2).sum() — ou remova primeiro as colunas de rótulos.
Pontos para ter em mente
rolling()por si só retorna um objetoRolling; nada é calculado até que um método de agregação seja chamado. O resultado sempre carrega o índice da entrada, portanto pode ser atribuído diretamente como uma nova coluna.- Colunas inteiras se tornam floats assim que um
NaNaparece na saída, porqueNaNnão tem representação inteira. - Para cálculos agrupados, chame
rolling()em um objetogroupby, como emdf.groupby('key').rolling(2).sum(): a janela então recomeça em cada grupo em vez de cruzar os limites dos grupos. - Janelas ponderadas por meio de
win_typesão destinadas a dados do tipo sinal; para dados comerciais comuns, as agregações não ponderadas dos exemplos acima são o padrão correto.