Entwicklung einer interaktiven Coronavirus-Verbreitungskarte vom Typ 2019-nCoV in Python

Das Coronavirus Typ 2019-nCoV verbreitet sich nach einem Ausbruch in der chinesischen Stadt Wuhan rasch auf der ganzen Welt. Zum Zeitpunkt des Schreibens des Originalartikels (30. Januar 2020) wurden mehr als 9.000 Infizierte und 213 Tote gemeldet. Bis heute (10. Februar 2020) wurden bereits 40.570 Infizierte gemeldet, 910 Menschen sind gestorben. Fälle von Coronavirus-Infektionen wurden in Frankreich, Australien, Russland, Japan, Singapur, Malaysia, Deutschland, Italien, Sri Lanka, Kambodscha, Nepal und vielen anderen Ländern festgestellt. Niemand weiß, wann der Virus gestoppt wird. In der Zwischenzeit wächst die Zahl der bestätigten Fälle von Coronavirus nur noch.

Der Autor des Artikels, den wir heute übersetzen, möchte darüber sprechen, wie mit Python eine einfache Anwendung erstellt werden kann, um die Ausbreitung von Coronavirus zu verfolgen. Nach Abschluss der Arbeit an dieser Anwendung verfügt der Leser über eine HTML-Seite, auf der eine Karte der Ausbreitung des Virus und ein Schieberegler angezeigt werden, mit dem Sie das Datum auswählen können, bis zu dem die Daten auf der Karte angezeigt werden.


Hier wird eine interaktive Karte der Verbreitung von Coronavirus Typ 2019-nCoV-

Technologien wie Python 3.7, Pandas, Plotly 4.1.0 und Jupyter Notebook verwendet.

Bibliotheken importieren


Beginnen wir mit dem Import in ein Projekt, das auf dem Jupyter Notebook, den Plotly- und Pandas-Bibliotheken basiert.

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

Versuchen Sie, den Code auszuführen, bevor Sie fortfahren. Wenn Sie keine Fehlermeldungen gesehen haben, wurden alle erforderlichen Bibliotheken installiert und funktionieren ordnungsgemäß. Wenn der Code nicht ausgeführt werden konnte, lesen Sie die offiziellen Seiten von Plotly und Pandas und lesen Sie die Referenz- und Installationsmaterialien für diese Bibliotheken. Wenn auf Ihrer Hardware kein Jupyter Notebook-System ausgeführt wird, empfehle ich die Verwendung von Google Colab , einer Cloud-basierten Plattform, mit der Sie mit Jupyter Notebook arbeiten können.

Datenverarbeitung


Die Daten, die wir hier verwenden, finden Sie hier . Dies ist eine freigegebene Tabelle mit Google-Dokumenten, die täglich aktualisiert wird. Vielen Dank an alle, die es auf dem Laufenden halten! Sie machen einen sehr notwendigen Job.

Wir werden die Daten mit der Pandas-Methode lesen read_csv. Bevor wir jedoch Daten aus der Tabelle über den Link laden, müssen wir mit diesem Link arbeiten. Jetzt sieht es so aus: Wir müssen das ausgewählte Fragment des Links ersetzen und den Link zu diesem Formular bringen: Im folgenden Code initialisieren wir die Variable, indem wir einen Link zu den Daten schreiben , die Daten mit der Methode lesen und in leere Zellen schreiben, die Werte enthalten .

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)

In dieser Phase der Arbeit ist es äußerst wichtig zu verstehen, wie die von uns verwendeten Datenstrukturen strukturiert sind, da dies bestimmt, welchen Ansatz für die Datenverarbeitung wir anwenden. Zeigen Sie die Daten mit dem Befehl an data.head(). Dies führt zur Ausgabe der ersten 5 Zeilen der Tabelle.


Die ersten 5 Zeilen mit Coronavirus-Daten

In der unteren linken Ecke sehen Sie Informationen, dass die Datentabelle 47 Spalten enthält. Hier sind die Namen der ersten fünf Spalten:country,location_id,location,latitudeundlongitude. Andere Spalten sind Paare, deren Namen wie folgt aufgebaut sind:confirmedcase_dd-mm-yyyyunddeaths_dd-mm-yyyy. Die Gesamtzahl der Spalten in der Tabelle zum Zeitpunkt des Schreibens dieses Materials betrug 47. Dies bedeutet, dass mir Daten für 21 Tage zur Verfügung standen ((47-5) / 2 = 21). Wenn das Startdatum für die Datenerfassung der 10.01.2020 war, war das Enddatum der 30.01.2020.

