Métodos de Reamostragem de Séries Temporais no Python

O que é reamostragem de séries temporais?

Da mesma forma que podemos agrupar os dados por categoria, a reamostragem nos permite agrupar os dados em diferentes intervalos de tempo. Isso é valioso tanto para a limpeza de dados quanto para a análise aprofundada de séries temporais. Por exemplo, talvez seja necessário alinhar duas séries temporais a uma frequência comum antes de compará-las.

Há dois tipos principais de reamostragem:

  • Aumento da amostragem: Aumentar a frequência de nossos dados (por exemplo, de anual para mensal). Isso cria novos pontos de tempo que precisam ser preenchidos ou interpolados.
  • Redução da amostragem: Diminuir a frequência (por exemplo, de mensal para anual). Isso envolve a agregação de pontos de dados dentro dos novos intervalos de tempo maiores. É uma técnica que necessita cuidado para lidar.

Você pode realizar a reamostragem com o pandas usando dois métodos principais: .asfreq() e .resample().

Para obter o código e o tutorial deste exercício faça parte do Clube AM e receba toda semana os códigos em R/Python, vídeos, tutoriais e suporte completo para dúvidas.

Reamostragem usando o método asfreq() do pandas

Vamos começar com o método .asfreq(). Esse método converte uma série temporal em uma frequência especificada, retornando os dados originais alinhados com um novo índice nessa frequência.

O método requer que o dataframe tenha no índice os valores de data (em datetime).

Aumento da amostragem com asfreq()

Para ilustrar o aumento da amostragem, imagine que queremos converter nossas leituras mensais da Inflação medida pelo IPCA em leituras por dia. Você pode fazer isso usando o método .asfreq() com o parâmetro freq=‘D’.

O conjunto de dados resultante é notavelmente maior, pois novas linhas foram criadas com dados diários em vez de mensais. Por padrão, .asfreq() usa a primeira entrada no índice original e preenche as horas restantes com valores nulos.

O método oferece três estratégias para preencher esses valores nulos:

  • Preenchimento para frente (ffill): Propaga a última observação válida para frente.
  • Preenchimento para trás (bfill): Usa a próxima observação válida para preencher a lacuna.
  • Valor de preenchimento: Fornece um valor específico para substituir os dados ausentes.

As duas primeiras estratégias são implementadas usando o parâmetro method no método .asfreq(), enquanto o valor de preenchimento é especificado com o parâmetro fill_value.

Vamos para o exemplo:

ipca
Date
2002-01-01 0.52
2002-02-01 0.36
2002-03-01 0.60
2002-04-01 0.80
2002-05-01 0.21
... ...
2024-06-01 0.21
2024-07-01 0.38
2024-08-01 -0.02
2024-09-01 0.44
2024-10-01 0.56

274 rows × 1 columns

ipca
Date
2002-01-01 0.52
2002-01-02 NaN
2002-01-03 NaN
2002-01-04 NaN
2002-01-05 NaN
... ...
2024-09-27 NaN
2024-09-28 NaN
2024-09-29 NaN
2024-09-30 NaN
2024-10-01 0.56

8310 rows × 1 columns

ipca ffill bfill valor
Date
2002-01-01 0.52 0.52 0.52 0.52
2002-01-02 NaN 0.52 0.36 0.00
2002-01-03 NaN 0.52 0.36 0.00
2002-01-04 NaN 0.52 0.36 0.00
2002-01-05 NaN 0.52 0.36 0.00
... ... ... ... ...
2024-09-27 NaN 0.44 0.56 0.00
2024-09-28 NaN 0.44 0.56 0.00
2024-09-29 NaN 0.44 0.56 0.00
2024-09-30 NaN 0.44 0.56 0.00
2024-10-01 0.56 0.56 0.56 0.56

8310 rows × 4 columns

Agora temos o aumento da amostra, em que nesse caso especifico, torna-se mensal para diário. Veja que esse método tem alguns problemas, já que para análises, não é útil utilizar valores repetidos e nulos. Valores especificos devem ser inseridos com cuidado. Portanto, é sempre necessário que seja acompanhado de métodos mais robustos e complexos para a inserção de valores.

Redução da amostragem com asfreq()

Agora vamos explorar a redução da amostragem. Suponha que você queira alterar a frequência diária para mensal. Você pode fazer isso usando .asfreq() com o parâmetro freq=‘M’.

