Développement d'une carte de distribution interactive des coronavirus de type 2019-nCoV en Python

Le coronavirus de type 2019-nCoV, après une épidémie dans la ville chinoise de Wuhan, se propage rapidement dans le monde. Au moment de la rédaction de l'article original (30 janvier 2020), plus de 9000 personnes infectées et 213 morts ont été signalées, à ce jour (10 février 2020), 40570 personnes infectées ont déjà été signalées, 910 personnes sont décédées. Des cas d'infection à coronavirus ont été détectés en France, en Australie, en Russie, au Japon, à Singapour, en Malaisie, en Allemagne, en Italie, au Sri Lanka, au Cambodge, au Népal et dans de nombreux autres pays. Personne ne sait quand le virus sera arrêté. Entre-temps, le nombre de cas confirmés de coronavirus ne fait que croître.

L'auteur de l'article que nous traduisons aujourd'hui souhaite expliquer comment, à l'aide de Python, créer une application simple pour suivre la propagation du coronavirus. Après avoir terminé le travail sur cette application, le lecteur aura une page HTML qui affiche une carte de la propagation du virus et un curseur qui vous permet de sélectionner la date à laquelle les données seront affichées sur la carte.


Une carte interactive de la distribution des

technologies coronavirus de type 2019-nCoV telles que Python 3.7, Pandas, Plotly 4.1.0 et Jupyter Notebook sera utilisée ici.

Importer des bibliothèques


Commençons par importer dans un projet basé sur le Notebook Jupyter, les bibliothèques Plotly et Pandas.

import plotly.offline as go_offline
import plotly.graph_objects as go
import pandas as pd

Avant de continuer, essayez d'exécuter le code. Si vous n'avez pas vu de messages d'erreur, toutes les bibliothèques nécessaires ont été installées et fonctionnent correctement. Si le code ne s'exécute pas, consultez les pages officielles de Plotly et Pandas et lisez les documents de référence et d'installation de ces bibliothèques. Si vous n'avez pas de système Jupyter Notebook en cours d'exécution sur votre matériel, je vous recommande d'utiliser Google Colab , une plate-forme cloud qui vous permet de travailler avec Jupyter Notebook.

Traitement de l'information


Les données que nous utilisons ici peuvent être trouvées ici . Il s'agit d'une feuille de calcul partagée de documents Google qui est mise à jour quotidiennement. Un grand merci à tous ceux qui le tiennent à jour! Vous faites un travail très nécessaire.

Nous lirons les données en utilisant la méthode Pandas read_csv. Mais avant de charger les données de la table, en utilisant le lien vers celle-ci, nous devons travailler avec ce lien. Maintenant, cela ressemble à ceci: Nous devons remplacer le fragment sélectionné du lien, amenant le lien à ce formulaire: Dans le code suivant, nous initialisons la variable en y écrivant un lien vers les données, lisons les données à l'aide de la méthode et écrivez dans des cellules vides contenant des valeurs .

https://docs.google.com/spreadsheets/d/18X1VM1671d99V_yd-cnUI1j8oSG2ZgfU_q1HfOizErA/edit#gid=0



https://docs.google.com/spreadsheets/d/18X1VM1671d99V_yd-cnUI1j8oSG2ZgfU_q1HfOizErA/export?format=csv&id

urlread_csvNaN0

url='https://docs.google.com/spreadsheets/d/18X1VM1671d99V_yd-cnUI1j8oSG2ZgfU_q1HfOizErA/export?format=csv&id'
data=pd.read_csv(url)
data=data.fillna(0)

Comprendre comment les structures de données que nous utilisons est structuré est extrêmement important à ce stade du travail, car cela détermine quelle approche du traitement des données nous appliquons. Affichez les données à l'aide de la commande data.head(). Cela conduira à la sortie des 5 premières lignes du tableau.


Les 5 premières lignes de données de coronavirus

