Blog.

Folium: geospatial data python


Autore
Andrea Provino
Data
Tempo di lettura
5 minuti
Categoria
Data Science, machine-learning

folium-python-tutorial-geospatial-data-representation-data-analysis-tutorial-python-guide

Folium è una python data visualization library creata con l’intento di aiutarci nella visualizzazione di geospatial data, i dati geospaziali.

Nei precedenti post abbiamo analizzato dei metodi di data visualziation base, semplici e avanzati.

Capita sovente che all’interno del dataset siano presenti coordinate geografiche. Come possiamo rappresentarne il valore al meglio?

Scopriamolo!

Folium

La libreria Folium consente la facile creazione di una mappa per qualsiasi luogo nel mondo, a patto che si disponga delle relative coordinate.

La visualizzazione predefinita fa uso di OpenStreet Map.

Possiamo creare:

  • Mappe
  • Marcatori sovrapposti
  • Cluster di mappe

Inoltre sono disponibili differenti stili, tra cui:

  • Street Levl Map
  • Stamen Toner Map, utile per evidenziare corsi d’acqua e aree costiere
  • Stamen Terrain Map, utile per visualizzare aree montuose e vegetazione.

Rispetto ad altre librerie multiuso, Folium gestistisce unicamente questa particolare tipologia di dati, e offre illimitate chiamate API in modo totalmente gratuito.

La documentazione è reperibile qui.

Geospatial Data Python Tutorial

Per questo breve tutorial useremo il California Housing Dataset, che raccoglie dati catastali californiani datati 1990. Vecchiotto, ma funzionale.

Il dataset è reperibile all’interno della repository ageron, sviluppata per la parte pratica del libro Hands-On Machine Learning, di cui consiglio l’acquisto: una risorsa formidabile!

ATTENZIONE
Per limitare la prolissità del post, ho riportato il solo codice relativo all’analisi dati geospaziali. Onde evitare lacune e incomprensioni, ti consiglio di fare sempre riferimento al Jupyter Netbook allegato a fondo pagina, dove puoi trovare tutto il flow completo del tutorial.

Importiamo il dataset, quindi creiamo una mappa della California centrata nell coordinate medie, ottenute con describe(), nel dataset.

# defined the world map centerd around california with a higher zoom level
world_map = folium.Map(location=[35,-119], zoom_start=6) #[lat, long]

# display the world map
world_map

Attraverso il parametro tiles siamo in grado di controllare lo stile della mappa. Possiamo scegliere tra:

  • Stamen (Terrain, Toner, Watercoolor)
  • Mapbox Bright
  • CartDB
  • Mapbox Control Room
# defined the world map centerd around california with a higher zoom level
world_map = folium.Map(location=[35,-119], zoom_start=6, tiles="Mapbox Bright") #[lat, long]

# display the world map
world_map

Quest’ultima tipologia di mappa è simile a quella default: nasconde però i bordi degli stati a zoom bassi, e ne riporta i nomi in lingua inglese (contrariamente a visualizzarli nella relativa lingua)

Markers

Aggiungiamo alla mappa dei datapoints:

# define our map's parameter and superimpose single datapoint
lat  = 37
lng = -122

# create the map
california_map = folium.Map(location=[lat,lng], zoom_start=12)

# in order to superimpose the locations of the datapoint we firstly create a feature group with its own feature and style, 
# then add it ot the map

# instantiate a feature group for the datapoints in the dataframe
datapoints = folium.map.FeatureGroup()

# add each datapoint ot the feature group
for lng, lat in zip(df.longitude, df.latitude):
    datapoints.add_child(
           folium.vector_layers.CircleMarker(
            [lat, lng],
            radius=5, # set the markers width
            color='green',
            fill=True,
            fill_color='white',
            fill_opacity=.2
        )
    )
    
# add pop-up text to each marker
lats = list(df.latitude)
lngs = list(df.longitude)
labels = list(df.housing_median_age)

for lat, lng, label in zip(lats, lngs, labels):
    folium.Marker([lat, lng], popup=label).add_to(california_map)
    
# add datapoints to map
california_map.add_child(datapoints)

Map Clusters

