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.

Foto di GeoJango Maps su Unsplash

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).

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.

Input dei dati per le mappe del flusso commerciale. Immagine dell'autore.

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.

Creazione degli oggetti dizionario necessari. Immagine dell'autore.

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.

  1. 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.

Il pacchetto Fiona viene utilizzato per aprire il file di forma ed estrarre l'elenco di tutti i nomi dei paesi. Immagine dell'autore.

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:

Tracciamento dei paesi richiesti. Immagine dell'autore.

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.

Flusso di commercio bidirezionale tra paesi rappresentato da frecce tra paesi. Immagine dell'autore.

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