Dans le coin inférieur gauche, vous pouvez voir des informations indiquant qu'il y a 47 colonnes dans le tableau de données. Voici les noms des cinq premières colonnes:country,location_id,location,latitudeetlongitude. Les autres colonnes sont des paires dont les noms sont construits comme suit:confirmedcase_dd-mm-yyyyetdeaths_dd-mm-yyyy. Le nombre total de colonnes dans le tableau au moment de la rédaction de ce document était de 47. Cela signifie que j'avais des données pendant 21 jours à ma disposition ((47-5) / 2 = 21). Si la date de début de collecte des données était le 10.01.2020, la date de fin était le 30.01.2020.

Les noms des cinq premières colonnes du tableau ne changent pas, mais au fil du temps, des colonnes avec de nouveaux noms seront ajoutées au tableau. Ce que notre carte interactive produira est une visualisation de la distribution du coronavirus avec la possibilité d'indiquer le jour selon lequel la carte est formée. Par conséquent, nous devons séparer l'ensemble des données en sélectionnant des informations pour chaque jour et en tenant compte du fait que les 5 premières colonnes du tableau ne changent pas et que chaque jour est décrit par deux colonnes. Ensuite, si vous regardez de plus près les données, par exemple, les données du 10.01.2020, il s'avère que de nombreuses dates correspondent à cette date. En fait, à cette date, la détection de coronavirus n'a été confirmée qu'en un seul endroit, marqué par le numéro correspondant. Toutes les autres lignes à cette date ne contiennent que des zéros. Ça veut dire,que nous devons exclure ces lignes du processus de construction de la carte.

Le processus de préparation des données pour la visualisation est effectué dans un cycle.

#  
fig=go.Figure()
col_name=data.columns
n_col=len(data.columns)
date_list=[]
init=4
n_range=int((n_col-5)/2)

#,          
for i in range(n_range):
    col_case=init+1
    col_dead=col_case+1
    init=col_case+1
    df_split=data[['latitude','longitude','country','location',col_name[col_case],col_name[col_dead]]]
    df=df_split[(df_split[col_name[col_case]]!=0)]
    lat=df['latitude']
    lon=df['longitude']
    case=df[df.columns[-2]].astype(int)
    deaths=df[df.columns[-1]].astype(int)
    df['text']=df['country']+'<br>'+df['location']+'<br>'+'confirmed cases: '+ case.astype(str)+'<br>'+'deaths: '+deaths.astype(str)
    date_label=deaths.name[7:17]
    date_list.append(date_label)
    
    #  Scattergeo
    fig.add_trace(go.Scattergeo(
    name='',
    lon=lon,
    lat=lat,
    visible=False,
    hovertemplate=df['text'],
    text=df['text'],
    mode='markers',
    marker=dict(size=15,opacity=0.6,color='Red', symbol='circle'),
    ))

Pendant le fonctionnement, la sortie de chaque ensemble de données est ajoutée au graphique Scattergeo à l'aide de fig.add_trace. Au moment de la rédaction, les données sur la base desquelles les images seront construites sont représentées par 21 objets. Vous pouvez le vérifier en utilisant la commande fig.data.

Création de curseurs


Ici, nous allons créer un curseur à l'aide duquel la sélection des données visualisées sur la carte est organisée. Voici le code pertinent:

# 
steps = []
for i in range(len(fig.data)):
    step = dict(
        method="restyle",
        args=["visible", [False] * len(fig.data)],
        label=date_list[i],
    )
    step["args"][1][i] = True  #  i-     "visible"
    steps.append(step)
    
sliders = [dict(
    active=0,
    currentvalue={"prefix": "Date: "},
    pad={"t": 1},
    steps=steps
)]

Le code du curseur se compose de deux fragments principaux. La première est une boucle dans laquelle la liste stepsutilisée lors du déplacement du curseur est remplie . Lorsque vous déplacez le curseur, l'ensemble de données correspondant est visualisé et ce qui est affiché avant est masqué. La deuxième partie du code est l'inclusion de la liste précédemment construite stepsdans l'objet curseur. Lorsque le curseur se déplace, il sélectionne l'élément correspondant dans steps.

Mappez la sortie et enregistrez-la en tant que fichier HTML


Nous arrivons maintenant à la dernière partie du matériel. Ici, nous expliquons comment afficher la carte et comment l'enregistrer au format HTML. Voici le code qui implémente ces opérations:

#    
fig.data[0].visible=True