Nesse caso, estamos reduzindo a frequência dos nossos dados, passando de diária para mensal. Vamos usar o conjunto de dados referente ao preço de fechamento diário da ação ITUB4, em que vamos transformar no preço final de cada mês.

Date
2020-01-02    38.029999
2020-01-03    37.630001
2020-01-06    37.070000
2020-01-07    36.209999
2020-01-08    35.619999
                ...    
2023-12-21    32.790001
2023-12-22    33.310001
2023-12-26    33.650002
2023-12-27    33.880001
2023-12-28    33.970001
Name: Close, Length: 993, dtype: float64
Date
2020-01-31    32.820000
2020-02-29          NaN
2020-03-31    23.090000
2020-04-30    22.770000
2020-05-31          NaN
2020-06-30    25.450001
2020-07-31    26.889999
2020-08-31    23.549999
2020-09-30    22.500000
2020-10-31          NaN
2020-11-30    28.559999
2020-12-31          NaN
2021-01-31          NaN
2021-02-28          NaN
2021-03-31    27.969999
2021-04-30    27.530001
2021-05-31    29.540001
2021-06-30    29.799999
2021-07-31          NaN
2021-08-31    30.940001
2021-09-30    28.930000
2021-10-31          NaN
2021-11-30    22.379999
2021-12-31          NaN
2022-01-31    25.330000
2022-02-28          NaN
2022-03-31    27.480000
2022-04-30          NaN
2022-05-31    26.160000
2022-06-30    22.670000
2022-07-31          NaN
2022-08-31    25.809999
2022-09-30    28.059999
2022-10-31    30.400000
2022-11-30    26.000000
2022-12-31          NaN
2023-01-31    25.330000
2023-02-28    25.430000
2023-03-31    24.740000
2023-04-30          NaN
2023-05-31    26.330000
2023-06-30    28.420000
2023-07-31    28.639999
2023-08-31    27.430000
2023-09-30          NaN
2023-10-31    26.820000
2023-11-30    31.590000
Freq: ME, Name: Close, dtype: float64

Veja que os valores escolhidos são o fim de perído do mês, e que alguns estão com valores ausentes, já que o preço é computado em dias úteis e o método não os reconhece. Nenhuma agregação é realizada (por exemplo, o cálculo do preço médio mensal). Para realizar essas agregações, usaremos o método .resample() na próxima seção.

Reamostragem usando o método resample() do pandas

Embora .asfreq() seja útil para exibir dados de séries temporais em uma frequência diferente, o método .resample() é a ferramenta preferida para realizar agregações e reamostragem.

O método .resample() funciona de forma muito semelhante ao .groupby(): ele agrupa os dados em um intervalo de tempo especificado e, em seguida, aplica uma ou mais funções a cada grupo. O resultado dessas funções é atribuído a uma nova data dentro desse intervalo.

Usamos .resample() tanto para aumento da amostragem (preenchimento ou interpolação de dados ausentes) quanto para redução da amostragem (agregação de dados).

A aplicação de .resample() retorna um objeto Resampler, ao qual podemos aplicar outro método para obter um DataFrame.

Com relação ao aumento da amostragem, o método .resample() pode realizar as mesmas tarefas que o .asfreq(), portanto, não iremos revisar essas mesma funções aqui.

Vamos iniciar .resample() usando o método .interpolate(), que estima os valores em novos pontos de tempo encontrando pontos ao longo de uma linha reta entre os pontos de dados existentes. Para isso vamos transformar os valores mensais do IPCA em valores diários.

ipca
Date
2002-01-01 0.520000
2002-01-02 0.514839
2002-01-03 0.509677
2002-01-04 0.504516
2002-01-05 0.499355
... ...
2024-09-27 0.544000
2024-09-28 0.548000
2024-09-29 0.552000
2024-09-30 0.556000
2024-10-01 0.560000

8310 rows × 1 columns

O método .resample() se destaca quando se trata de reduzir a amostragem, pois nos permite aplicar vários métodos de agregação para resumir nossos dados. Por exemplo, podemos calcular a média mensal e a mediana trimestral dos preços de fechamento da ação ITUB4 usando .resample().

Date
2020-01-31    34.766364
2020-02-29    33.386111
2020-03-31    25.719545
2020-04-30    22.672000
2020-05-31    22.458500
Freq: ME, Name: Close, dtype: float64
Date
2020-03-31    33.320000
2020-06-30    23.309999
2020-09-30    24.879999
2020-12-31    28.690000
2021-03-31    28.065000
Freq: QE-DEC, Name: Close, dtype: float64

Exemplo: IPCA Var %. Mensal para Var %. Trimestral

Vamos agora trabalhar com um exemplo prático e completo sobre reamostragem de séries temporais. Esse é um problema comum em análise de dados econômicos, especialmente quando o objetivo é obter informações relevantes a partir de agregações de dados, como converter variações mensais em trimestrais.

Ao lidarmos com séries específicas, como a variação do IPCA, valores como o fim de período, a média ou a mediana nem sempre são úteis para explicar o comportamento desejado. Por isso, é crucial compreender a natureza da série e como a agregação impacta os resultados.

Por exemplo, ao analisar a variação mensal do IPCA, estamos considerando a mudança do índice de um mês para o outro. O mesmo raciocínio se aplica à variação trimestral, que representa a mudança acumulada ao longo de um trimestre. No entanto, nesse caso, a agregação não é trivial: não podemos simplesmente somar ou calcular a média das variações mensais. Devemos, em vez disso, multiplicar as variações mensais de forma acumulativa para refletir corretamente a mudança no índice trimestral.

Esse tipo de problema é recorrente em análises econômicas, algo que enfrentamos frequentemente aqui na Análise Macro. É importante lembrar que cada série pode exigir um tratamento específico, dependendo da métrica e da periodicidade analisada. Por isso, é fundamental compreender a lógica por trás da série e os objetivos da análise antes de definir o método de reamostragem.

Para simplificar esse processo, vamos criar uma função que acumula variações percentuais, permitindo realizar a reamostragem.

Assim como aplicamos cálculos como média ou mediana, também podemos realizar a acumulação de forma eficiente, integrando-a ao método .resample(). No entanto, como estamos utilizando uma função personalizada que não faz parte da classe de métodos disponíveis diretamente, precisamos aplicá-la com o auxílio do método .apply().

ipca
Date
2002-03-31 1.487163
2002-06-30 1.435929
2002-09-30 2.581039
2002-12-31 6.561323
2003-03-31 5.132745
... ...
2023-12-31 1.083588
2024-03-31 1.415492
2024-06-30 1.053516
2024-09-30 0.801508
2024-12-31 0.560000

92 rows × 1 columns

Tenha acesso ao código e suporte desse e de mais 500 exercícios no Clube AM!

Quer o código desse e de mais de 500 exercícios de análise de dados com ideias validadas por nossos especialistas em problemas reais de análise de dados do seu dia a dia? Além de acesso a vídeos, materiais extras e todo o suporte necessário para você reproduzir esses exercícios? Então, conheça o Clube AM clicando aqui.

Compartilhe esse artigo

Facebook
Twitter
LinkedIn
WhatsApp
Telegram
Email
Print

Comente o que achou desse artigo

Outros artigos relacionados

Análise de impacto fiscal sobre o dolár com Python

Usamos uma cesta de 12 moedas para construir um cenário contrafactual da taxa de câmbio após o último anúncio de pacote fiscal, com base em modelagem Bayesiana. No período, o dolár depreciou quase 5% e passou os R$ 6,15, enquanto que na ausência da intervenção a moeda deveria estar cotada em R$ 5,78.

Resultado IBC-br - Outubro/2024

A Análise Macro apresenta os resultados da IBC-br de Outubro de 2024, com gráficos elaborados em Python para coleta, tratamento e visualização de dados. Todo o conteúdo, disponível exclusivamente no Clube AM, foi desenvolvido com base nos métodos ensinados nos cursos da Análise Macro, permitindo aos assinantes acesso aos códigos e replicação das análises.

Resultado PMC - Outubro/2024

A Análise Macro apresenta os resultados da PMC de Outubro de 2024, com gráficos elaborados em Python para coleta, tratamento e visualização de dados. Todo o conteúdo, disponível exclusivamente no Clube AM, foi desenvolvido com base nos métodos ensinados nos cursos da Análise Macro, permitindo aos assinantes acesso aos códigos e replicação das análises.

Boletim AM

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais e conteúdos exclusivos sobre Análise de Dados!

Boletim AM

Receba diretamente em seu e-mail gratuitamente nossas promoções especiais e conteúdos exclusivos sobre Análise de Dados!

como podemos ajudar?

Preencha os seus dados abaixo e fale conosco no WhatsApp

Boletim AM

Preencha o formulário abaixo para receber nossos boletins semanais diretamente em seu e-mail.