Skip to content

Commit 470bbc6

Browse files
committed
adeus vf
1 parent 68d74a8 commit 470bbc6

15 files changed

Lines changed: 595 additions & 136 deletions

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ ENV/
88
env/
99

1010
# Estudos e Testes Locais (Matheus)
11+
# Painel rodando em https://matheusrueda.github.io/projeto-cd-ed/
1112
.understand-anything/
1213
.understandignore
1314

README.md

Lines changed: 37 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -1,132 +1,73 @@
1-
# 📊 Painel Histórico de Inflação Brasileira (IPCA)
2-
### Dashboard Interativo · Ciência de Dados · Python · Streamlit · API IBGE
1+
# 📊 Painel Histórico de Inflação (IPCA)
32

4-
> **Status do Projeto:** Concluído ✅  |  **Linguagem:** Python 3  |  **Interface:** Streamlit  |  **Dados:** IBGE/SIDRA API
3+
Um dashboard interativo e dinâmico que analisa a inflação oficial do Brasil (IPCA) de **2016 a 2025**. O objetivo é traduzir índices econômicos complexos em um impacto compreensível no dia a dia, demonstrando a corrosão do poder de compra no bolso do brasileiro ao longo dos últimos 10 anos.
54

65
---
76

8-
## 📌 Sobre o Projeto
9-
10-
Dashboard interativo desenvolvido como **projeto acadêmico de Ciência de Dados** que analisa a trajetória da inflação brasileira (IPCA) entre **2016 e 2025**, calculando tanto as variações anuais quanto o **fator de inflação composta acumulada** ao longo da última década.
11-
12-
O projeto implementa um pipeline **ETL completo** com consumo da **API SIDRA do IBGE**, transformação dos dados com **Pandas** e visualização interativa com **Plotly** e **Streamlit**. Um mecanismo de fallback offline garante resiliência mesmo sem acesso à rede.
13-
14-
---
15-
16-
## 🎯 Objetivos e Perguntas-Chave
17-
18-
1. **Choque Inflacionário Anual** — Quais anos registraram os maiores desvios da meta e quais fatores (cadeias de suprimentos, reajustes tarifários) explicaram esses picos?
19-
2. **Perda Acumulada de Poder de Compra** — Qual foi a desvalorização real do Real brasileiro ao longo dos 10 anos analisados?
20-
3. **Padrão Mensal de Crise** — Qual a média inflacionária em anos de inflação controlada versus anos de dois dígitos?
21-
22-
---
23-
24-
## 💾 Fonte de Dados
25-
26-
| Campo | Detalhe |
27-
|---|---|
28-
| **API** | [SIDRA/IBGE](https://apisidra.ibge.gov.br/) — Sistema IBGE de Recuperação Automática |
29-
| **Tabela** | 1737 — IPCA Série Histórica de Variação Mensal |
30-
| **Variável** | 63 — Variação Mensal (%) |
31-
| **Cobertura** | Últimos 144 meses · Brasil · Mensal |
32-
| **Biblioteca** | `sidrapy` |
33-
34-
---
35-
36-
## 🏗️ Arquitetura do Pipeline (ETL)
37-
38-
```
39-
┌─────────────────────────────────────────────────────┐
40-
│ Pipeline de Dados │
41-
├──────────────┬──────────────────┬───────────────────┤
42-
│ Extração │ Transformação │ Visualização │
43-
│ (IBGE API) │ (Pandas/Cálculo)│ (Streamlit/Plot.)│
44-
│ │ │ │
45-
│ sidrapy ──► │ ipca_bruto.csv │ ipca_limpo.csv ──►│
46-
│ fallback CSV │ fator composto │ Dashboard UI │
47-
└──────────────┴──────────────────┴───────────────────┘
48-
```
49-
50-
1. **`src/extracao_ibge.py`** — Conecta à API SIDRA, baixa os dados brutos; aciona fallback CSV se a API estiver indisponível → `data/ipca_bruto.csv`
51-
2. **`src/transformacao.py`** — Filtra, converte tipos, ordena cronologicamente e calcula o fator de inflação composta anual → `data/ipca_limpo.csv`
52-
3. **`app.py`** — Interface Streamlit que consome somente os dados tratados, com plotagem interativa e filtragem instantânea
53-
54-
---
55-
56-
## 💻 Stack Tecnológico
57-
58-
| Tecnologia | Uso |
59-
|---|---|
60-
| **Python 3** | Linguagem principal (PEP 484 type hints · PEP 257 docstrings) |
61-
| **Streamlit** | Dashboard interativo e interface SaaS |
62-
| **Pandas** | Manipulação e vetorização matemática dos dados |
63-
| **Plotly** | Gráficos interativos e responsivos |
64-
| **sidrapy** | Consumo da API SIDRA/IBGE |
7+
## 💡 O que o painel responde?
8+
* **O custo de vida aumentou quanto?** Veja o cálculo do fator de inflação acumulada e composta no período que você escolher.
9+
* **Qual foi o pico da inflação?** Identifique os anos mais críticos (como os impactos globais de 2021 e 2022).
10+
* **Como isso afeta meu bolso?** Utilize o **Simulador de Poder de Compra** para ver quanto custa hoje um item básico do passado (como um cafezinho ou uma cesta básica).
6511

6612
---
6713

68-
## 📂 Estrutura do Repositório
14+
## 🏗️ Como o projeto foi construído
15+
Para garantir performance e manter a interface rápida, separamos o processamento dos dados da visualização final (arquitetura desacoplada):
6916

70-
```
71-
projeto-cd-ed/
72-
├── data/
73-
│ ├── ipca_bruto.csv # Backup da API / Fallback offline
74-
│ └── ipca_limpo.csv # Dados transformados prontos para o dashboard
75-
├── src/
76-
│ ├── extracao_ibge.py # ETL — Extração via API SIDRA
77-
│ └── transformacao.py # ETL — Limpeza e cálculo do fator composto
78-
├── .streamlit/
79-
│ └── config.toml # Configurações do Streamlit
80-
├── app.py # Dashboard Streamlit principal
81-
├── requirements.txt # Dependências Python
82-
└── README.md # Documentação do projeto
83-
```
17+
* **Extração (`src/extracao_ibge.py`):** Conecta à API SIDRA do IBGE para buscar os dados mensais brutos (Tabela 1737). Possui um teste de conectividade rápido (3s) com fallback local automático se a API estiver fora do ar.
18+
* **Transformação (`src/transformacao.py`):** Processa os dados brutos usando Pandas, calculando os acumulados anuais e os fatores de multiplicação.
19+
* **Interface (`app.py`):** Dashboard construído com Streamlit, utilizando Plotly para gráficos fluidos e interativos.
8420

8521
---
8622

8723
## 🚀 Como Executar Localmente
8824

89-
**Pré-requisitos:** Python 3.8+
25+
### Pré-requisito
26+
Ter o Python 3.8+ instalado em sua máquina.
27+
28+
### Passo a Passo
9029

9130
```bash
92-
# 1. Clone o repositório
31+
# 1. Obter o repositório
9332
git clone https://github.com/matheusrueda/projeto-cd-ed.git
9433
cd projeto-cd-ed
9534

96-
# 2. Crie e ative um ambiente virtual
35+
# 2. Criar e ativar o ambiente virtual (Recomendado)
9736
python -m venv venv
98-
source venv/bin/activate # Linux/Mac
99-
# .\venv\Scripts\Activate.ps1 # Windows (PowerShell)
37+
# No Windows:
38+
.\venv\Scripts\activate
39+
# No Linux/Mac:
40+
source venv/bin/activate
10041

101-
# 3. Instale as dependências
42+
# 3. Instalar as dependências
10243
pip install -r requirements.txt
10344

104-
# 4. Execute o pipeline ETL
45+
# 4. Rodar o pipeline ETL (baixa e trata os dados)
10546
python src/extracao_ibge.py
10647
python src/transformacao.py
10748

108-
# 5. Inicie o dashboard
49+
# 5. Iniciar o dashboard no navegador
10950
streamlit run app.py
110-
# Acesse: http://localhost:8501
11151
```
11252

11353
---
11454

115-
## 👥 Equipe
116-
117-
| Nome | Papel |
118-
|---|---|
119-
| **Matheus** | Arquitetura do pipeline, ETL, Dashboard UI |
120-
| **Luis** | Análise de dados e transformações |
121-
| **Henrique** | Extração da API e fallback |
122-
| **Guilherme** | Visualização e Plotly |
123-
| **João** | Documentação e testes |
55+
## 🛠️ Tecnologias Utilizadas
56+
* **Python 3:** Linguagem base com tipagem estática nos scripts.
57+
* **Streamlit:** Interface web rápida e intuitiva.
58+
* **Pandas:** Manipulação matemática e agrupamento de dados.
59+
* **Plotly:** Gráficos interativos responsivos.
60+
* **sidrapy:** Cliente Python oficial para a API do IBGE.
61+
* **orjson:** Serialização JSON acelerada para renderização instantânea dos gráficos.
12462

12563
---
12664

127-
## 📄 Licença
128-
129-
Projeto acadêmico — uso educacional. Consulte os membros da equipe para outros usos.
65+
## 👥 Equipe
66+
* **Matheus**
67+
* **Luis**
68+
* **Henrique**
69+
* **Guilherme**
70+
* **João**
13071

13172
---
13273

app.py

Lines changed: 53 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,14 @@
77
# 1. CONFIGURAÇÃO DA PÁGINA E ESTILOS
88
st.set_page_config(
99
page_title="Análise de Inflação - IPCA",
10-
page_icon="📈",
10+
page_icon="📊",
1111
layout="wide",
1212
initial_sidebar_state="expanded"
1313
)
1414

1515
# Estilização CSS para visual limpo e legível (Dark Mode adaptado com Fira Code nos números)
1616
st.markdown("""
1717
<style>
18-
/* Importação das fontes do Google Fonts */
19-
@import url('https://fonts.googleapis.com/css2?family=Plus+Jakarta+Sans:wght@300;400;500;600;700;800&family=Fira+Code:wght@400;500;600;700&display=swap');
20-
2118
/* Ajuste de fontes globais no app */
2219
html, body, [class*="css"], .stMarkdown {
2320
font-family: 'Plus Jakarta Sans', sans-serif;
@@ -97,7 +94,7 @@ def carregar_dados(caminho: str) -> pd.DataFrame:
9794

9895
# 3. INTERFACE DE USUÁRIO (STREAMLIT)
9996
if df_ipca.empty:
100-
st.error("Base de dados local não encontrada!")
97+
st.error("Base de dados local não encontrada!")
10198
st.info("Por favor, execute o pipeline de dados no terminal: `python src/extracao_ibge.py` seguido por `python src/transformacao.py`.")
10299
else:
103100
# Sidebar Acadêmica
@@ -112,7 +109,6 @@ def carregar_dados(caminho: str) -> pd.DataFrame:
112109
st.sidebar.markdown(
113110
"<p style='color: #94a3b8; font-size: 0.85rem; line-height: 1.5;'>"
114111
"Este painel analisa a trajetória histórica da inflação oficial do país de forma interativa. "
115-
"Desenvolvido de forma modular com pipeline ETL separado da camada de apresentação."
116112
"</p>",
117113
unsafe_allow_html=True
118114
)
@@ -143,7 +139,7 @@ def carregar_dados(caminho: str) -> pd.DataFrame:
143139
)
144140

145141
if not anos_selecionados:
146-
st.warning("⚠️ Selecione pelo menos um ano na barra lateral para carregar as análises.")
142+
st.warning("Selecione pelo menos um ano na barra lateral para carregar as análises.")
147143
else:
148144
# Filtra os dados com base na seleção
149145
df_filtrado = df_ipca[df_ipca["Ano"].isin(anos_selecionados)].copy()
@@ -192,30 +188,51 @@ def carregar_dados(caminho: str) -> pd.DataFrame:
192188

193189
st.markdown("<br>", unsafe_allow_html=True)
194190

195-
# SEÇÃO NOVA: SIMULADOR DE PODER DE COMPRA (Humanização e Storytelling interativo)
196-
st.markdown("### 🛒 O Impacto da Inflação no seu Bolso")
191+
# SEÇÃO NOVA: SIMULADOR DE PODER DE COMPRA
192+
st.markdown("### O Impacto da Inflação no seu Bolso")
197193

198194
st.markdown(
199195
"<div class='simulador-card'>"
200196
"<p style='margin-top:0; color:#f3f4f6; font-size:1rem; font-weight:600;'>"
201197
"Simulador Prático de Perda de Poder de Compra"
202198
"</p>"
203199
"<p style='color:#94a3b8; font-size:0.9rem; margin-bottom:15px; line-height:1.5;'>"
204-
"Insira um valor em dinheiro que você possuía no início do período filtrado. O simulador calculará "
205-
"o quanto de dinheiro você precisaria hoje para comprar a mesma cesta de produtos ou serviços, "
200+
"Insira um valor em dinheiro no início do período filtrado. O simulador calculará "
201+
"o quanto seria equivalente hoje, "
206202
"demonstrando visualmente o efeito da corrosão inflacionária."
207203
"</p>"
208204
"</div>",
209205
unsafe_allow_html=True
210206
)
211207

212208
# Caixas do simulador lado a lado
213-
s_col1, s_col2 = st.columns([1, 2])
209+
s_col1, s_col2 = st.columns([1.2, 1.8])
214210
with s_col1:
211+
exemplo_selecionado = st.selectbox(
212+
"Escolha um exemplo real:",
213+
options=[
214+
"Customizado (R$ 100)",
215+
"Cafezinho Simples (R$ 3,50)",
216+
"Almoço Comercial (R$ 25,00)",
217+
"Cesta Básica Familiar (R$ 400,00)",
218+
"Salário Mínimo de 2016 (R$ 880,00)"
219+
]
220+
)
221+
222+
valores_exemplo = {
223+
"Customizado (R$ 100)": 100.0,
224+
"Cafezinho Simples (R$ 3,50)": 3.50,
225+
"Almoço Comercial (R$ 25,00)": 25.0,
226+
"Cesta Básica Familiar (R$ 400,00)": 400.0,
227+
"Salário Mínimo de 2016 (R$ 880,00)": 880.0
228+
}
229+
230+
valor_base = valores_exemplo[exemplo_selecionado]
231+
215232
valor_original = st.number_input(
216-
"Valor de Referência (R$):",
217-
min_value=1.0,
218-
value=100.0,
233+
"Ou digite outro valor (R$):",
234+
min_value=0.1,
235+
value=float(valor_base),
219236
step=10.0,
220237
help="Digite o valor que servirá de base histórica no início do período."
221238
)
@@ -225,32 +242,41 @@ def carregar_dados(caminho: str) -> pd.DataFrame:
225242
ano_inicial = df_filtrado["Ano"].min()
226243
ano_final = df_filtrado["Ano"].max()
227244

245+
descricoes = {
246+
"Customizado (R$ 100)": "Uma compra genérica",
247+
"Cafezinho Simples (R$ 3,50)": "Aquele cafezinho rápido na padaria",
248+
"Almoço Comercial (R$ 25,00)": "Um almoço comercial básico",
249+
"Cesta Básica Familiar (R$ 400,00)": "A cesta de mantimentos e alimentos da família",
250+
"Salário Mínimo de 2016 (R$ 880,00)": "A renda mensal equivalente a um salário mínimo da época"
251+
}
252+
item_nome = descricoes[exemplo_selecionado]
253+
228254
with s_col2:
229255
st.markdown(
230256
f"<div style='margin-top: 10px;'>"
231257
f"<p style='font-size: 1.05rem; line-height: 1.6; color: #f3f4f6;'>"
232-
f"Uma compra que custava <strong>R$ {valor_original:.2f}</strong> em {ano_inicial}, custaria hoje em dia "
258+
f"{item_nome} que custava <strong>R$ {valor_original:.2f}</strong> em {ano_inicial}, custaria aproximadamente "
233259
f"<span style='color: #db2777; font-weight: 700; font-family: Fira Code;'>R$ {valor_necessario:.2f}</span> em {ano_final} "
234-
f"para manter exatamente o mesmo padrão de consumo."
260+
f"para manter exatamente o mesmo padrão de consumo de itens equivalentes."
235261
f"</p>"
236262
f"<p style='font-size: 0.9rem; color: #94a3b8; margin: 0;'>"
237-
f"O seu dinheiro sofreu uma <strong>perda real de poder de compra de {perda_poder_compra:.1f}%</strong> durante este intervalo temporal."
263+
f"Isso representa uma <strong>corrosão real de {perda_poder_compra:.1f}% no poder de compra</strong> do Real brasileiro durante este período."
238264
f"</p>"
239265
f"</div>",
240266
unsafe_allow_html=True
241267
)
242268

243269
st.markdown("<hr style='border: 0; height: 1px; background: rgba(255,255,255,0.05); margin-top: 25px; margin-bottom: 25px;'>", unsafe_allow_html=True)
244270

245-
# Abas Acadêmicas
271+
# Abas
246272
tab_graficos, tab_tabela, tab_analise = st.tabs([
247273
"Visualização Gráfica",
248274
"Tabela de Dados Consolidados",
249275
"Análise Histórica & Crises"
250276
])
251277

252278
with tab_graficos:
253-
# Gráficos em duas colunas (Layout SaaS Clean)
279+
# Gráficos em duas colunas
254280
g_col1, g_col2 = st.columns(2)
255281

256282
with g_col1:
@@ -266,7 +292,7 @@ def carregar_dados(caminho: str) -> pd.DataFrame:
266292
template="plotly_dark"
267293
)
268294

269-
# Customização visual do gráfico de barras para estilo SaaS premium dark
295+
# Customização visual do gráfico de barras
270296
fig_bar.update_traces(
271297
marker_color="#2563eb",
272298
texttemplate="%{text:.2f}%",
@@ -290,7 +316,7 @@ def carregar_dados(caminho: str) -> pd.DataFrame:
290316
height=380,
291317
hovermode="x"
292318
)
293-
st.plotly_chart(fig_bar, use_container_width=True)
319+
st.plotly_chart(fig_bar, use_container_width=True, config={'displayModeBar': False})
294320

295321
with g_col2:
296322
st.markdown("<p style='font-weight: 700; font-size: 1.15rem; color: #f3f4f6; margin-bottom: 15px;'>Trajetória da Inflação Composta no Período</p>", unsafe_allow_html=True)
@@ -305,7 +331,7 @@ def carregar_dados(caminho: str) -> pd.DataFrame:
305331
labels={"Trajetoria_Composta": "Inflação Acumulada Composta (%)", "Ano": "Ano"},
306332
template="plotly_dark"
307333
)
308-
# Customização visual da linha e área para estilo SaaS premium dark
334+
# Customização visual da linha e área
309335
fig_line.update_traces(
310336
line_color="#db2777",
311337
line_width=3,
@@ -342,7 +368,7 @@ def carregar_dados(caminho: str) -> pd.DataFrame:
342368
),
343369
height=380
344370
)
345-
st.plotly_chart(fig_line, use_container_width=True)
371+
st.plotly_chart(fig_line, use_container_width=True, config={'displayModeBar': False})
346372

347373
with tab_tabela:
348374
st.markdown("<p style='font-weight: 700; font-size: 1.15rem; color: #f3f4f6; margin-bottom: 15px;'>Tabela de Dados Consolidados</p>", unsafe_allow_html=True)
@@ -353,10 +379,10 @@ def carregar_dados(caminho: str) -> pd.DataFrame:
353379
df_tabela["Acumulado_Ano"] = df_tabela["Acumulado_Ano"].map("{:.2f}%".format)
354380
df_tabela["Inflacao_Composta_Acumulada_Perc"] = df_tabela["Inflacao_Composta_Acumulada_Perc"].map("{:.2f}%".format)
355381

356-
# Remove colunas auxiliares temporárias antes de exibir
382+
# Remove colunas auxiliares
357383
df_tabela = df_tabela.drop(columns=["Fator_Interno", "Trajetoria_Composta"])
358384

359-
# Renomeia colunas para a exibição ficar mais profissional e legível
385+
# Renomeia colunas para a exibição
360386
df_tabela.columns = [
361387
"Ano",
362388
"Média Inflação Mensal",
@@ -372,7 +398,7 @@ def carregar_dados(caminho: str) -> pd.DataFrame:
372398
)
373399

374400
with tab_analise:
375-
# Análise Histórica Contextual formatada elegantemente
401+
# Análise Histórica Contextual formatada
376402
st.markdown("""
377403
<div style="background-color: rgba(30, 41, 59, 0.4); border: 1px solid rgba(255, 255, 255, 0.08); padding: 25px; border-radius: 14px; margin-top: 10px;">
378404
<h4 style="margin-top:0; color:#2563eb; font-weight:800; font-size:1.25rem;">Entendendo o Comportamento Inflacionário Recente</h4>

0 commit comments

Comments
 (0)