Este projeto tem como objetivo demonstrar a criação de um sistema de previsão de risco de enchentes, utilizando a cidade de Rio do Sul (SC) como estudo de caso. Ele combina duas abordagens para gerar alertas:
- Cálculo de Risco por Limiares: Compara o nível atual do rio e uma estimativa futura (baseada na previsão de chuva) com níveis históricos de enchentes para gerar um score de risco (1-5).
- Modelo de Machine Learning (Random Forest): Classifica o risco futuro como "Sim" ou "Não" para enchente, com base em dados históricos e previsão do tempo. Importante: Para fins de demonstração e devido à dificuldade de obter dados históricos climáticos completos e gratuitos, este modelo é treinado usando dados meteorológicos históricos fictícios e exemplos fictícios de dias sem enchente.
AVISO FUNDAMENTAL: O modelo de Machine Learning incluído neste projeto é treinado com DADOS FICTÍCIOS. Suas previsões servem apenas como demonstração acadêmica do processo e NÃO SÃO CONFIÁVEIS para a tomada de decisões reais sobre segurança ou evacuação. A previsão mais realista (embora ainda simplificada) é a gerada pelo método de Cálculo de Risco por Limiares, que utiliza dados reais de nível histórico, nível atual e previsão do tempo.
- Dados Reais:
- Níveis máximos de enchentes históricas (
Metragem
dohistorical_floods.csv
original) - Usados para calcular limites estatísticos. - Nível atual do rio (obtido via web scraping em tempo real).
- Previsão do tempo para os próximos dias (Temperatura, Umidade, Precipitação via API OpenWeatherMap).
- Níveis máximos de enchentes históricas (
- Dados Fictícios (Gerados para o Modelo ML):
- Exemplos de dias sem enchente (
Enchente = 0
): Datas e níveis baixos de rio gerados artificialmente. - Clima histórico (
historical_weather_faked.csv
): Valores de temperatura, umidade e precipitação gerados artificialmente para todas as datas (enchentes reais e não-enchentes fictícias), tentando simular condições mais chuvosas para dias de enchente e mais secas para dias normais.
- Exemplos de dias sem enchente (
rio_do_sul_flood_predictor/
│
├── data/
│ ├── historical_floods.csv
│ ├── historical_floods_faked.csv
│ ├── historical_weather_faked.csv
│ └── flood_forecast_output.csv
│ └── flood_risk_comparison.png
│
├── logs/
│ └── app.log
│
├── model/
│ └── flood_predictor.pkl
│
├── modules/
│ ├── init.py
│ ├── config.py
│ ├── data_collector.py
│ ├── data_loader.py
│ ├── risk_calculator.py
│ ├── ml_predictor.py
│ └── plotter.py
│
├── .env # Chaves de API (NÃO versionar)
├── requirements.txt
├── main.py
├── ml_trainer.py
└── generate_fake_data.py
└── .gitignore
- Geração de Dados Fictícios (Execução Única): O script
generate_fake_data.py
lê ohistorical_floods.csv
original, gera exemplos de dias sem enchente, combina tudo e gera um arquivo de clima fictício correspondente. Salvahistorical_floods_faked.csv
ehistorical_weather_faked.csv
. - Treinamento do Modelo ML (Execução Única): O script
ml_trainer.py
usa os dois arquivos_faked.csv
para treinar o modelo RandomForest e salva omodel/flood_predictor.pkl
. - Execução da Previsão (
main.py
):- Carrega os dados históricos de
historical_floods_faked.csv
para calcular limites estatísticos. - Busca o nível atual do rio via scraping.
- Busca a previsão do tempo (OpenWeatherMap).
- Calcula o risco baseado em limiares para os próximos dias.
- Carrega o modelo
flood_predictor.pkl
. - Faz a previsão ML (Sim/Não) para os próximos dias.
- Salva os resultados combinados e gera o gráfico.
- Carrega os dados históricos de
- Clone o Repositório:
git clone https://github.com/Vogon38/flood-predictor.git cd flood_predictor
- Crie e Ative um Ambiente Virtual:
python -m venv venv source venv/bin/activate # Linux/macOS ou venv\Scripts\activate no Windows
- Instale as Dependências:
pip install -r requirements.txt
- Configure a Chave da API:
- Crie o arquivo
.env
na raiz do projeto. - Adicione sua chave da API do OpenWeatherMap:
OPENWEATHER_API_KEY=SUA_CHAVE_VALIDA_AQUI
- Crie o arquivo
- Revise
modules/config.py
:- Verifique se
LATITUDE
,LONGITUDE
estão corretas para Rio do Sul ou outra cidade qualquer que você queira usar. - Confirme se os paths em
HISTORICAL_FLOODS_CSV
eHISTORICAL_WEATHER_CSV
apontam para os arquivos_faked.csv
. - Verifique se
USE_NDWI
está comoFalse
(pois desabilitei GEE).
- Verifique se
- Arquivo Histórico Original:
- Coloque seu arquivo CSV contendo os registros reais de picos de enchente na pasta
data/
com o nomehistorical_floods.csv
. - IMPORTANTE: Este arquivo precisa ter as colunas
Ano
,Data do pico da cheia
eMetragem
. Tente deixar a coluna de data o mais completa possível (AAAA-MM-DD é ideal, mas o scriptdata_loader
tenta lidar com outros formatos). O scriptgenerate_fake_data.py
lerá este arquivo.
- Coloque seu arquivo CSV contendo os registros reais de picos de enchente na pasta
- Gere os Dados Fictícios:
- Execute o script para criar os arquivos necessários para o treinamento do ML:
python generate_fake_data.py
- Isso criará os arquivos
data/historical_floods_faked.csv
edata/historical_weather_faked.csv
.
- Execute o script para criar os arquivos necessários para o treinamento do ML:
Após a configuração e preparação dos dados, siga esta ordem:
-
Treine o Modelo ML (Executar uma vez após gerar dados):
python ml_trainer.py
Isso criará o arquivo
model/flood_predictor.pkl
. -
Execute a Previsão Principal (Executar para obter previsões):
python main.py
Isso buscará dados atuais, calculará os riscos (limiar e ML fictício), salvará o CSV e gerará o gráfico.
data/flood_forecast_output.csv
: Contém a previsão diária detalhada, incluindo:- Dados da previsão do tempo (temp, umid, precip).
- Nível atual base.
- Nível estimado pelo método de limiares.
- Score de risco (1-5) e categoria pelo método de limiares.
- Previsão ML (Sim/Não) com probabilidade (baseada em dados fictícios).
data/flood_risk_comparison.png
: Gráfico visual comparando nível atual, estimado (limiar) e distribuição histórica.- Logs (
logs/app.log
e Console): Informações detalhadas da execução.
Adaptar este projeto para outra cidade ou região exigirá modificações significativas:
- Configuração (
modules/config.py
):- Altere
LATITUDE
eLONGITUDE
para as coordenadas da nova região. - MUITO IMPORTANTE: Altere
RIVER_LEVEL_URL
para a URL da página web que contém o nível do rio da nova região. Se não houver uma página similar, a função de web scraping precisará ser completamente reescrita ou substituída por outra fonte de dados.
- Altere
- Dados Históricos (
data/historical_floods.csv
):- Substitua o arquivo
historical_floods.csv
pelos dados de enchentes da nova região. O formato deve ser similar (comAno
,Data do pico da cheia
,Metragem
). - Idealmente: Adicione dados reais de dias sem enchente (
Enchente=0
) para a nova região, se disponíveis. Isso melhoraria muito o modelo ML se você decidir usar dados reais no futuro.
- Substitua o arquivo
- Web Scraping (
modules/data_collector.py
):- A função
get_current_river_level
precisará ser reescrita para se adequar à estrutura HTML da nova fonte de dados do nível do rio. Cada site é diferente, então esta é uma parte que exige análise e codificação específica para o novo site.
- A função
- Dados Fictícios (
generate_fake_data.py
):- Ajuste as faixas de valores (temperatura, umidade, precipitação, nível normal do rio) para serem realistas para a nova região.
- Execute-o novamente para gerar os arquivos
_faked.csv
específicos para a nova região (baseados no novohistorical_floods.csv
).
- Treinamento (
ml_trainer.py
):- Execute-o novamente após gerar os novos dados fictícios para criar um modelo
.pkl
adaptado (ainda que ficticiamente) à nova região.
- Execute-o novamente após gerar os novos dados fictícios para criar um modelo
- Calibração (
modules/risk_calculator.py
):- Os limites históricos (média, DP) serão recalculados automaticamente a partir dos novos dados.
- No entanto, a fórmula que estima o
aumento_estimado
do nível do rio baseado na chuva pode precisar de calibração para a hidrologia da nova bacia. Isso pode exigir análise de dados reais da nova região, se disponíveis.
- (Opcional) NDWI/GEE:
- Se quiser usar NDWI, altere
GEE_AOI_COORDS
emconfig.py
para a nova área. - Defina
USE_NDWI = True
. - Instale as dependências GEE e passe pelo processo de configuração/autenticação do GEE.
- Se quiser usar NDWI, altere
A adaptação mais desafiadora geralmente é obter os dados históricos e ajustar a coleta de dados em tempo real (web scraping) para a nova localidade.
- Dados Reais para ML: A melhoria mais significativa seria substituir os dados fictícios por dados reais:
- Não-Enchente: Coletar datas e níveis de rio reais para dias sem enchente na região.
- Clima Histórico: Obter séries históricas reais de temperatura, umidade e precipitação diária para a região. Isso permitiria treinar um modelo ML com potencial de previsão real.
- Integração Google Earth Engine (GEE):
- Ativar a opção
USE_NDWI = True
emconfig.py
(requer configuração de projeto Cloud, habilitação de API e autenticação GEE). - Usar o NDWI atual como feature adicional no cálculo de risco ou na predição ML.
- (Avançado) Usar GEE para buscar NDWI histórico para as datas de treino, substituindo a necessidade de gerar clima fictício ou complementando dados reais.
- Ativar a opção
- Calibração do Modelo de Limiares: Validar e refinar a fórmula em
risk_calculator.py
que estima o aumento do nível do rio com base na chuva, usando dados observados de chuva x aumento do nível para a bacia. - Outras Variáveis: Incluir dados de estações a montante (rio acima), níveis de reservatórios (barragens), ou outras variáveis relevantes.
- Interface/Visualização: Criar um dashboard web para apresentar as previsões de forma mais interativa.