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 |
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.