Trabalhando nos sistema da mesa de Energia do banco BTG Pactual, constantemente lidamos com dados de precipitação, tanto previsto como observado. A informação de quanto choveu ou quanto choverá em determinado lugar é dada por uma malha de coordenadas (latitude [lat] e longitude [long]) e uma terceira variável que é a precipitação diária acumulada naquele ponto.
Na pasta forecast_files
é possivel encontrar a previsão de precipitação do modelo meteorológico ETA, desenvolvido pelo INPE.
O nome dos arquivos seguem o seguinte padrão: ETA40_p011221a021221.dat -> ETA40_pddmmyyaddmmyy.dat.
Em que a primeira data é referente a quando foi feita a previsão e a segunda data diz respeito qual data está sendo prevista.
Dentro do arquivo, os dados seguem o descrito acima:
lat long data_value
-75.00 -35.00 0.0
-75.00 -34.60 0.1
-75.00 -34.20 0.0
Porém, estes dados não são utilizados desta forma, eles passam por um processamento. Pois, uma das perguntas que queremos responder no nosso dia a dia é: Quanto choveu ou choverá em determinada região do Brasil?.
Para isso, utilizamos um contorno, que é um polígono consistido das coordenadas que delimitam uma região. Assim, conseguimos "recortar" os dados que caem dentro desta região e calcular, por exemplo, a precipitação média da região.
Por exemplo (valores inventados):
forecast_date forecasted_date data_value
01/12/2021 02/12/2021 1.4
01/12/2021 03/12/2021 2.1
... ... ...
01/12/2021 07/12/2021 3.2
O desafio consiste em responder a seguinte pergunta: Qual é a previsão de precipitação ACUMULADA dada pelo modelo ETA no dia 01/12/2021 para a região de escoamento da usina Hidrelétrica Camargos (bacia do rio Grande)?
Modifique o arquivo main.py
para fazer o "recorte" dos dados de precipitação (para todos os dias previstos pelo modelo) e
apresente graficamente a resposta para a pergunta.
- É permitido a utilização de bibliotecas extras
- A entrega do desafio deve ser feita por GIT. Responda o email com o link do seu repositório.
Para instalar as dependências do código:
poetry install
O código pode ser executado com
poetry run python main.py
Pluviosidade por dia
Dia | Pluviosidade (mm) |
---|---|
2021-12-02 | 10.8 |
2021-12-03 | 45.2 |
2021-12-04 | 7.2 |
2021-12-05 | 38.2 |
2021-12-06 | 80.4 |
2021-12-07 | 11.9 |
2021-12-08 | 95.2 |
2021-12-09 | 95.3 |
2021-12-10 | 218.4 |
2021-12-11 | 5.6 |
Total Acumulado | 608.2 |
Pluviosidade por dia em cada ponto dentro da Bacia do Rio Grande
Gráficos de Pluviosidade por dia e acumulada
O algoritmo para verificar se um ponto está dentro do contorno pode ser dividido em alguns passos:
- Elimina os pontos que não estão no retângulo que engloba o contorno:
- Verifica se um ponto possui um valor de y acima do máximo ou abaixo do mínimo de todos os pontos do contorno.
- Para cada ponto, verifica a quantidade de vezes que uma linha do ponto ao infinito intersecta o contorno (se um número impar de vezes, então está dentro)
- Para cada ponto, examina a quantidade de vezes que uma linha do ponto ao infinito intersecta o contorno.
- Utiliza uma linha reta que conecta o ponto ao infinito para esse propósito.
- Desconsidera segmentos cujos valores de y nos extremos não "englobam" o valor de y do ponto.
- A linha se estende à direita do ponto, eliminando a necessidade de considerar segmentos à esquerda do ponto.
- Se segmento horizontal: Contabiliza a interseção apenas se o segmento horizontal é intersectado e os pontos extremos dos segmentos anterior e posterior ao segmento horizontal estão do mesmo lado do contorno.
- Se a linha infinita intersecta um dos extremos do segmento, conta a interseção somente se esse extremo for o "p1" do segmento.
- Caso contrário, a linha intersecta o segmento no meio, a interseção é contabilizada.