Analisando os grupos do IPCA com o Python
Atualizado em:
autor: Luiz Henrique
A inflação é conhecida como o termo que representa a taxa de crescimento do nível geral de preços entre dois períodos distintos. No Brasil, o indicador que consolidou-se como o principal índice de preços é o Índice de Preços ao Consumidor Amplo (IPCA), divulgado pelo IBGE e amplamente utilizado pela autoridade monetária como referência para realizar o controle da inflação. Neste artigo mostramos como obter a contribuição de cada grupo do IPCA usando o Python.
O IPCA é divulgado mensalmente pelo IBGE, e podemos importar os dados diretamente do SIDRA, através de sua API. Para auxiliar no processo de extração de dados usamos a biblioteca sidrapy, que permite obtermos os dados inserindo os parâmetros sobre a API da tabela de interesse.
Nosso objetivo aqui será o de buscar a série de peso e variação de cada grupo do IPCA, e de posse dos dados, calculamos a contribuição de cada grupo sobre o IPCA. Ao fim, criamos um gráfico de barras que permite avaliarmos o IPCA por grupos.
# Importa as bibliotecas necessárias
!pip install sidrapy
import sidrapy
import numpy as np
import pandas as pd
import datetime as dt
import seaborn as sns
from matplotlib import pyplot as plt
from plotnine import *
IPCA Contribuição por grupo
O primeiro passo será buscar a série na plataforma do sidra de forma que possamos resgatar os códigos do parâmetros.
Uma vez obtida a API da tabela 1737, e seus respectivos códigos, utilizamos a função get_table para obter a série. A API que gerou os dados foi a seguinte: /t/7060/n1/all/v/63,66/p/all/c315/7170,7445,7486,7558,7625,7660,7712,7766,7786/d/v63%202,v66%204.
# Importa as variações e os pesos dos grupos do IPCA
ipca_gp_raw = sidrapy.get_table(table_code = '7060',
territorial_level = '1',
ibge_territorial_code = 'all',
variable = '63,66',
period = 'all',
classification = '315/7170,7445,7486,7558,7625,7660,7712,7766,7786'
)
# Realiza a limpeza e manipulação da tabela
ipca_gp = (
ipca_gp_raw
.loc[1:,['V', 'D2C', 'D3N', 'D4N']]
.rename(columns = {'V': 'value',
'D2C': 'date',
'D3N': 'variable',
'D4N': 'groups'})
.assign(variable = lambda x: x['variable'].replace({'IPCA - Variação mensal' : 'variacao',
'IPCA - Peso mensal': 'peso'}),
date = lambda x: pd.to_datetime(x['date'],
format = "%Y%m"),
value = lambda x: x['value'].astype(float),
groups = lambda x: x['groups'].astype(str)
)
.pipe(lambda x: x.loc[x.date > '2007-01-01'])
)
# Torna em formato wide e calcula a contribuição de cada grupo pro IPCA
ipca_gp_wider = (
ipca_gp
.pivot_table(index = ['date', 'groups'],
columns = 'variable',
values = 'value')
.reset_index()
.assign(contribuicao = lambda x: (x.peso * x.variacao) / 100)
)
ipca_gp_wider[['date', 'groups', 'contribuicao']].tail(n = 9)
| variable | date | groups | contribuicao |
|---|---|---|---|
| 423 | 2023-12-01 | 1.Alimentação e bebidas | 0.233151 |
| 424 | 2023-12-01 | 2.Habitação | 0.052217 |
| 425 | 2023-12-01 | 3.Artigos de residência | 0.028743 |
| 426 | 2023-12-01 | 4.Vestuário | 0.033312 |
| 427 | 2023-12-01 | 5.Transportes | 0.100522 |
| 428 | 2023-12-01 | 6.Saúde e cuidados pessoais | 0.046640 |
| 429 | 2023-12-01 | 7.Despesas pessoais | 0.048705 |
| 430 | 2023-12-01 | 8.Educação | 0.014062 |
| 431 | 2023-12-01 | 9.Comunicação | 0.001929 |
# Cores para gráficos
colors = {'blue': '#282f6b',
'yellow': '#eace3f',
'red' : "#b22200",
'green': '#224f20',
'purple' : "#5f487c",
'gray': '#666666',
'orange' : '#b35c1e',
'turquoise' : "#419391",
'green_two' : "#839c56"
}
# Cria o gráfico
(ggplot(ipca_gp_wider) +
aes(x='date') +
geom_col(aes(y='contribuicao', fill='groups', colour='groups')) +
geom_hline(yintercept=0, colour='black', linetype='dashed') +
scale_x_date(date_breaks = "3 month", date_labels = "%b/%Y") +
scale_colour_manual(values=list(colors.values())) +
scale_fill_manual(values=list(colors.values())) +
labs(x='', y='', title='Contribuição dos Grupos do IPCA para a Inflação Mensal', caption = 'Elaborado por: analisemacro.com.br | Fonte: IBGE/SIDRA')+
theme(figure_size = (14, 6),
legend_position = "bottom")
)

<Figure Size: (1400 x 600)>
