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.)
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.
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.
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.
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)
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'
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.
Datenrahmen der bestätigten Anzahl infizierter Personen
Datenrahmen der Todesfälle
Datenrahmen der Anzahl der Heiler
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]))
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]
Mal sehen, ob das im vorherigen Beispiel erwähnte Kanada in richtige Daten konvertiert wurde.
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!
Ich möchte ein Beispiel für einen Analysecode vorstellen, der die statistischen Daten des neuen Coronavirus verwendet, die durch diese Konvertierung erhalten wurden.
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.
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
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.
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']
Lassen Sie uns die Berechnungsergebnisse am Beispiel der USA überprüfen. Dann wird der folgende Datenrahmen angezeigt.
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.
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