Created
July 31, 2022 20:20
-
-
Save duartejr/56685eb787750e19d12b6ab4a4991ee4 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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