Reamostragem de séries temporais
Reduza dados diários para dados mensais com resample('ME').sum() e aumente a frequência usando preenchimento para a frente para completar intervalos ausentes.
Reamostragem de séries temporais é uma aula grátis de Pandas & NumPy Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Pandas & NumPy Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Pandas & NumPy Academy inclui 4 aulas no total.
O que é reamostragem
Reamostragem altera a frequência de uma série temporal. A redução da frequência diminui a frequência — por exemplo, convertendo dados diários em totais mensais. O aumento da frequência eleva a frequência — por exemplo, convertendo dados mensais em diários e preenchendo lacunas com valores interpolados. Ambas as operações exigem um DatetimeIndex e são realizadas com o método resample(), a versão do Pandas de groupby() sensível ao tempo.
O método resample()
df.resample(rule) cria um objeto DatetimeIndexResampler, no qual rule é um alias de deslocamento de frequência. Assim como em groupby(), nada é calculado até que você encadeie um método de agregação. Regras comuns: 'D' (dia), 'W' (semana), 'ME' (fim do mês), 'QE' (fim do trimestre) e 'YE' (fim do ano). O DataFrame deve ter um DatetimeIndex.
import pandas as pd
import numpy as np
np.random.seed(42)
dates = pd.date_range('2024-01-01', periods=90, freq='D')
df = pd.DataFrame({'sales': np.random.randint(100, 500, 90)}, index=dates)
print(df.head())
print('Shape:', df.shape) # (90, 1) -- 90 daily rowsRedução da frequência: de diário para mensal
Para reduzir a frequência de dados diários para mensais, chame resample('ME') e encadeie uma agregação. sum() fornece os totais mensais; mean() fornece as médias mensais; last() fornece o último valor de cada período. O resultado tem uma linha por período, com a data de fim do período como rótulo do índice.
# Monthly totals
monthly_sum = df.resample('ME').sum()
print(monthly_sum)
# sales
# 2024-01-31 9876
# 2024-02-29 8765
# 2024-03-31 9234
# Monthly averages
monthly_mean = df.resample('ME').mean().round(1)
print(monthly_mean)Redução da frequência para semanal
Faça a reamostragem com 'W' para agregar por semana do calendário terminando no domingo. Use 'W-MON' se quiser semanas terminando na segunda-feira. O Pandas agrupa todas as datas de cada semana e aplica a agregação. Isso é útil para relatórios semanais nos quais você quer uma linha de resumo por semana.
# Weekly sum
weekly = df.resample('W').sum()
print(weekly.head())
# sales
# 2024-01-07 2010 <- Jan 1-7
# 2024-01-14 2340 <- Jan 8-14
# ...
# Weekly max and count using agg()
weekly_stats = df.resample('W').agg(['sum', 'mean', 'max'])
print(weekly_stats.head())Aplicando várias agregações
Assim como em groupby(), você pode encadear .agg() em um reamostrador para calcular várias estatísticas em uma única passagem. Passe uma lista de nomes de funções ou um dicionário para agregações nomeadas. Essa é a maneira mais eficiente de criar uma tabela abrangente de resumo de séries temporais.
monthly_stats = df.resample('ME').agg(
total_sales=('sales', 'sum'),
avg_sales=('sales', 'mean'),
peak_sales=('sales', 'max'),
days_counted=('sales', 'count')
)
print(monthly_stats.round(1))
# total_sales avg_sales peak_sales days_counted
# 2024-01-31 9876 318.6 499 31Reamostragem OHLC para dados financeiros
Para séries temporais financeiras, o método .ohlc() reamostra os valores Open, High, Low, Close (OHLC) de cada período — a representação padrão em candlestick. Isso só é significativo para dados numéricos que representam um preço ou nível. Cada coluna da entrada gera quatro colunas OHLC na saída.
# OHLC monthly resampling
ohlc = df['sales'].resample('ME').ohlc()
print(ohlc)
# open high low close
# 2024-01-31 365 499 101 243
# 2024-02-29 ...Aumento da frequência: de mensal para diário
O aumento da frequência eleva a frequência, criando linhas para marcas temporais que não existiam nos dados originais. Essas novas linhas inicialmente contêm NaN. Em seguida, preencha-as com um método adequado aos seus dados: ffill() (preenchimento para frente — transporta o último valor conhecido) ou bfill() (preenchimento para trás — usa o próximo valor conhecido), ou interpolate() para uma interpolação suave.
# Monthly data
monthly = pd.Series(
[100, 120, 115],
index=pd.date_range('2024-01-31', periods=3, freq='ME')
)
print(monthly)
# Upsample to daily (creates NaN rows)
daily = monthly.resample('D').asfreq()
print(daily.head(10))
# 2024-01-31 100.0
# 2024-02-01 NaN <- new row
# ...Preenchendo lacunas após o aumento da frequência
Depois de aumentar a frequência, preencha as lacunas NaN criadas para as novas marcas temporais. ffill() propaga o último valor conhecido até a próxima observação real — uma boa opção para preços, quando o último preço negociado continua válido. interpolate(method='linear') preenche com valores espaçados linearmente entre as observações — uma boa opção para variáveis contínuas suaves.
# Forward fill: carry monthly value forward to every day
daily_ffill = monthly.resample('D').ffill()
print(daily_ffill.head(35))
# 2024-01-31 100
# 2024-02-01 100 <- forward filled
# ...
# 2024-02-29 120 <- new month value
# Linear interpolation
daily_interp = monthly.resample('D').interpolate(method='linear')
print(daily_interp.head(10))Reamostragem dentro de grupos
Você pode combinar groupby() e resample() para reamostrar cada grupo separadamente. Chame groupby(column).resample(rule) em um DataFrame com DatetimeIndex. Isso produz um resultado com MultiIndex, no qual o nível externo é a chave do grupo e o nível interno é o período temporal reamostrado — muito útil para análises de séries temporais por produto ou região.
df2 = pd.DataFrame({
'product': ['A', 'B', 'A', 'B', 'A', 'B'],
'sales': [100, 150, 120, 130, 110, 160]
}, index=pd.date_range('2024-01-01', periods=6, freq='ME'))
# Monthly sum per product
result = df2.groupby('product').resample('QE').sum()
print(result)Ancoragem de deslocamento personalizado
Por padrão, 'ME' ancora nas datas do fim do mês do calendário. Para períodos fiscais não padrão, use deslocamentos como 'QS-APR' (trimestre iniciado em abril) ou 'YS-OCT' (ano iniciado em outubro). O Pandas oferece suporte a muitos aliases de deslocamento ancorados. Consulte a documentação do Pandas para ver a lista completa ao trabalhar com períodos fiscais que não seguem o calendário.
# Fiscal year starting in April
fiscal_annual = df.resample('YE-MAR').sum()
print(fiscal_annual)
# sales
# 2024-03-31 XXXX <- April 2023 to March 2024
# Quarter starting in April
fiscal_q = df.resample('QE-MAR').mean().round(0)
print(fiscal_q)Verificando a integridade do resultado reamostrado
Depois da reamostragem, verifique sempre se o resultado faz sentido. Confira se o número de períodos de saída corresponde ao esperado, se não há períodos ausentes (procure por NaN na saída) e se a soma dos totais mensais é igual à soma dos dados diários originais ao reduzir a frequência com sum(). Essas verificações de consistência detectam erros de deslocamento de uma unidade nas strings de frequência e intervalos de datas ausentes.
monthly = df.resample('ME').sum()
# Verify: monthly totals should sum to daily total
assert monthly['sales'].sum() == df['sales'].sum(), 'Sum mismatch!'
# Verify: expected number of months
print('Months:', len(monthly)) # should be 3 for 90 days Jan-Mar
# Check for any NaN
print('NaN count:', monthly.isna().sum().sum())Verificação rápida
Teste sua compreensão da reamostragem de séries temporais desta lição.
Recapitulação da lição
Nesta lição, você aprendeu que resample() é o equivalente de groupby() sensível ao tempo para alterar a frequência de séries temporais; a redução da frequência agrega dados (de diário para mensal com sum/mean); o aumento da frequência cria novas marcas temporais que devem ser preenchidas com ffill() ou interpolate(); e é possível combinar groupby() com resample() para agregar dados temporais por grupo. Em seguida, exploraremos deslocamentos e recursos de defasagem.
Aprenda Python com um tutor de IA — grátis
Escreva e execute código real no seu navegador, obtenha ajuda instantânea de um tutor de IA 24/7 e continue de onde parou na web ou no app.
- Cursos
- 30
- Aulas
- 120
Perguntas Frequentes
A aula “Reamostragem de séries temporais” é grátis?
Sim — o texto completo de “Reamostragem de séries temporais” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Pandas & NumPy Academy, atualize para CoddyKit PRO. O curso de Pandas & NumPy Academy inclui 4 aulas no total.
O que vou aprender em “Reamostragem de séries temporais”?
Reduza dados diários para dados mensais com resample('ME').sum() e aumente a frequência usando preenchimento para a frente para completar intervalos ausentes. Você pratica Pandas & NumPy Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Pandas & NumPy Academy?
Nenhuma experiência prévia é necessária. Pandas & NumPy Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Reamostragem de séries temporais”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Pandas & NumPy Academy?
Sim. Cada aula de Pandas & NumPy Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- DatetimeIndex e intervalos de períodos
- Reamostragem de séries temporais
- Deslocamentos e variáveis defasadas
- Extraindo características temporais