Ich habe versucht, die statistischen Daten der neuen Corona mit Python abzurufen und zu analysieren: Daten der Johns Hopkins University

Einführung

Ich werde nach langer Zeit auf Quiita posten. Vor kurzem habe ich begonnen, statistische Daten über die Pandemie des neuen Coronavirus zu analysieren (als persönliches Lebenswerk, nicht als Job?). Und ich habe einige Artikel in meinem Blog veröffentlicht.

Beispielsweise wird als Ergebnis der Datenanalyse ein Diagramm veröffentlicht, das den Zeitreihenübergang der Lebensrettungsrate darstellt. (Obwohl sich die Zählkriterien für infizierte Menschen von Land zu Land unterscheiden, zeigen die Daten, dass Japan auch aus globaler Sicht über eine ausgezeichnete medizinische Praxis verfügt.)

covid19_rescue_ratio_japan_europe_us_20200401.png

Dieses Mal möchte ich den Vorbereitungscode für die Analyse der neuen statistischen Coronavirus-Daten der Johns Hopkins University mitteilen.

Mit diesem Code können Sie einen Datenrahmen für die neuen Coronavirus-Statistiken erstellen und an Ihrer Datenanalyse arbeiten.

Wir hoffen, dass Sie einen kleinen Beitrag leisten, wenn Sie ihn verwenden.

Daten herunterladen und verarbeiten

Die Johns Hopkins University veröffentlicht statistische Daten (und in chronologischer Reihenfolge!) Über neue Coronavirus-Infektionen weltweit auf Github. --Repost: Öffentliche Daten der Johns Hopkins University

Der gesamte Verarbeitungsfluss besteht darin, "urllib" zu verwenden, um die Daten abzurufen und dann zu verarbeiten. Die von der Johns Hopkins University veröffentlichten statistischen Daten umfassen drei Dinge: "bestätigt", "Todesfälle" und "wiederhergestellt". Darüber hinaus gibt es Aufzeichnungen, die die Granularität bis zur regionalen Einheit jedes Landes aufzeichnen. Dieses Mal werden wir nach Ländern zusammenfassen und analysieren.

Es gibt jedoch eine Einschränkung. Obwohl es sich um eine Zeitreihe handelt, gibt es für jedes Datum in Spaltenrichtung Dutzende von Spalten. Daher müssen wir es in eine benutzerfreundliche Struktur konvertieren.

Dies ist beispielsweise der Datenrahmen. (Bei der Anzahl der bestätigten Infektionen) Sie können sehen, dass die Spalten, die wie Datumsangaben aussehen, aneinandergereiht sind. timelined_df_sample_jhuniv_20200406.png

Indem Sie Zeitreihenspalten strukturell in Zeilenrichtung transformieren und nach Ländern aggregieren, können Sie sich in einem orthodoxen Datenrahmen niederlassen, der einfach zu handhaben ist.

Dieses Mal habe ich es auf Jupyter Notebook implementiert. Ich denke also, dass es funktionieren wird, wenn Sie den im Eintrag angegebenen Code so einfügen, wie er ist, und ihn in der Reihenfolge von oben ausführen.

Implementierung der Crawler-Klasse

Definieren Sie eine Crawlerklasse. Der Name ist genau das. Es scheint, dass es in anderen Notizbüchern wiederverwendet wird, also habe ich es vorerst zu einer Klasse gemacht.

import urllib
import json
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import numpy as np
import io
from dateutil.parser import parse
from tqdm import tqdm, tqdm_notebook

class Crowler():

  def __init__(self):
    """
Crawler-Klasse

    """
    self._ua = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) '\
      'AppleWebKit/537.36 (KHTML, like Gecko) '\
      'Chrome/55.0.2883.95 Safari/537.36 '

  def fetch(self, url):
    """
Geben Sie die URL an und führen Sie die HTTP-Anforderung aus.

    :param url:
    :return:Ergebnis anfordern(html)
    """
    req = urllib.request.Request(url, headers={'User-Agent': self._ua})
    return urllib.request.urlopen(req)

verschiedene Einstellungen

Definieren Sie die Crawler-Instanzdeklaration und die URL jeder Datenquelle.

#Crawler-Instanz
cr = Crowler()

#Zeitreihendaten des Übergangs infizierter Personen
url_infection = 'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv'

#Zeitreihendaten von Todesfällen
url_deaths = 'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_deaths_global.csv'

#Zeitreihendaten von Heilern
url_recover = 'https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_recovered_global.csv'

Holen Sie sich jede Datenquelle