#       HTML
fig.update_layout(sliders=sliders,title='Coronavirus Spreading Map'+'<br>geodose.com',height=600)
fig.show()
go_offline.plot(fig,filename='F:/html/map_ncov.html',validate=True, auto_open=False)

Lorsqu'une carte est affichée, une représentation visuelle du premier ensemble de données est visible. Ensuite, nous faisons le contenu de la mise à jour de la carte en fonction de la position du curseur. Ici, nous définissons le titre de la carte et ajustons sa hauteur. À la dernière étape, nous affichons la carte à l'aide de la méthode fig.show, puis l'enregistrons au format HTML à l'aide de la méthode go_offline.plot.

Code de projet complet


Voici le code de projet complet pour créer une carte de distribution des coronavirus de type 2019-nCoV. Veuillez noter que la dernière ligne responsable de l'enregistrement de la version HTML de la carte doit être modifiée, en remplaçant le chemin spécifié ici par celui qui vous concerne.

import plotly.offline as go_offline
import plotly.graph_objects as go
import pandas as pd

# 
url='https://docs.google.com/spreadsheets/d/18X1VM1671d99V_yd-cnUI1j8oSG2ZgfU_q1HfOizErA/export?format=csv&id'
data=pd.read_csv(url)
data=data.fillna(0)

#  
fig=go.Figure()
col_name=data.columns
n_col=len(data.columns)
date_list=[]
init=4
n_range=int((n_col-5)/2)

#,          
for i in range(n_range):
    col_case=init+1
    col_dead=col_case+1
    init=col_case+1
    df_split=data[['latitude','longitude','country','location',col_name[col_case],col_name[col_dead]]]
    df=df_split[(df_split[col_name[col_case]]!=0)]
    lat=df['latitude']
    lon=df['longitude']
    case=df[df.columns[-2]].astype(int)
    deaths=df[df.columns[-1]].astype(int)
    df['text']=df['country']+'<br>'+df['location']+'<br>'+'confirmed cases: '+ case.astype(str)+'<br>'+'deaths: '+deaths.astype(str)
    date_label=deaths.name[7:17]
    date_list.append(date_label)
    
    #  Scattergeo
    fig.add_trace(go.Scattergeo(
    name='',
    lon=lon,
    lat=lat,
    visible=False,
    hovertemplate=df['text'],
    text=df['text'],
    mode='markers',
    marker=dict(size=15,opacity=0.6,color='Red', symbol='circle'),
    ))


# 
steps = []
for i in range(len(fig.data)):
    step = dict(
        method="restyle",
        args=["visible", [False] * len(fig.data)],
        label=date_list[i],
    )
    step["args"][1][i] = True  #  i-     "visible"
    steps.append(step)
    
sliders = [dict(
    active=0,
    currentvalue={"prefix": "Date: "},
    pad={"t": 1},
    steps=steps
)]

#    
fig.data[0].visible=True

#       HTML
fig.update_layout(sliders=sliders,title='Coronavirus Spreading Map'+'<br>geodose.com',height=600)
fig.show()
go_offline.plot(fig,filename='F:/html/map_ncov_slider.html',validate=True, auto_open=False)

Sommaire


Nous avons terminé la révision d'un guide sur la création d'une carte interactive pour visualiser la distribution du coronavirus de type 2019-nCoV. Après avoir étudié ce matériel, vous avez appris à lire les données des feuilles de calcul publiques de Google, à traiter les données à l'aide de Pandas et à visualiser ces données sur une carte interactive à l'aide du curseur et de Plotly. Le résultat du projet sous forme de page HTML peut être téléchargé à partir d'ici.. Les informations affichées sur la carte dépendent du tableau de données. Chaque fois que le code du projet est exécuté, la carte est mise à jour et de nouvelles données de la table y sont disponibles. Ceci est une carte très simple. Il existe de nombreuses façons de l'améliorer. Par exemple, il peut être complété par des graphiques supplémentaires, des données récapitulatives, etc. Si vous êtes intéressé, vous pouvez faire tout cela et bien plus encore.

Chers lecteurs! Pour quelles tâches utilisez-vous la technologie Jupyter Notebook?

Source: https://habr.com/ru/post/undefined/


All Articles