Nesse artigo vou te mostrar como fazer uma representação visual para a frequência de acontecimentos em determinado lugar mais conhecido como mapa de calor usando Python e a biblioteca folium. Esse mapa de calor é bastante utilizado quando precisamos nos basear apenas em uma lista de coordenadas geográficas demarcando a ocorrência de um evento.
OBS: Vale lembrar que existem mapas de calor aplicados à outras finalidades, por exemplo, em websites ou até mesmo tabelas. No nosso caso vamos nos focar em criar um mapa de calor geográfico.
O que é um mapa de calor?
O heatmap, ou mapa de calor (tradução livre), é uma representação gráfica que mostra em quais pontos possuem maior atividade. Esse tipo de mapa possui várias finalidades, por exemplo, esse mapa pode auxiliar pessoas que querem saber em um site, ou blog, houve maior atividade por parte do usuário. Para isso, é necessário analisar as interações com o mouse, considerando também cliques e rolagem da página. Os mapas de calor são utilizadas em diversas ocasiões, até mesmo no esporte, mostrando como um atleta se desloca em um campo de futebol.
Outra aplicação para esse tipo de mapa é verificar qual é a frequência de um acontecimento em uma posição geográfica. Imagine, por exemplo, que queremos mostrar a frequência de homicídios em determinado país de acordo com os lugares com que eles acontecem. Seria necessário informar as posições geográficas desses registros e depois você precisaria aplicar uma cor mais “quente” como o vermelho para lugares com maior incidência e cores mais frias para regiões com menor incidência.
Fica claro que esse tipo de mapa não possui uma finalidade clara, mas representa bem a frequência de acontecimentos e determinado local. Mas agora vem a questão: Como posso construir um mapa assim?
Como criar um mapa de calor usando python
Para nosso exemplo, vamos construir apenas um mapa que mostra a incidência de um evento em posições geográficas. Para isso, utilizaremos uma sequência de coordenadas geográficas como fonte de dados e um trecho muito simples de código em python.
O primeiro passo é definir um arquivo contendo coordenadas geograficas (CSV, XLSX). Em seguida vamos usar a biblioteca folium para gerar esses mapas.
Lembre-se de instalar no seu ambiente o GeoPy:
$ pip install geopy
Além disso, certifique-se que a ferramenta está instalada:
$ pip install folium
or
$ conda install -c conda-forge folium
A seguir, vamos importar o folium para um script no python:
import os
import folium
print(folium.__version__)
Logo após importamos o dataset usando o Pandas.
import pandas as pd
df = pd.read_csv("sul.csv", delimiter=";")
Por fim, geramos o mapa de calor:
# importa o folium
from folium.plugins import HeatMap
# cria uma instância de um mapa
m = folium.Map([48., 5.], tiles='stamentoner', zoom_start=6)
# adiciona o dataframe contendo os dados para o mapa
HeatMap(df).add_to(m)
# salva os resultados dentro da pasta do seu projeto
m.save(os.path.join('results', 'Heatmap.html'))
## "results" é uma pasta e "heatmap.html" é o arquivo que será gerado
Isso gerará um mapa de calor semelhante ao mostrado na imagem:
O projeto contendo o código completo e também alguns datasets de coordenadas estão disponíveis no nosso github.
Podemos coletar coordenadas automaticamente usando Python?
Observando o projeto, percebi que seria bastante útil que o usuário pudesse definir apenas uma lista de endereços e o Python fizesse as conversões para coordenadas automaticamente. Sendo assim, criei um vídeo no YouTube mostrando passo a passo como desenvolvi essa solução.
## faz a leitura do CSV contendo os endereços
import pandas as pd
df = pd.read_csv("enderecos.csv", delimiter=",")
## chama a API GeoPy
from geopy.geocoders import Nominatim
geolocator = Nominatim(user_agent="HeatMapAuto")
## consulta cada endereço e converte em uma lista de coordenadas
geocodes = []
for i in range (0,len(df.index)):
#texto = df['rua'][i] + "," + df['cidade'][i] + "," + df['estado'][i] + "," + df['pais'][i]
location = geolocator.geocode(df['ceps'])
geocodes.append([location.latitude,location.longitude])
## transforma a lista em um dataframe
import numpy as np
a = np.matrix(geocodes)
dfa = pd.DataFrame(a)
### Cria o mapa de calor
import os
import folium
print(folium.__version__)
from folium.plugins import HeatMap
m = folium.Map([48., 5.], tiles='stamentoner', zoom_start=6)
HeatMap(dfa).add_to(m)
m.save(os.path.join('results', 'Heatmap.html'))
OBS: Apesar dessa solução parecer ser “milagrosa” existem alguns problemas ao utilizá-la. Geralmente o serviço de conversão de endereços em coordenadas é muito sensível a erros. Ou seja, muitos endereços que você informa não são encontrados e isso prejudica a geração do mapa. Fique à vontade para contribuir e construir uma forma mais robusta de construir esses mapas 🙂
Bom.
Queria saber como coloco um título para o mapa, bem como autoria e similares (ou seja, como escrevo algo).
Obrigado.
Faltou só dizer que também tem que dar um $ pip install geopy lá no começo, senão depois não vai achar essa biblioteca quando ela for usada. Estou tentando reproduzir o código e o vídeo no Youtube, muito obrigado pelo conteúdo, caso eu consiga fazer e deixar online, deixo aqui o link.
Muito obrigado pela correção Rubens, vou adicionar esse trecho no código!