Durchforsten Sie die drei Datenquellen und konvertieren Sie sie einmal in Datenrahmen.

url_map = {'infection': url_infection,
           'deaths': url_deaths,
           'recover': url_recover}
df_house = {}

for _k, _url in url_map.items():
    _body_csv = cr.fetch(_url)
    df_house[_k] = pd.read_csv(_body_csv)

df_house ist ein Wörterbuch, in dem drei Datenrahmen gespeichert sind. Der Inhalt ist wie folgt.

Tabellenstrukturkonvertierung

Vorbereiten einer Funktion zum Konvertieren in einen Datumstyp

Zeitreihenspalten haben ein Format wie "3/27/20" und können nicht wie bei Pythons "dateutil.parser.parse" konvertiert werden. Es ist schlammig, aber sobald wir eine Funktion haben, um es in das Standardformat "JJJJ-mm-TT" zu konvertieren.

def transform_date(s):
    """
    '3/15/20'Datum formatieren'2020-03-15'mögen'YYYY-mm-dd'In Format konvertieren
    """
    _chunk = str(s).split('/')
    return '20{year}-{month:02d}-{day:02d}'.format(year=_chunk[2], month=int(_chunk[0]), day=int(_chunk[1]))

Konvertieren Sie jeden Datenrahmen

Konvertiert Zeitreihenspalten in Zeilen in jedem der drei Datenrahmen. Konvertieren Sie die Spalte "Datum" in eine Zeitreihe.

df_buffer_house = {}
for _k, _df in df_house.items():
    df_buffer_house[_k] = {'Province/State':[], 
                           'Country/Region':[],
                           'date': [],
                           _k: []}
    _col_dates = _df.columns[4:]
    for _k_date in tqdm(_col_dates):
        for _idx, _r in _df.iterrows():
            df_buffer_house[_k]['Province/State'].append(_r['Province/State'])
            df_buffer_house[_k]['Country/Region'].append(_r['Country/Region'])
            df_buffer_house[_k]['date'].append(transform_date(_k_date))
            df_buffer_house[_k][_k].append(_r[_k_date])

Bei der Ausführung auf dem Jupyter-Notizbuch wird die Konvertierung fortgesetzt, während der Fortschrittsbalken wie unten gezeigt angezeigt wird.

100%|██████████████████████████████████████████| 72/72 [00:05<00:00, 12.37it/s]
100%|██████████████████████████████████████████| 72/72 [00:05<00:00, 12.89it/s]
100%|██████████████████████████████████████████| 72/72 [00:05<00:00, 13.27it/s]

Die Struktur der drei Datenrahmen ist viel besser geworden, daher muss ich sie nur kombinieren, aber es gibt eine Einschränkung.

In der Anzahl der Infizierten ("Infektion") und der Anzahl der Todesfälle ("Todesfälle") werden mehrere "Provinzen / Bundesstaaten" erfasst, in der Anzahl der Heilungen ("Genesung") wird dies jedoch als Ländereinheit erfasst. Es gibt. Beispiel) Kanada

Daher ist es notwendig, jeden Datenrahmen nach Land zu aggregieren und dann zu kombinieren.

df_integrated = pd.DataFrame()
col_integrated = ['Country/Region', 'date']
df_chunk = {}
for _k, _df_dict in df_buffer_house.items():
    _df_raw = pd.DataFrame.from_dict(_df_dict)
    # 'Country/Region'Aggregieren nach
    _df_grouped_buffer = {'Country/Region':[], 'date':[] , _k:[]}
    for _idx, _grp in tqdm(_df_raw.groupby(col_integrated)):
        _df_grouped_buffer['Country/Region'].append(_idx[0])
        _df_grouped_buffer['date'].append(_idx[1])
        _df_grouped_buffer[_k].append(_grp[_k].sum())
    df_chunk[_k] = pd.DataFrame.from_dict(_df_grouped_buffer)    
    
df_integrated = df_chunk['infection'].merge(df_chunk['deaths'], on=col_integrated, how='outer')
df_integrated = df_integrated.merge(df_chunk['recover'], on=col_integrated, how='left')

Ich werde das machen.

100%|██████████████████████████████████| 13032/13032 [00:08<00:00, 1621.81it/s]
100%|██████████████████████████████████| 13032/13032 [00:08<00:00, 1599.91it/s]
100%|██████████████████████████████████| 13032/13032 [00:07<00:00, 1647.02it/s]

Funktionsprüfung

Mal sehen, ob das im vorherigen Beispiel erwähnte Kanada in richtige Daten konvertiert wurde. notebook_confirm_df_integrated_20200406.png