Prima di salutarci un rapido sguardo alla creazione di map cluster, particolarmente utile per evitare un’eccessiva congestione di dati.

from folium import plugins

# let's start again with a clean copy of the map of California
california_map = folium.Map(location = [lat, lng], zoom_start = 12)

# instantiate a mark cluster object for the datapoints in the dataframe
datapoints = plugins.MarkerCluster().add_to(california_map)

# loop through the dataframe and add each data point to the mark cluster
for lat, lng, label, in zip(df.latitude, df.longitude, df.housing_median_age):
    folium.Marker(
        location=[lat, lng],
        icon=None,
        popup=label,
    ).add_to(datapoints)

# display map
california_map

Folium Choropleth Maps

Choropleth Map (Mappa Coropletica) è una mappa tematica con aree colorate di differente tonalità in proporzione alla magnitudine della variabile statistica rappresentata su di essa.

Una Choropleth Map rappresenta un sofisticato sistema per la visualizzazione delle misurazioni variabili in funzione dell’area geografica.

Un esempio, la distribuzione di popolazione per miglio quadrato in USA.

Image

La realizzazione di una mappa simile è complessa. Folium agevola il lavoro, benché sia necessario che si disponga di una particolare struttura dati riportante i contorni di demarcazione delle diverse aree tematiche.

Una volta in possesso del file, generalmente un json, puoi procedere come segue:

json_boundaries = r'boundaries.json' # geojson file

# create a plain world map
World_map = folium.Map(location=[0, 0], zoom_start=2, tiles='Mapbox Bright')

# overlap the geojson
World_map.choropleth(
    geo_data=json_boundaries,
    data=df,
    columns=['Columna A','Columna B'],
    fill_color='YlOrRd', 
    key_on='some.key.CASE.SENSITIVE',
    fill_opacity=0.7, 
    line_opacity=0.2,
    legend_name='A legend name'
)

# display map
World_map

Occhio ad alcuni elementi:

  • il key_on è la key all’interno del file json contenente la variabile d’interesse. Per determinarla è necessario aprire il json ed esplorarlo. Ricorda che le key del JSON sono case sensitive, occhio a maiuscole e minuscole.

Un caldo abbraccio, Andrea.

Taggeddata sciencedata scientistdatasettutorial


Ultimi post

Patricia Merkle Trie

Il Practical Algorithm To Retrieve Information Coded In Alphanumeric Merkle Trie, o Patricia Merkle Trie è una struttura dati chiave-valore usatada Ethereum e particolarmente efficiente per il salvataggio e la verifica dell’integrità dell’informazione. In questo post ne studieremo le caratteristiche. Prima di procedere, ci conviene ripassare l’introduzione al Merkle Tree nella quale abbiamo chiarito il […]

Andrea Provino
ethereum-patricia-merkle-tree
Tree Data Structure: cos’è un Merkle Tree

Un Merkle Tree è una struttura dati efficiente per verificare che un dato appartenga a un insieme esteso di elementi. È comunemente impiegato nelle Peer to Peer network in cui la generazione efficiente di prove (proof) contribuisce alla scalabilità della rete. Capire i vantaggi di questa struttura ci tornerà utile nel nostro percorso di esplorazione […]

Andrea Provino
merkle-tree-cover
UTXO: come funziona il modello Unspent Transaction Outputs

Per tenere traccia dei bilanci utente, la blockchain di Bitcoin sfrutta un modello di contabilità definito UTXO o Unspent Transaction Outputs. In questo articolo ne esaminiamo le caratteristiche. Ogni blockchain è dotata di un sistema di contabilità, un meccanismo attraverso cui tenere traccia dei bilanci di ciascun utente. I due grandi modelli di riferimento nel […]

Andrea Provino
bitcoin-utxo
Cos’è Ethereum

Possiamo definire Ethereum come una macchina a stati distribuita che traccia le transizioni di un archivio dati general-purpose (i.e. una memoria in grado di registrare qualsiasi dato esprimibile come coppia di chiave e valore o key-value) all’interno della Ethereum Blockchain. È arrivato il momento di esplorare uno dei progetti tecnologici più innovativi e interessanti degli […]

Andrea Provino
ethereum