Skip to content

Commit 62fd302

Browse files
committed
Jogando no Github
0 parents  commit 62fd302

111 files changed

Lines changed: 14624 additions & 0 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
.git_repo_tmp/
2+
arquivo.csv
3+
assets/*.csv
4+
assets/*.db
5+
assets/*.db-shm
6+
assets/*.db-wal
7+
.venv/
8+
frontend/node_modules/
9+
frontend/dist/
10+
backend/models/artifacts/
11+
__pycache__/
12+
*.pyc
13+
.pytest_cache/
14+
.claude/
15+
.agents/
16+
.cursor/
17+
.windsurf/
18+
.codex

AGENTS.md

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
# GuardiãoIA Meteorológico — Agent Instructions
2+
3+
## Communication
4+
5+
Use terse, caveman-style responses to save tokens (~75% reduction).
6+
Drop: articles, filler words, pleasantries, hedging.
7+
Technical terms stay exact. Code blocks unchanged.
8+
9+
## Project
10+
11+
Weather monitoring platform for Bahia, Brazil.
12+
Hackathon LIAO / BaIA Week 2026 — climate resilience theme.
13+
14+
**Stack:**
15+
- Backend: Python + FastAPI + pandas + scikit-learn
16+
- Frontend: React + TypeScript + Vite + Tailwind + Recharts
17+
- Data: SQLite local (`assets/banco_de_dados.db`) — 5.2M rows, 48 stations, 2000–2021
18+
- No external APIs — everything runs offline from local DB
19+
20+
**Core modules:**
21+
- Radar de Extremos — anomaly detection per station
22+
- Classificador de Risco — risk score 0–100 (low/medium/high/critical)
23+
- Gêmeo Climático — station clustering + deviation detection
24+
- Painel Operacional — unified dashboard: Bahia → City → Neighborhood → Station
25+
26+
## Rules
27+
28+
- Only use data from `assets/banco_de_dados.db`
29+
- Python for all data/AI work, TypeScript for frontend only
30+
- Do NOT use Go for backend (scikit-learn/pandas require Python)
31+
- Always spec before implementing
32+
- Demo must work fully offline
33+
34+
## Key docs
35+
36+
- `docs/ideias.md` — product idea and modules
37+
- `docs/planejamento.md` — MVP scope and screens
38+
- `docs/arquitetura.md` — stack decisions and structure
39+
- `docs/dicionario.md` — data dictionary and derived features
40+
- `docs/hackathon.md` — judging criteria (innovation 30pts, social impact 20pts, technical quality 30pts, pitch 20pts)

CLAUDE.md

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
# GuardiãoIA Meteorológico — Guia do Agente
2+
3+
## PRIMEIRA AÇÃO DE TODA SESSÃO
4+
5+
**Ler `specs/MASTER.md` antes de qualquer coisa.**
6+
7+
O MASTER tem o status exato do projeto: o que está feito, em andamento e pendente.
8+
Encontrar o primeiro item `⬜ pendente` ou `🔄 em andamento` e iniciar por ele.
9+
Atualizar o status no MASTER a cada task concluída.
10+
11+
## Modo de comunicação padrão
12+
13+
**SEMPRE use caveman mode (full) para economizar tokens.**
14+
15+
Ative no início de toda sessão com `/caveman` ou diga "caveman mode".
16+
Isso corta ~75% dos tokens sem perder precisão técnica.
17+
18+
## Projeto
19+
20+
Plataforma de monitoramento climático inteligente para a Bahia.
21+
Hackathon LIAO / BaIA Week 2026 — tema: resiliência climática.
22+
23+
- **Backend:** Python + FastAPI + pandas + scikit-learn
24+
- **Frontend:** React + TypeScript + Vite + Tailwind + Recharts
25+
- **Dados:** SQLite local (`assets/banco_de_dados.db`) — 5,2M linhas, 48 estações, 2000–2021
26+
- **IA:** anomaly detection, risk classification, clustering por estação
27+
- **Sem APIs externas** — tudo offline no banco local
28+
29+
## Módulos principais
30+
31+
| Módulo | Função |
32+
|---|---|
33+
| Radar de Extremos | Detecta padrões atípicos por estação |
34+
| Classificador de Risco | Score 0–100 → baixo/médio/alto/crítico |
35+
| Gêmeo Climático | Agrupa estações similares, detecta desvios |
36+
| Painel Operacional | Dashboard unificado Bahia→Cidade→Bairro→Estação |
37+
38+
## Skills disponíveis
39+
40+
Todos instalados em `.claude/skills/`. Use conforme tarefa:
41+
42+
| Skill | Quando usar | Comando |
43+
|---|---|---|
44+
| `caveman` | **Sempre** — economiza tokens | `/caveman` |
45+
| `tlc-spec-driven` | Antes de codar qualquer feature | `specify feature [nome]` |
46+
| `react-best-practices` | Ao escrever ou revisar componentes React | automático |
47+
| `frontend-blueprint` | Ao desenhar nova tela ou layout | `design [tela]` |
48+
| `mermaid-studio` | Gerar diagramas (arquitetura, fluxo, pitch) | `/mermaid` |
49+
| `technical-design-doc-creator` | Criar TDD / doc técnico / RFC | `create design doc` |
50+
| `perf-web-optimization` | Charts lentos, bundle pesado | `optimize performance` |
51+
| `security-best-practices` | Review de segurança FastAPI ou React | `security review` |
52+
| `netlify-deploy` | Deploy do frontend para demo | `deploy to netlify` |
53+
54+
## Reinstalar skills (novo membro da equipe)
55+
56+
```bash
57+
npx @tech-leads-club/agent-skills install --skill tlc-spec-driven
58+
npx @tech-leads-club/agent-skills install --skill react-best-practices
59+
npx @tech-leads-club/agent-skills install --skill mermaid-studio
60+
npx @tech-leads-club/agent-skills install --skill frontend-blueprint
61+
npx @tech-leads-club/agent-skills install --skill perf-web-optimization
62+
npx @tech-leads-club/agent-skills install --skill technical-design-doc-creator
63+
npx @tech-leads-club/agent-skills install --skill security-best-practices
64+
npx @tech-leads-club/agent-skills install --skill netlify-deploy
65+
```
66+
67+
## Docs do projeto
68+
69+
- [Ideias](docs/ideias.md)
70+
- [Planejamento](docs/planejamento.md)
71+
- [Arquitetura](docs/arquitetura.md)
72+
- [Dicionário de dados](docs/dicionario.md)
73+
- [Hackathon](docs/hackathon.md)
74+
75+
## Regras
76+
77+
- Não usar APIs externas — só `assets/banco_de_dados.db`
78+
- Python para tudo de dados e IA, TypeScript para frontend
79+
- Não usar Go para backend — scikit-learn/pandas exige Python
80+
- Sempre especificar antes de implementar (`tlc-spec-driven`)
81+
- Demo deve funcionar offline
82+
- **Nunca incluir `Co-Authored-By` de IA em commits** — remover sempre
83+
- **`/security-review` obrigatório ao fechar cada fase** (1.SEC, 2.SEC, 3.SEC, 4.SEC, 5.SEC no MASTER)

Makefile

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
back:
2+
.venv/Scripts/uvicorn backend.main:app --reload
3+
4+
front:
5+
cd frontend && npm run dev
6+
7+
dev:
8+
make -j2 back front

README.md

Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
# GuardiãoIA Meteorológico
2+
3+
Plataforma de monitoramento climático inteligente para a Bahia.
4+
**Hackathon LIAO / BaIA Week 2026 — Resiliência Climática e Cidades Inteligentes.**
5+
6+
Transforma 5,2 milhões de registros históricos de 48 estações INMET em alertas operacionais de risco climático — 100% offline, sem APIs externas.
7+
8+
---
9+
10+
## Módulos
11+
12+
| Módulo | Algoritmo | O que faz |
13+
|---|---|---|
14+
| **Radar de Extremos** | IsolationForest | Detecta leituras que se isolam do padrão histórico da estação |
15+
| **Classificador de Risco** | Scoring por percentis | Score 0–100 comparando condições atuais com o pior histórico |
16+
| **Gêmeo Climático** | KMeans | Agrupa estações por perfil climático e detecta desvios do grupo |
17+
| **Painel Operacional** || Dashboard unificado: Bahia → Cidade → Estação |
18+
19+
---
20+
21+
## Stack
22+
23+
| Camada | Tecnologia |
24+
|---|---|
25+
| Backend | Python 3.11 + FastAPI + pandas + scikit-learn |
26+
| Banco de dados | SQLite (5,2M linhas · 48 estações · 2000–2021) |
27+
| Cache | Parquet (pyarrow) — reinicialização em ~30s vs 3–5min sem cache |
28+
| Frontend | React 19 + TypeScript + Vite + Tailwind CSS + Recharts |
29+
| IA | IsolationForest · KMeans · scoring por percentis históricos |
30+
31+
---
32+
33+
## Como rodar
34+
35+
### Requisitos
36+
37+
- Python 3.11+
38+
- Node.js 18+
39+
- O arquivo `assets/banco_de_dados.db` (fornecido separadamente — não versionado)
40+
41+
### Backend
42+
43+
```bash
44+
python -m venv .venv
45+
.venv\Scripts\Activate.ps1
46+
pip install -r backend/requirements.txt
47+
48+
python -m uvicorn backend.main:app --reload
49+
```
50+
51+
### Frontend
52+
53+
```bash
54+
cd frontend
55+
npm install
56+
npm run dev
57+
```
58+
59+
### Tudo junto (requer `make`)
60+
61+
```bash
62+
make dev
63+
```
64+
65+
O frontend abre em `http://localhost:5173`.
66+
67+
Na **primeira inicialização**, o backend processa os dados (~3–5 min). As reinicializações seguintes usam cache parquet (~30s). Uma barra de progresso exibe o status em tempo real.
68+
69+
---
70+
71+
## Estrutura
72+
73+
```
74+
assets/ banco_de_dados.db (não versionado)
75+
backend/
76+
data/
77+
loader.py leitura SQLite + feature engineering
78+
features.py acumulados de chuva, deltas, z-scores
79+
store.py estado global dos dados em memória
80+
models/
81+
anomaly.py IsolationForest por estação
82+
risk.py scoring ponderado por percentis
83+
gemeo.py KMeans + deviation score
84+
routes/ endpoints FastAPI
85+
main.py lifespan async + pipeline em background
86+
frontend/
87+
src/
88+
components/ layout/, ui/ (Card, FilterBar, InfoTooltip...)
89+
pages/ Dashboard, Radar, Classificador, Gêmeo, Station, City
90+
hooks/ useApi, useDashboardData, useBackendReady
91+
types/ tipos TypeScript da API
92+
```
93+
94+
---
95+
96+
## Dados
97+
98+
- **Fonte:** INMET — Instituto Nacional de Meteorologia
99+
- **Cobertura:** 48 estações automáticas do estado da Bahia
100+
- **Período:** 2000–2021
101+
- **Volume:** ~5,2 milhões de leituras horárias
102+
- **Variáveis:** precipitação, temperatura, pressão, umidade, vento, radiação
103+
104+
---
105+
106+
## Decisões técnicas
107+
108+
**Score relativo à estação:** O classificador usa percentis históricos da própria estação — 100 = pior condição já registrada *naquela estação específica*. Isso calibra o sistema para o microclima local em vez de usar limites absolutos.
109+
110+
**Dados em memória:** Com 5,2M linhas pré-processadas, queries SQLite em tempo real seriam lentas demais. O pipeline roda uma vez no startup, tudo fica em RAM.
111+
112+
**Cache parquet:** Reduz cold start de 3–5 min para ~30s nas reinicializações após o primeiro boot.
113+
114+
**Startup assíncrono:** O pipeline roda em background thread via `asyncio.create_task` + `run_in_executor`, então o servidor aceita conexões em ~1s e a barra de progresso funciona desde o início.
115+
116+
---
117+
118+
## Licença
119+
120+
Projeto desenvolvido para o Hackathon BaIA Week 2026.

assets/README.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# Assets
2+
3+
## Objetivo
4+
5+
Esta pasta guarda arquivos de dados usados no projeto.
6+
7+
## Convenção atual
8+
9+
- `banco_de_dados.csv`: arquivo bruto de entrada
10+
- `banco_de_dados.db`: banco SQLite gerado a partir do CSV
11+
12+
## Fluxo esperado
13+
14+
1. colocar ou atualizar o CSV em `assets/`
15+
2. executar o importador em `scripts/data/csv_to_sqlite.go`
16+
3. usar o SQLite gerado no restante do projeto
17+
18+
## Comando de referência
19+
20+
```bash
21+
go run scripts/data/csv_to_sqlite.go -src assets/banco_de_dados.csv -db assets/banco_de_dados.db -table dados
22+
```

backend/__init__.py

Whitespace-only changes.

backend/data/__init__.py

Whitespace-only changes.

backend/data/features.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
import pandas as pd
2+
3+
_RAIN_WINDOWS = {"rain_6h_mm": 6, "rain_12h_mm": 12, "rain_24h_mm": 24, "rain_48h_mm": 48, "rain_72h_mm": 72}
4+
_DELTA_MAP = {
5+
"pressure_delta_1h": "pressure_mb",
6+
"temp_delta_1h": "air_temp_c",
7+
"humidity_delta_1h": "humidity_pct",
8+
"wind_delta_1h": "wind_gust_ms",
9+
}
10+
_ZSCORE_MAP = {
11+
"rain_zscore": "rain_1h_mm",
12+
"pressure_zscore": "pressure_mb",
13+
"temp_zscore": "air_temp_c",
14+
"humidity_zscore": "humidity_pct",
15+
}
16+
17+
18+
def compute_rain_accumulations(df: pd.DataFrame) -> pd.DataFrame:
19+
df = df.copy()
20+
grouped = df.groupby("station_id")["rain_1h_mm"]
21+
for col, w in _RAIN_WINDOWS.items():
22+
df[col] = grouped.transform(lambda s: s.rolling(window=w, min_periods=1).sum())
23+
return df
24+
25+
26+
def compute_deltas(df: pd.DataFrame) -> pd.DataFrame:
27+
df = df.copy()
28+
for new_col, src_col in _DELTA_MAP.items():
29+
df[new_col] = df.groupby("station_id")[src_col].transform(lambda s: s.diff(1))
30+
return df
31+
32+
33+
def compute_rolling_stats(df: pd.DataFrame) -> pd.DataFrame:
34+
df = df.copy()
35+
df["temp_ma_24h"] = df.groupby("station_id")["air_temp_c"].transform(
36+
lambda s: s.rolling(window=24, min_periods=1).mean()
37+
)
38+
df["humidity_ma_24h"] = df.groupby("station_id")["humidity_pct"].transform(
39+
lambda s: s.rolling(window=24, min_periods=1).mean()
40+
)
41+
df["pressure_ma_24h"] = df.groupby("station_id")["pressure_mb"].transform(
42+
lambda s: s.rolling(window=24, min_periods=1).mean()
43+
)
44+
return df
45+
46+
47+
def compute_zscore(df: pd.DataFrame) -> pd.DataFrame:
48+
df = df.copy()
49+
for new_col, src_col in _ZSCORE_MAP.items():
50+
means = df.groupby("station_id")[src_col].transform("mean")
51+
stds = df.groupby("station_id")[src_col].transform("std")
52+
df[new_col] = (df[src_col] - means) / stds.replace(0, float("nan"))
53+
return df
54+
55+
56+
def build_feature_matrix(df: pd.DataFrame) -> pd.DataFrame:
57+
df = compute_rain_accumulations(df)
58+
df = compute_deltas(df)
59+
df = compute_rolling_stats(df)
60+
df = compute_zscore(df)
61+
return df

0 commit comments

Comments
 (0)