Die Namen der ersten fünf Spalten der Tabelle ändern sich nicht, aber im Laufe der Zeit werden der Tabelle Spalten mit neuen Namen hinzugefügt. Unsere interaktive Karte gibt eine Visualisierung der Verbreitung des Coronavirus aus und kann den Tag angeben, an dem die Karte erstellt wird. Daher müssen wir den gesamten Datensatz trennen, indem wir für jeden Tag Informationen daraus auswählen und berücksichtigen, dass sich die ersten 5 Spalten der Tabelle nicht ändern und dass jeder Tag durch zwei Spalten beschrieben wird. Wenn Sie sich dann die Daten genauer ansehen, beispielsweise die Daten für den 10.01.2020, stellt sich heraus, dass viele Daten diesem Datum entsprechen. Tatsächlich wurde zu diesem Zeitpunkt der Nachweis von Coronavirus nur an einer Stelle bestätigt, die durch die entsprechende Nummer gekennzeichnet ist. Alle anderen Zeilen an diesem Datum enthalten nur Nullen. Das heisst,dass wir diese Linien vom Kartenerstellungsprozess ausschließen müssen.

Der Prozess der Vorbereitung der Daten für die Visualisierung erfolgt in einem Zyklus.

#  
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'),
    ))

Während des Betriebs wird die Ausgabe jedes Datensatzes mit dem Scattergeo-Diagramm hinzugefügt fig.add_trace. Zum Zeitpunkt des Schreibens werden die Daten, auf deren Grundlage die Bilder erstellt werden, durch 21 Objekte dargestellt. Sie können dies mit dem Befehl überprüfen fig.data.

Slider-Erstellung


Hier erstellen wir einen Schieberegler, mit dem die Auswahl der auf der Karte visualisierten Daten organisiert wird. Hier ist der relevante Code:

# 
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
)]

Der Schiebereglercode besteht aus zwei Hauptfragmenten. Die erste ist eine Schleife, in der die Liste, stepsdie beim Verschieben des Schiebereglers verwendet wird, ausgefüllt wird. Wenn Sie den Schieberegler bewegen, wird der entsprechende Datensatz angezeigt und die zuvor angezeigten Daten werden ausgeblendet. Der zweite Teil des Codes ist die Aufnahme der zuvor erstellten Liste stepsin das Schiebereglerobjekt. Wenn sich der Schieberegler bewegt, wählt er das entsprechende Element aus steps.

Ordnen Sie die Ausgabe zu und speichern Sie sie als HTML-Datei


Nun kommen wir zum letzten Teil des Materials. Hier sprechen wir darüber, wie die Karte angezeigt und im HTML-Format gespeichert wird. Hier ist der Code, der diese Operationen implementiert:

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

Wenn eine Karte angezeigt wird, ist eine visuelle Darstellung des ersten Datensatzes sichtbar. Dann aktualisieren wir den Inhalt der Karte entsprechend der Position des Schiebereglers. Hier setzen wir den Kartentitel und passen seine Höhe an. Im letzten Schritt zeigen wir die Karte mit der Methode fig.showan und speichern sie dann mit der Methode in HTML go_offline.plot.

Vollständiger Projektcode


Hier finden Sie den vollständigen Projektcode zum Erstellen einer Coronavirus-Verteilungskarte vom Typ 2019-nCoV. Bitte beachten Sie, dass die letzte Zeile, die für das Speichern der HTML-Version der Karte verantwortlich ist, bearbeitet werden muss, wobei der dort angegebene Pfad durch den für Sie relevanten ersetzt wird.

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)

Zusammenfassung


Wir haben eine Überprüfung eines Leitfadens zum Erstellen einer interaktiven Karte zur Visualisierung der Verbreitung des Coronavirus Typ 2019-nCoV abgeschlossen. Nachdem Sie dieses Material durchgearbeitet haben, haben Sie gelernt, wie Sie Daten aus den öffentlichen Tabellen von Google lesen, Daten mit Pandas verarbeiten und diese Daten mit dem Schieberegler und Plotly auf einer interaktiven Karte visualisieren. Das Ergebnis des Projekts als HTML-Seite kann hier heruntergeladen werden.. Die auf der Karte angezeigten Informationen hängen von der Datentabelle ab. Jedes Mal, wenn der Projektcode ausgeführt wird, wird die Karte aktualisiert und es werden neue Daten aus der Tabelle darauf verfügbar. Dies ist eine sehr einfache Karte. Es gibt viele Möglichkeiten, dies zu verbessern. Beispielsweise kann es durch zusätzliche Diagramme, einige zusammenfassende Daten usw. ergänzt werden. Wenn Sie interessiert sind, können Sie all dies und noch viel mehr selbst tun.

Liebe Leser! Für welche Aufgaben verwenden Sie die Jupyter Notebook-Technologie?

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


All Articles