Skip to content

Instantly share code, notes, and snippets.

@duartejr
Created July 31, 2022 20:20
Show Gist options
  • Select an option

  • Save duartejr/56685eb787750e19d12b6ab4a4991ee4 to your computer and use it in GitHub Desktop.

Select an option

Save duartejr/56685eb787750e19d12b6ab4a4991ee4 to your computer and use it in GitHub Desktop.
import imageio
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.offsetbox import OffsetImage, AnnotationBbox
# Leitura de dados
dados = pd.read_csv('tabela7062.csv').T.reset_index()
dados.columns = ['mes_ano', 'categoria', 'variação']
dados.head()
# Ajuste coluna mes_ano
mes_ano = []
ma = 0
count = 0
for linha in range(0, len(dados)):
if count == 26:
count = 0
ma = linha
mes_ano.append(dados.loc[ma].mes_ano)
count += 1
dados['mes_ano'] = mes_ano
# Ajuste coluna de categorias. Remoção do índice numérico
categorias = dados.categoria.str.split('.').values[:]
categorias_clean = []
for categoria in categorias:
categorias_clean.append(categoria[1])
dados['categoria'] = categorias_clean
# Criação das colunas mes e ano.
mes_ano_list = dados.mes_ano.str.split(' ').values[:]
meses, anos = [], []
for mesano in mes_ano_list:
meses.append(mesano[0])
anos.append(mesano[1])
dados['mes'] = meses
dados['ano'] = anos
# Seleção das principais categorias da cesta básica e combustível.
categorias_cesta = ['Açúcar cristal', 'Arroz', 'Café moído', 'Feijão - carioca (rajado)',
'Leite em pó', 'Macarrão', 'Óleo de soja', 'Frango inteiro', 'Ovo de galinha',
'Tomate', 'Cebola', 'Gasolina']
dados_cesta = dados.query(f'categoria in {categorias_cesta}')
# Ajuste do formato numérico das colunas de data.
maps_mes = {'janeiro':1, 'fevereiro':2, 'março':3, 'abril':4, 'maio':5, 'junho':6, 'julho':7, 'agosto':8, 'setembro':9,
'outubro':10, 'novembro':11, 'dezembro':12}
dados_cesta['mes'] = dados_cesta.mes.map(maps_mes)
dados_cesta['data'] = pd.to_datetime({'year': dados_cesta.ano.astype(float).values[:],
'month': dados_cesta.mes.values[:],
'day': np.ones(len(dados_cesta))})
# Ajuste do formato numérico da coluna de variação de preços.
dados_cesta['variação'] = dados_cesta['variação'].astype(float)
# Ícones e labels do gráfico
icons = [plt.imread('arroz.png'), plt.imread('feijao.png'), plt.imread('macarrao.png'),
plt.imread('tomate.png'), plt.imread('cebola.png'), plt.imread('acucar.png'),
plt.imread('frango.png'), plt.imread('ovos.png'), plt.imread('leite.png'),
plt.imread('oleo.png'), plt.imread('cafe.png'), plt.imread('gasolina.png')]
labels = ['Arroz', 'Feijão', 'Macarrão', 'Tomate', 'Cebola', 'Açúcar', 'Frango', 'Ovo', 'Leite',
'Óleo', 'Café', 'Gasolina']
# Plot dos gráficos
meses = {1:'Janeiro', 2:'Fevereiro', 3:'Março', 4:'Abril', 5:'Maio', 6:'Junho',
7:'Julho', 8:'Agosto', 9:'Setembro', 10:'Outubro', 11:'Novembro', 12:'Dezembro'}
n = 1
for ano in ['2020', '2021', '2022']:
if ano == '2020':
range_meses = range(2, 13)
elif ano == '2022':
range_meses = range(1, 7)
else:
range_meses = range(1, 13)
for mes in range_meses:
plt.figure(figsize=(20, 10))
if n == 1:
dados_plot = dados_cesta.query(f'ano == "{ano}" & mes == {mes}').reset_index()[['categoria', 'variação']]
minx = dados_plot['variação'].min()
maxx = dados_plot['variação'].max()
else:
dados_prev = dados_cesta.query(f'ano == "{ano}" & mes == {mes}').reset_index()[['categoria', 'variação']]
dados_plot['variação'] += dados_prev['variação']
if dados_plot['variação'].min() > minx and minx < 0:
minx = dados_plot['variação'].min()
if dados_plot['variação'].max() > maxx:
maxx = dados_plot['variação'].max()
if minx > 0:
minx = 0
dados_plot['positive'] = dados_plot['variação'] > 0
ax = dados_plot['variação'].plot(kind = 'barh',
color = dados_plot.positive.map({True: 'r', False: 'b'}))
plt.vlines(x=0, ymin=-1, ymax=12, color='k', lw=.5)
ax.set_yticklabels(labels, fontsize=12)
ax.tick_params(axis='both', which='major', labelsize=16)
tick_labels = ax.yaxis.get_ticklabels()
for i, img in enumerate(icons):
ib = OffsetImage(img, zoom=.06)
ib.image.axes = ax
ab = AnnotationBbox(ib,
tick_labels[i].get_position(),
frameon=False,
box_alignment=(-0.2, 0.5))
ax.add_artist(ab)
plt.suptitle('IPCA: acumulado mensal a partir de fevereiro/2020', fontsize=24)
plt.title(f'{meses[mes]} de {ano}', fontsize=20, style='italic')
plt.xlabel('Variação percentual (%)', fontsize=18)
plt.xlim(minx, maxx)
plt.savefig(f'fig_{n}.jpeg', dpi=150)
plt.close()
n += 1
# Geração do GIF animado.
images = []
filenames = [f'fig_{i}.jpeg' for i in range(1, 30)]
for filename in filenames:
images.append(imageio.imread(filename))
imageio.mimsave('ovie.gif', images, fps=1)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment