Visualizzando il flusso commerciale nelle mappe Python – Parte I Mappe del flusso commerciale bidirezionale
Esplorando il flusso commerciale attraverso le mappe Python - Parte I Mappe del flusso commerciale bidirezionale
Lo scambio di beni e servizi in cambio dei loro valori corrispondenti è una parte intricata della nostra vita quotidiana. Allo stesso modo, i paesi si impegnano in diversi tipi di relazioni commerciali per lo scambio di prodotti e servizi come elettricità, beni energetici, materie prime, beni lavorati, turismo, ecc. Comprendere il flusso commerciale tra i paesi (importazioni ed esportazioni) è fondamentale per valutare i guadagni e le spese di un paese, la potenza economica, la sicurezza dell’approvvigionamento e la natura della relazione tra i paesi.
In questa serie in due parti, condividerò come il flusso commerciale tra i paesi può essere visualizzato su mappe utilizzando Python. La prima parte di questa serie si concentrerà sulla visualizzazione del flusso commerciale bidirezionale (importazioni ed esportazioni) tra i paesi. La seconda parte si concentrerà sulla visualizzazione del flusso commerciale netto tra i paesi. Utilizzerò set di dati fittizi di un prodotto ipotetico per questa visualizzazione. Evidenzierò il mio paese e la mia regione (Nepal/Sud Asia) come esempio per scopi dimostrativi. Iniziamo.
Trovare le coordinate delle frecce
Nelle mappe del flusso commerciale, ho cercato di rappresentare le relazioni commerciali bidirezionali tra i paesi. Ad esempio, l’esportazione dal Nepal all’India sarebbe rappresentata dalla prima freccia (A1-A2) e l’importazione dal Nepal dall’India sarebbe rappresentata da una seconda freccia (A3-A4). In questo modo, ogni coppia di paesi richiederebbe quattro punti di coordinate per definire i punti di partenza e arrivo delle frecce per rappresentare rispettivamente le esportazioni e le importazioni.
Anche se è possibile assumere automaticamente una coordinata che può essere rilevata (ad esempio, il centroide di una geometria del paese), ho intenzione di marcare i punti in una mappa e ottenere le loro coordinate singolarmente. A questo scopo, è possibile creare un progetto in un’applicazione come Google Earth, esportare un file KML e estrarre le coordinate con un convertitore (ad esempio, il convertitore di dati GIS nel sito web di MyGeodata Cloud).
- Perché abbiamo anche reti neurali?
- Strategia di co-ottimizzazione SW/HW per Large Language Models (LLM)
- Magazzinaggio dati moderno
Keyhole Markup Language (KML) è un formato di file utilizzato per visualizzare dati geografici in un’applicazione come Google Earth. Utilizza una struttura basata su tag con elementi e attributi nidificati ed è basato sullo standard XML (Google, 2023).
Dati
La struttura dei miei dati di input appare come mostrato nell’immagine sottostante. Contiene cinque diverse relazioni commerciali tra paesi confinanti: Nepal-India, Nepal-Bangladesh, Nepal-Cina, India-Pakistan e India-Sri Lanka. Per ogni coppia di paesi, ci sono quattro punti di coordinate per i punti di partenza e arrivo delle due frecce. Value1 rappresenta l’esportazione da Paese1 a Paese2. Value2 rappresenta l’importazione da Paese1 da Paese2. L’obiettivo è visualizzare questa relazione su una mappa Python.
Ho letto i dati sopra come dataframe pandas df
. Inoltre, ho creato oggetti dizionario come transfers
che contiene il volume di esportazione e importazione tra ogni coppia di paesi, e startarrow1_dict
che contiene la coordinata del punto di partenza della prima freccia.
Descrizione del codice
In questa sezione, descriverò il codice utilizzato per visualizzare le mappe dei flussi commerciali. Utilizzerò principalmente i pacchetti matplotlib e cartopy. Ho anche utilizzato gli stessi pacchetti per visualizzare l’anomalia della temperatura superficiale globale in uno dei miei post precedenti.
- Importa i pacchetti richiesti
Ho iniziato importando i principali pacchetti e le relative dipendenze come mostrato di seguito:
import cartopy.crs as ccrsimport cartopy.io.shapereader as shpreaderimport matplotlib.pyplot as pltimport matplotlib.patches as mpatchesfrom matplotlib import colormapsfrom matplotlib.colors import Normalizefrom matplotlib.cm import ScalarMappableimport numpy as npimport pandas as pdimport os
2. Leggi il file di forma
Come file di forma, ho utilizzato il vettore Natural Earth. Il file vettoriale può essere letto direttamente dal modulo shapereader del pacchetto cartopy.
# ottieni il file di confine dei paesi (risoluzione 10m) ed estrailo shpfilename = shpreader.natural_earth( resolution=”10m”, category=”cultural”, name=”admin_0_countries”, )reader = shpreader.Reader(shpfilename)countries = reader.records()
Utilizzando un pacchetto chiamato Fiona, è possibile leggere l’elenco di tutti i paesi come mostrato di seguito.
3. Estrai le informazioni solo dei paesi richiesti
Successivamente, ho creato richiesti
, che è una lista di sei paesi con relazioni commerciali. Ho creato anche un oggetto dizionario c
, che conteneva il FionaRecord cioè tutte le informazioni rilevanti dei paesi che possono essere utilizzate per il tracciamento.
# paesi richiestirequired = [“Nepal”, “India”, “Bangladesh”,”China”,”Pakistan”,”Sri Lanka”]# estrai le informazioni specifiche del paesec = { co.attributes["ADMIN"]: co for co in countries if co.attributes["ADMIN"] in richiesti }
4. Traccia i paesi richiesti
e ritaglia
In questo passaggio, prima ho tracciato le geometrie dei paesi richiesti
in una proiezione PlateCarree come mostrato di seguito:
Successivamente, ho voluto ritagliare le geometrie del resto del mondo in modo da poter avere una vista ingrandita dei sei paesi da soli. Ho determinato l’estensione dei valori di longitudine e latitudine massima e minima che potevano coprire tutti i sei paesi, impostato l’estensione per il tracciamento degli assi e tracciato i paesi. Nel ciclo for, ho anche aggiunto un codice che avrebbe visualizzato i nomi dei paesi sopra la geometria del centroide di ciascun paese.
L’attributo zorder
dell‘imballaggio matplotlib determinerà l’ordine di disegno degli artisti. Gli artisti con un zorder
più alto vengono disegnati sopra.
# ottieni il bounding box globale a partire dai confini dei paesibox = np.array([c[cn].bounds for cn in c])lon = [box.min(0)[0], box.max(0)[2]]lat = [box.min(0)[1], box.max(0)[3]]ax = plt.axes(proiezione=ccrs.PlateCarree())# ottieni i centroidi dei paesiax.set_extent([lon[0] - 1, lon[1] + 1, lat[0] - 1, lat[1] + 1]) for chiave, cn in zip(c.keys(),c.values()): ax.add_geometries(cn.geometry, crs=ccrs.PlateCarree(), edgecolor="gray", facecolor="whitesmoke", zorder = 1) # Aggiungi i nomi dei paesi centroide = cn.geometry.centroid ax.text( centroide.x, centroide.y, chiave, # Supponendo che 'nome' sia l'attributo che contiene i nomi dei paesi allineamento_orizzontale='centro', allineamento_verticale='centro', transform=ccrs.PlateCarree(), dimensione_carattere=8, # Regola la dimensione del carattere come necessario colore='nero', # Imposta il colore del testo zorder = 2 ) plt.axis("off")plt.show()
5. Imposta la mappa dei colori, aggiungi frecce e legenda dei colori.
Questa è la sezione più importante del codice. Prima, ho selezionato viridis_r
, ovvero la tavolozza dei colori invertita di viridis
, come mappa di colori. Successivamente, ho determinato il valore minimo e massimo di qualsiasi valore di scambio tra paesi come tmin
e tmax
rispettivamente. Questi valori vengono normalizzati in modo che il tmin
corrisponda all’estremità inferiore (0) e il tmax
corrisponda all’estremità superiore (1) della mappa dei colori cmap
e utilizzati di conseguenza nel codice successivo.
Poi ho attraversato il ciclo transfers
e utilizzato l’oggetto FancyArrowPatch per tracciare le frecce tra i paesi. Ogni oggetto freccia è associato a un colore univoco col
che rappresenta il flusso commerciale da un paese all’altro. Sebbene sia anche possibile utilizzare uno spostamento dalle coordinate della prima freccia per tracciare la seconda freccia, ho specificato le coordinate per la seconda freccia nel mio codice. Nel codice, l’attributo mutation_scale
viene utilizzato per controllare la lunghezza della testa della freccia e l’attributo linewidth
viene utilizzato per controllare la larghezza della linea principale.
Infine, ho aggiunto la legenda dei colori orizzontale sotto il grafico principale.
ax = plt.axes(projection=ccrs.PlateCarree())# ottieni i centroidi dei paesiax.set_extent([lon[0] - 1, lon[1] + 1, lat[0] - 1, lat[1] + 1])for key, cn in zip(c.keys(),c.values()): ax.add_geometries(cn.geometry, crs=ccrs.PlateCarree(), edgecolor="grey", facecolor="whitesmoke", zorder = 1) # Aggiungi i nomi dei paesi centroid = cn.geometry.centroid ax.text( centroid.x, centroid.y, key, # Supponendo che 'name' sia l'attributo che contiene i nomi dei paesi horizontalalignment='center', verticalalignment='center', transform=ccrs.PlateCarree(), fontsize=8, # Regola la dimensione del carattere secondo necessità color='black', # Imposta il colore del testo zorder = 2 )# Imposta una mappa dei coloricmap = colormaps.get("viridis_r")tmin = np.array([v for v in transfers.values()]).min()tmax = np.array([v for v in transfers.values()]).max()norm = Normalize(tmin, tmax)for tr in transfers: c1, c2 = tr.split(",") startarrow1 = startarrow1_dict[tr] endarrow1 = endarrow1_dict[tr] startarrow2 = startarrow2_dict[tr] endarrow2 = endarrow2_dict[tr] t1 = transfers[tr][0] col = cmap(norm(t1)) # Utilizza la funzione freccia per disegnare le frecce arrow = mpatches.FancyArrowPatch( (startarrow1[0], startarrow1[1]), (endarrow1[0], endarrow1[1]), mutation_scale=20, # controlla la lunghezza della testa della freccia color=col, arrowstyle='-|>', linewidth=2, # Puoi regolare la larghezza per controllare la larghezza del corpo della freccia zorder = 3 ) ax.add_patch(arrow) #ALTRO MODO offset = 1 t2 = transfers[tr][1] col = cmap(norm(t2)) arrow = mpatches.FancyArrowPatch( (startarrow2[0], startarrow2[1]), (endarrow2[0], endarrow2[1]), mutation_scale=20, color=col, arrowstyle='-|>', linewidth=2, # Puoi regolare la larghezza per controllare la larghezza del corpo della freccia zorder = 4 ) ax.add_patch(arrow) sm = ScalarMappable(norm, cmap)fig = plt.gcf()cbar = fig.colorbar(sm, ax=ax, orientation = "horizontal", pad = 0.05, #distanza tra il grafico principale e la legenda dei colori shrink = 0.8, #controllo della lunghezza aspect = 20 #controllo della larghezza )cbar.set_label("Flusso commerciale")plt.title("Flusso commerciale in Asia meridionale")plt.axis("off")plt.savefig("flusso_commerciale2_con_etichette.jpeg", dpi = 300)plt.show()
Il prodotto finale è mostrato di seguito. Nel mio set di dati di esempio, il flusso commerciale più basso è l’esportazione dallo Sri Lanka all’India (53 unità), che è rappresentata dal colore giallo. Il flusso commerciale più alto è l’esportazione dal Bangladesh al Nepal (98 unità), che è rappresentata dal colore viola.
Conclusioni
In questo post ho dimostrato come il flusso commerciale tra paesi, includendo le relazioni di esportazione e importazione, può essere visualizzato in una mappa di Python utilizzando due frecce. Per questo scopo ho utilizzato i pacchetti cartopy e matplotlib. Nella seconda parte di questa serie, mostrerò come può essere visualizzata la relazione di flusso commerciale “net”, evidenziando i paesi esportatori netti e i paesi importatori netti.
Il notebook per questo post è disponibile in questo repository di GitHub. Grazie per la lettura!
Riferimenti
Sviluppatori di Google, 2023. Tutorial KML | Keyhole Markup Language | Google for Developers. Il contenuto di questa pagina è concesso in licenza ai sensi della Licenza Creative Commons Attribution 4.0