Michel Nascimento - 06/06/2020
Objetivo deste tutorial
Demonstrar de forma simples e rápida o processo de criação de mapas em python. Como exemplo prático, são utilizados dados sobre casos confirmados da COVID-19 no Brasil.
O que é preciso?
Apenas acesso à Internet ou ter o python instalado na máquina.
Neste último caso, basta escolher a IDE de prefência, Jupyter, PyCharm, Spyder, etc…
Se não possui e não quer instalar o python, basta acesssar o Google Colabs e continuar o tutorial!
Preparando o ambiente de trabalho
A primeira atividade é importar as ferramentas necessárias para poder trabalhar com o mapa.
# Para manipular dataframes
import pandas as pd
# Fazer alguns cálculos
import numpy as np
# Tratar o mapa
import folium
# Manipular arquivos json
import json
Em caso de estar utilizando o python e não ter alguns dos pacotes descritos, basta instalá-los através do instalador pip:
python3 -m pip install folium
python -m pip install pandas
Ou caso use o conda:
conda install -c conda-forge folium
Gerando o mapa base
Para gerar o mapa do pacote folium, basta executar o código abaixo e pronto! Uma base para o mapa já é renderizada.
mapa = folium.Map()
Acontece que para o objetivo do tutorial, a análise dos dados se dá especificamente no Brasil, para isso, deve-se customizar um pouco o mapa…
mapa = folium.Map(
# centralização do mapa no Brasil
location = [-14.2350, -51.9253],
# zoom
zoom_start = 4
)
E tem-se então uma base adequada para explorar os dados!
E os dados?
Para a analise, serão utilizados os dados fornecidos pelo brasil.io, que devem ser salvos em um dataframe usando o pandas.
df = pd.read_csv('https://brasil.io/dataset/covid19/caso?format=csv')
# visualizando alguns dados
df.head(5)
date | state | city | place_type | confirmed | deaths | is_last | estimated_population_2019 | city_ibge_code | confirmed_per_100k_inhabitants | death_rate | |
---|---|---|---|---|---|---|---|---|---|---|---|
0 | 2020-04-12 | MG | Abaeté | city | 1 | 0.0 | True | 23237.0 | 3100203.0 | 4.30348 | NaN |
1 | 2020-04-12 | MG | Alfenas | city | 1 | 0.0 | True | 79996.0 | 3101607.0 | 1.25006 | NaN |
2 | 2020-04-12 | MG | Alpercata | city | 1 | 0.0 | True | 7424.0 | 3101805.0 | 13.46983 | NaN |
3 | 2020-04-12 | MG | Araguari | city | 7 | 0.0 | True | 117267.0 | 3103504.0 | 5.96928 | NaN |
4 | 2020-04-12 | MG | Arcos | city | 4 | 0.0 | True | 40092.0 | 3104205.0 | 9.97705 | NaN |
Como se vê, esses dados vêm separados por cidades e estados, já que a intenção é visualizar no mapa apenas os casos confirmados nos estados, a tabela é filtrada para se ter apenas as informações necessárias.
# filtrando a tabela, separando casos confirmados por estado
df_por_estados = df.loc[df.place_type == 'state', ['state', 'confirmed','is_last']]
# considerando apenas as últimas medições de cada estado
df_por_estados = df_por_estados.loc[df.is_last == True, ['state', 'confirmed']]
df_por_estados.head(5)
state | confirmed | |
---|---|---|
100 | MG | 806 |
106 | AC | 72 |
112 | AL | 48 |
131 | AM | 1049 |
135 | AP | 193 |
Como separar as regiões?
Neste exemplo, o mapa do Brasil deve estar separado visualmente pelas fronteiras de seus estados.
Primeiramente busca-se um json, este é um arquivo que contem dados sobre as linhas fronteiriças que separam os espaços dentro do mapa. Um exemplo pode ser encontrado aqui br_states, após o download desse arquivo deve-se adicioná-lo na mesma pasta em que o código está sendo executado.
A mesma coisa pode ser feita com os municípios, caso houvesse a intenção de se analisar algum estado apenas, bastaria utilizar um json previamente separado por municípios.
Os dados estão disponíveis na api do IBGE, basta usar o código do município aqui: malha IBGE.
# criando um objeto com os geo dados
dados_geo = json.load(open("br_states.json"))
Agora há um objeto para delineamento dos estados no mapa, é hora de usá-lo!
mapa = folium.Map([-14.2350, -51.9253], zoom_start=4)
folium.Choropleth(
geo_data=dados_geo,
# paleta de cores
fill_color='YlGnBu',
fill_opacity=0.3,
line_weight=2,
data = df_por_estados,
columns = ['state', 'confirmed'],
key_on = 'feature.id',
).add_to(mapa)
<folium.features.Choropleth at 0x24c7c5c1d68>
Como pode-se perceber, os estados estão separados, porém as cores da legenda não parecem muito bem distribuídas, para resolver isso, utiliza-se uma técnica de normalização simples e comum, a escala logarítmica.
# normalizando os valores de casos confirmados
df_por_estados['confirmed'] = np.log(df_por_estados['confirmed'])
# Imprimindo novamente o mapa
mapaFim = folium.Map([-14.2350, -51.9253], zoom_start=4)
folium.Choropleth(
geo_data=dados_geo,
# utilizando outra paleta de cores
fill_color='PuRd',
fill_opacity=0.9,
line_weight=2,
data = df_por_estados,
columns = ['state', 'confirmed'],
key_on = 'feature.id',
legend_name = "Casos em escala logarítmica"
).add_to(mapaFim)
<folium.features.Choropleth at 0x24c16fdd860>
Agora o mapa apresenta uma boa divisão, também foram alteradas a opacidade e a paleta de cores.
Customização
A capacidade de customização de mapas com essa biblioteca é enorme, pode-se adicionar interatividade, animações, marcas, etc… O intuito do tutorial é trazer apenas uma forma simples e rápida de se iniciar no processo de renderização de mapas. Tem muita coisa legal aqui: Folium.
c.q.d
Fim