Arquitetura da Solução ÁguaPrev
A arquitetura do projeto ÁguaPrev foi desenhada de forma modular, separando as responsabilidades em três grandes componentes: Frontend, Backend e um processo de Ingestão de Dados.
Componentes Principais
-
Frontend (Cliente Web)
- Tecnologia: Vite + TailwindCSS.
- Responsabilidade: Interface do usuário (UI) e Experiência do Usuário (UX). É por onde o usuário interage com o sistema, visualiza os dados, mapas e gráficos.
- Comunicação: Consome a API RESTful exposta pelo Backend para obter todos os dados necessários.
-
Backend (Servidor da API)
- Tecnologia: Python com Flask.
- Responsabilidade: Orquestrar a lógica de negócio, gerenciar a autenticação de usuários (via JWT) e expor uma API RESTful para o frontend. Ele serve como a ponte entre os dados armazenados e a interface do usuário.
- Comunicação: Responde às requisições do Frontend e acessa o banco de dados para ler ou escrever informações.
-
Banco de Dados
- Tecnologia: SQLite.
- Responsabilidade: Armazenar de forma persistente os dados da aplicação, que incluem:
- Dados dos usuários (perfis, senhas criptografadas).
- Inventário das estações de monitoramento.
- Séries temporais de dados hídricos (chuva, nível, vazão) coletados pelo processo de ingestão.
-
Ingestão de Dados (Processo em CLI)
- Tecnologia: Scripts Python (
hidro_ingest.py,hidro_api.py). - Responsabilidade: Coletar dados brutos de fontes externas, como a API HidroWeb da Agência Nacional de Águas (ANA). Os scripts tratam e estruturam esses dados antes de inseri-los no banco de dados SQLite.
- Execução: É um processo executado via linha de comando (CLI), de forma independente da aplicação web.
- Tecnologia: Scripts Python (
Fluxo de Dados
O fluxo de dados principal pode ser entendido da seguinte forma:
graph TD
A[Fontes Externas] -->|1. Coleta via scripts| B(Processo de Ingestão)
B -->|2. Armazena dados tratados| C[(Banco de Dados)]
C -->|4. Lê dados para servir| D{Backend}
D -->|3. Gerencia usuários| C
D -->|5. Envia dados via API REST| E[Frontend]
E -->|6. Interação do Usuário| F((Usuário Final))
F -->|Interage e solicita dados| E
Detalhes do Fluxo:
- Coleta: O processo de ingestão é iniciado manualmente (via CLI) e faz requisições à API da ANA para buscar dados de estações e suas medições.
- Armazenamento: Os dados coletados são limpos, processados e salvos nas tabelas apropriadas do banco de dados SQLite.
- Gerenciamento de Usuários: O Backend lida com cadastro, login e perfis, salvando essas informações no banco.
- Leitura de Dados: Quando o frontend solicita dados (ex: para um gráfico no dashboard), o Backend consulta o banco de dados SQLite.
- Exposição via API: O Backend formata os dados em JSON e os envia para o frontend em resposta a uma chamada de API.
- Visualização: O frontend recebe o JSON e renderiza as informações de forma visual para o usuário final.
Arquitetura de Machine Learning
Além do fluxo de dados hídricos, a aplicação possui uma arquitetura dedicada para o treinamento e a implantação de modelos de previsão de séries temporais.
O fluxo de Machine Learning é separado em duas fases: Treinamento (Offline) e Inferência (Online).
graph TD
subgraph Treinamento (Offline)
direction LR
T1[Dados Históricos] --> T2{Jupyter Notebooks};
T2 --> |Exploração, Feature Engineering, Tuning| T3[Treinamento do Modelo];
T3 --> T4[Artefatos do Modelo];
end
subgraph Deploy
direction LR
T4 --> |model.pkl, scaler.pkl, meta.json| D1[Backend];
end
subgraph Inferência (Online)
direction TD
I1[Frontend] -->|1. Requisição com dados recentes| D1;
D1 -->|2. Pré-processa features (usa meta.json)| I2[Pipeline de Inferência];
I2 -->|3. Normaliza (usa scaler.pkl)| I3[Aplicação do Modelo];
I3 -->|4. Prevê (usa model.pkl)| I4[Previsão];
I4 -->|5. Salva no DB| I5[(Banco de Dados)];
I4 -->|6. Retorna para o cliente| I1;
end
subgraph Retreino (Manual)
direction LR
R1[Dados mais recentes] -->|Inicia novo ciclo| T2;
end
Detalhes do Fluxo de ML:
-
Treinamento (Offline):
- Ambiente: O processo acontece em notebooks Jupyter, que são ideais para exploração de dados, engenharia de features, treinamento e validação de modelos.
- Artefatos Gerados: Ao final de um ciclo de treinamento bem-sucedido, três artefatos principais são salvos:
model_HORIZONTE_MODELO_vX.pkl: O objeto do modelo treinado (ex: RandomForest, SARIMA).scaler_HORIZONTE_vX.pkl: O normalizador (ex: MinMaxScaler) já "fitado" com os dados de treino. É crucial para garantir que os dados de inferência sejam processados da mesma forma.meta_HORIZONTE_vX.json: Um arquivo de metadados que descreve as features esperadas pelo modelo, sua ordem, os lags utilizados e outras informações necessárias para reproduzir o pipeline de pré-processamento no backend.
-
Deploy e Inferência (Online):
- Carregamento: O Backend é responsável por carregar os artefatos (
.pkl,.json) na inicialização. - Endpoint
/prever: A API expõe uma rota/prever. Quando o frontend (ou outro cliente) envia uma requisição com dados recentes, o backend:- Usa o
meta.jsonpara construir as mesmas features do treinamento (lags, deltas, etc.). - Aplica o
scaler.pklpara normalizar os dados. - Chama o método
predict()domodel.pkl. - Salva o resultado da previsão no banco de dados para monitoramento e comparação futuro (previsto vs. realizado).
- Retorna a previsão formatada em JSON para o cliente.
- Usa o
- Carregamento: O Backend é responsável por carregar os artefatos (
-
Re-treino (Manual):
- O processo de re-treino ainda é manual. Quando necessário (ex: para incorporar dados mais recentes e evitar degradação do modelo), o ciclo de treinamento é executado novamente nos notebooks Jupyter.
- Novos artefatos (com versionamento, ex:
v2,v3) são gerados e substituem os arquivos antigos no ambiente do backend.