Je posterai sur Quiita après un long moment. Récemment, j'ai commencé à analyser des données statistiques sur la pandémie du nouveau coronavirus (comme travail personnel, pas comme travail?). Et j'ai posté quelques articles sur mon blog.
Par exemple, un graphique qui trace la transition de série chronologique du taux de sauvetage est publié à la suite de l'analyse des données. (Bien que les critères de comptage des personnes infectées diffèrent d'un pays à l'autre, les données montrent que le Japon a une excellente pratique médicale dans le monde.)
Cette fois, je voudrais partager le code de préparation pour l'analyse des nouvelles données statistiques sur les coronavirus fournies par l'Université Johns Hopkins.
Avec ce code, vous pourrez générer une trame de données pour les nouvelles statistiques de Coronavirus et être prêt à travailler sur votre analyse de données.
Nous espérons que vous apporterez une petite contribution si vous l'utilisez.
L'Université Johns Hopkins publie des données statistiques (et par ordre chronologique!) Des nouvelles infections à coronavirus dans le monde sur github. --Repost: Données publiques de l'Université Johns Hopkins
Le flux global de traitement consiste à utiliser ʻurllib` pour obtenir les données et ensuite les traiter. Les données statistiques publiées par l'Université de John's Hopkins comprennent trois choses: «confirmé», «décès» et «guéri». En outre, il existe des enregistrements qui enregistrent la granularité jusqu'à l'unité régionale de chaque pays. Cette fois, nous allons résumer et analyser par pays.
Cependant, il y a une mise en garde. Même s'il s'agit d'une série chronologique, il existe des dizaines de colonnes pour chaque date dans le sens de la colonne, nous devons donc la convertir en une structure facile à utiliser.
Par exemple, il s'agit de la trame de données. (Dans le cas du nombre d'infections confirmées) Vous pouvez voir que les colonnes qui ressemblent à des dates sont alignées.
Si vous restructurez les colonnes de séries chronologiques dans le sens des lignes et les agrégez par pays, vous pouvez vous installer dans un bloc de données orthodoxe facile à gérer.
Cette fois, je l'ai implémenté sur Jupyter Notebook. Donc, je pense que cela fonctionnera si vous collez le code publié dans l'entrée tel quel et l'exécutez dans l'ordre du haut.
Définissez une classe de robot. Le nom est juste ça. Il semble qu'il sera réutilisé dans d'autres cahiers, alors j'en ai fait une classe pour le moment.
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):
"""
Classe du robot d'exploration
"""
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):
"""
Spécifiez l'URL et exécutez la requête HTTP.
:param url:
:return:Demande de résultat(html)
"""
req = urllib.request.Request(url, headers={'User-Agent': self._ua})
return urllib.request.urlopen(req)
Définissez la déclaration de l'instance du robot d'exploration et l'URL de chaque source de données.
#Instance du robot d'exploration
cr = Crowler()
#Données chronologiques de la transition de la personne infectée
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'
#Données chronologiques des décès
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'
#Données chronologiques des guérisseurs
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'
Analysez les trois sources de données et convertissez-les une fois en blocs de données.
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
est un dictionnaire qui stocke trois trames de données.
Le contenu est le suivant.
--Base de données des décès
Les colonnes de séries temporelles ont un format comme «3/27/20» et ne peuvent pas être converties comme elles le sont avec «dateutil.parser.parse» de Python.
C'est flou, mais une fois que nous avons une fonction pour le convertir au format standard YYYY-mm-dd
.
def transform_date(s):
"""
'3/15/20'Format de la date'2020-03-15'comme'YYYY-mm-dd'Convertir au format
"""
_chunk = str(s).split('/')
return '20{year}-{month:02d}-{day:02d}'.format(year=_chunk[2], month=int(_chunk[0]), day=int(_chunk[1]))
Convertit les colonnes de séries chronologiques en lignes dans chacune des trois trames de données.
Convertissez la colonne nommée date
pour avoir une série chronologique.
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])
Lorsqu'elle est exécutée sur le Jupyter Notebook, la conversion se poursuit tout en affichant la barre de progression comme indiqué ci-dessous.
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]
La structure des trois trames de données est devenue bien meilleure, je n'ai donc plus qu'à les combiner, mais il y a une mise en garde.
Dans le nombre d'infections («infection») et le nombre de décès («décès»), plusieurs «provinces / États» sont enregistrés, mais dans le nombre de guérisons («rétablissement»), il est enregistré comme une unité de pays. Il y a.
Exemple) Canada
Par conséquent, il est nécessaire d'agréger chaque base de données par pays, puis de les combiner.
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'Agréger par
_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')
Je le ferai.
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]
Voyons si le Canada mentionné dans l'exemple précédent a été converti en données appropriées.
Ça me va! Il n'y avait aucun signe qu'il y avait beaucoup d'enregistrements manquants à Nan, et nous avons pu confirmer que les nombres changeaient dans l'ordre chronologique!
Je voudrais vous présenter un exemple de code d'analyse utilisant les données statistiques du nouveau coronavirus obtenues par cette conversion.
Ici, je voudrais définir le «taux de sauvetage» comme le rapport du nombre de patients qui ont été guéris («Total des cas guéris») au nombre de patients qui ont terminé le traitement («Cas clos») (*).
C'est un nombre qui montre à quel point l'infection dans chaque pays est proche de la fin. Il montre le rapport entre le nombre de patients traités et le nombre total de personnes infectées.
«Position de phase» prend une valeur entre «0,0 et 1,0». Plus il est proche de «0,0», plus la phase d'infection est précoce. Plus il est proche de "1,0", plus la phase d'infection est dans les derniers stades.
df_grouped = df_integrated
df_grouped['date'] = pd.to_datetime(df_grouped['date'])
#Calcul du taux de sauvetage
df_grouped['rescue_ratio'] = df_grouped['recover']/(df_grouped['recover'] + df_grouped['deaths'])
df_grouped['rescue_ratio'] = df_grouped['rescue_ratio'].fillna(0)
#Calcul de l'arrêt de l'infection
#Nombre de patients ayant terminé le traitement=Nombre de patients guéris+Nombre de patients décédés
df_grouped['phase_position'] = (df_grouped['recover'] + df_grouped['deaths'])/df_grouped['infection']
Vérifions les résultats du calcul en utilisant les États-Unis comme exemple. Ensuite, la trame de données suivante sera affichée.
Les États-Unis en sont encore aux premiers stades de l'infection, et bien que le taux de survie se rétablisse, on peut constater que la situation est toujours grave.
J'ai donc introduit le code de préparation pour l'analyse des données statistiques du nouveau virus corona. Les données statistiques de l'Université John's Hopkins sont l'une des sources de données qui attirent actuellement l'attention dans le monde, j'espère donc que vous diffuserez activement des informations par essais et erreurs sur vos différentes idées d'analyse. pense!
Commençons donc par le début et je voudrais conclure en présentant la nouvelle entrée d'analyse corona que j'ai écrite.
Recommended Posts