Klingt okay! Es gab keine Anzeichen dafür, dass in Nan viele Aufzeichnungen fehlten, und wir konnten bestätigen, dass sich die Zahlen in chronologischer Reihenfolge änderten!

Analysebeispiel mit konvertierten statistischen Daten

Ich möchte ein Beispiel für einen Analysecode vorstellen, der die statistischen Daten des neuen Coronavirus verwendet, die durch diese Konvertierung erhalten wurden.

Berechnung der Lebensrettungsrate und des Infektionsendes

Berechnung der Lebensrettungsrate

Ich möchte die "Lebensrettungsrate" als das Verhältnis der Anzahl der geheilten Patienten ("Total Recovered Cases") zur Anzahl der Patienten, die die Behandlung abgeschlossen haben ("Closed Cases") (*) definieren.

Resuce Ratio = \ frac {Total Recovered (Anzahl der geheilten Patienten)} {Closed Cases (Anzahl der Patienten, die die Behandlung abgeschlossen haben)}

Berechnung des Infektionsabbruchs

Diese Zahl zeigt, wie nahe die Infektion in jedem Land am Ende ist. Es zeigt das Verhältnis der Anzahl der behandelten Patienten zur Gesamtzahl der infizierten Personen.

Phase Position = \ frac {Geschlossener Fall (Anzahl der Patienten, die die Behandlung abgeschlossen haben)} {Gesamtfall (kumulierte Anzahl infizierter Personen)}

Phase Position nimmt einen Wert zwischen 0.0 und 1.0 an. Je näher es an "0.0" liegt, desto früher ist die Infektionsphase. Je näher es an "1.0" liegt, desto mehr befindet sich die Infektionsphase im Endstadium.

Beispiel für einen Berechnungscode

df_grouped = df_integrated
df_grouped['date'] = pd.to_datetime(df_grouped['date'])

#Berechnung der Lebensrettungsrate
df_grouped['rescue_ratio'] = df_grouped['recover']/(df_grouped['recover'] + df_grouped['deaths'])
df_grouped['rescue_ratio'] = df_grouped['rescue_ratio'].fillna(0)

#Berechnung des Infektionsabbruchs
#Anzahl der Patienten, die die Behandlung abgeschlossen haben=Anzahl der geheilten Patienten+Anzahl der verstorbenen Patienten
df_grouped['phase_position'] = (df_grouped['recover'] + df_grouped['deaths'])/df_grouped['infection']

Bestätigung des Berechnungsergebnisses

Lassen Sie uns die Berechnungsergebnisse am Beispiel der USA überprüfen. Dann wird der folgende Datenrahmen angezeigt.   notebook_code_sample_result_rescue_ratio_20200406.png

Die Vereinigten Staaten befinden sich noch in einem frühen Stadium der Infektion, und obwohl sich die Lebensrettungsrate erholt, ist ersichtlich, dass die Situation immer noch schwerwiegend ist.

Zusammenfassung und Einführung von Analyseeinträgen

Daher habe ich den Code zur Vorbereitung der Analyse der statistischen Daten des neuen Koronavirus eingeführt. Statistische Daten von der Johns Hopkins University sind eine der Datenquellen, die derzeit weltweit Aufmerksamkeit erregen. Ich hoffe, dass Sie Informationen durch Ausprobieren Ihrer verschiedenen Analyseideen aktiv verbreiten. Überlegen!

Beginnen wir also mit dem Anfang und möchte abschließend den neuen Koronaanalyse-Eintrag vorstellen, den ich geschrieben habe.

Recommended Posts

Ich habe versucht, die statistischen Daten der neuen Corona mit Python abzurufen und zu analysieren: Daten der Johns Hopkins University
Ich habe versucht, CloudWatch-Daten mit Python abzurufen
Ich habe Python satt, also habe ich versucht, die Daten mit nehan zu analysieren (ich möchte sogar mit Corona live gehen) - Teil 2)
Ich habe Python satt, also habe ich versucht, die Daten mit nehan zu analysieren (ich möchte sogar mit Corona live gehen) - Teil 1)
Ich habe versucht, den Authentifizierungscode der Qiita-API mit Python abzurufen.
Ich habe versucht, die Beschleunigung von Python durch Cython zu verifizieren und zu analysieren
Ich habe versucht, die Standardrolle neuer Mitarbeiter mit Python zu optimieren
Ich habe versucht, die Filminformationen der TMDb-API mit Python abzurufen
Ich habe versucht, die Literatur des neuen Corona-Virus mit Python automatisch an LINE zu senden
Ich habe versucht, die Entropie des Bildes mit Python zu finden
Ich habe versucht, das Artikel-Update des Livedoor-Blogs mit Python und Selen zu automatisieren.
Ich habe versucht, die Verarbeitungsgeschwindigkeit mit dplyr von R und pandas von Python zu vergleichen
Ich habe versucht, die Daten des Fußballturniers der FIFA Fussball-Weltmeisterschaft Russland mit Fußball zu analysieren
[Pandas] Ich habe versucht, Verkaufsdaten mit Python zu analysieren. [Für Anfänger]
Ich habe versucht, die Effizienz der täglichen Arbeit mit Python zu verbessern
PhytoMine-I hat versucht, mit Python die genetischen Informationen der Pflanze zu erhalten
Aktienkurs mit "neuer Corona" gesunken? Ich habe versucht, den durchschnittlichen Aktienkurs von Nikkei durch Web-Scraping zu ermitteln
Ich habe versucht, die Anzahl der im Inland infizierten Menschen der neuen Korona mit einem mathematischen Modell vorherzusagen
Ich habe versucht, die erste Frage der Mathematik-Aufnahmeprüfung 2019 der Universität Tokio mit Python Sympy zu lösen
(Python) Ich habe versucht, 1 Million Hände zu analysieren ~ Ich habe versucht, die Anzahl der AA ~ zu schätzen
Ich habe versucht, die Negativität von Nono Morikubo zu analysieren. [Vergleiche mit Posipa]
Ich habe versucht, das Verhalten des neuen Koronavirus mit dem SEIR-Modell vorherzusagen.
Ich habe versucht, die Neujahrskarte selbst mit Python zu analysieren
Ich habe versucht, die Daten mit Zwietracht zu speichern
Ich habe versucht, die Tweets von JAWS DAYS 2017 mit Python + ELK einfach zu visualisieren
[Einführung in Python] So erhalten Sie den Datenindex mit der for-Anweisung
Ich habe versucht, mit Blenders Python script_Part 01 zu beginnen
Ich habe versucht, eine CSV-Datei mit Python zu berühren
Ich habe versucht, mit Blenders Python script_Part 02 zu beginnen
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
[Python] Ich habe versucht, Json von Tintenfischring 2 zu bekommen
Ich habe versucht, die String-Operationen von Python zusammenzufassen
[Python & SQLite] Ich habe den erwarteten Wert eines Rennens mit Pferden im 1x-Gewinnbereich ① analysiert
Ich habe versucht, die Eigenschaften der neuen Informationen über mit dem Corona-Virus infizierte Personen mit Wordcloud zu visualisieren
[New Corona] Ist der nächste Höhepunkt im Dezember? Ich habe die Trendanalyse mit Python versucht!
Ich habe versucht, die Laufdaten des Rennspiels (Assetto Corsa) mit Plotly zu visualisieren
Ich wollte nur die Daten des gewünschten Datums und der gewünschten Uhrzeit mit Django extrahieren
Beim 15. Offline-Echtzeitversuch habe ich versucht, das Problem des Schreibens mit Python zu lösen
Ich möchte Daten mit Python analysieren können (Teil 3)
Ich habe versucht, das Bild mit Python + OpenCV "gammakorrektur" zu machen
Ich habe versucht zu simulieren, wie sich die Infektion mit Python ausbreitet
Ich habe versucht, die Standortinformationen des Odakyu-Busses zu erhalten
Ich habe versucht, mit Python faker verschiedene "Dummy-Daten" zu erstellen
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich möchte Daten mit Python analysieren können (Teil 1)
Ich möchte Daten mit Python analysieren können (Teil 4)
Befreien Sie sich mit Python und regulären Ausdrücken von schmutzigen Daten
Ich möchte Daten mit Python analysieren können (Teil 2)
[Python] Ich habe versucht, Tweets über Corona mit WordCloud zu visualisieren
Ich möchte die Natur von Python und Pip kennenlernen
[Python] Ich habe versucht, Daten mit der API von Wikipedia zu sammeln
Ich habe versucht, die Unterschiede zwischen Java und Python aufzuzählen
Ich habe versucht, die Benutzeroberfläche neben Python und Tkinter dreiäugig zu gestalten
Holen Sie sich zusätzliche Daten zu LDAP mit Python (Writer und Reader)
[Einführung in Python] So erhalten Sie Daten mit der Funktion listdir
Holen Sie sich die Quelle der Seite unbegrenzt mit Python zu laden.
Ich habe versucht, die Punktgruppendaten-DB der Präfektur Shizuoka mit Vue + Leaflet anzuzeigen