J'ai essayé d'obtenir et d'analyser les données statistiques de la nouvelle Corona avec Python: données de l'Université John's Hopkins

introduction

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

covid19_rescue_ratio_japan_europe_us_20200401.png

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.

Téléchargement et traitement des données

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. timelined_df_sample_jhuniv_20200406.png

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.

Implémentation de classe Crawler

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)

divers paramètres

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'

Obtenez chaque source de données

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 notebook_confirm_df_deaths_20200406.png

Conversion de structure de table

Préparation d'une fonction à convertir en type de date

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

Convertir chaque trame de données

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]

Contrôle de fonctionnement

Voyons si le Canada mentionné dans l'exemple précédent a été converti en données appropriées. notebook_confirm_df_integrated_20200406.png

Ç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!

Exemple d'analyse utilisant des données statistiques converties

Je voudrais vous présenter un exemple de code d'analyse utilisant les données statistiques du nouveau coronavirus obtenues par cette conversion.

Calcul du taux de survie et de la fin de l'infection

Calcul du taux de sauvetage

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») (*).

Resuce Ratio = \ frac {Total récupérés (nombre de patients guéris)} {Cas fermés (nombre de patients qui ont terminé le traitement)}

Calcul de l'arrêt de l'infection

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.

Phase Position = \ frac {Cas clos (nombre de patients ayant terminé le traitement)} {Nombre total de cas (nombre cumulé 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.

Exemple de code de calcul

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']

Confirmation du résultat du calcul

Vérifions les résultats du calcul en utilisant les États-Unis comme exemple. Ensuite, la trame de données suivante sera affichée.   notebook_code_sample_result_rescue_ratio_20200406.png

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.

Résumé et introduction des entrées d'analyse

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

J'ai essayé d'obtenir et d'analyser les données statistiques de la nouvelle Corona avec Python: données de l'Université John's Hopkins
J'ai essayé d'obtenir des données CloudWatch avec Python
J'en ai marre de Python, alors j'ai essayé d'analyser les données avec nehan (je veux aller vivre même avec Corona) -Partie 2)
J'en ai marre de Python, alors j'ai essayé d'analyser les données avec nehan (je veux aller vivre même avec Corona) -Partie 1)
J'ai essayé d'obtenir le code d'authentification de l'API Qiita avec Python.
J'ai essayé de vérifier et d'analyser l'accélération de Python par Cython
J'ai essayé de rationaliser le rôle standard des nouveaux employés avec Python
J'ai essayé d'obtenir les informations sur le film de l'API TMDb avec Python
J'ai essayé d'envoyer automatiquement la littérature du nouveau virus corona à LINE avec Python
J'ai essayé de trouver l'entropie de l'image avec python
J'ai essayé d'automatiser la mise à jour de l'article du blog Livedoor avec Python et sélénium.
J'ai essayé de comparer la vitesse de traitement avec dplyr de R et pandas de Python
J'ai essayé d'analyser les données du tournoi de football de la Coupe du monde de football en Russie avec l'action de football
[Pandas] J'ai essayé d'analyser les données de ventes avec Python [Pour les débutants]
J'ai essayé d'améliorer l'efficacité du travail quotidien avec Python
PhytoMine-I a essayé d'obtenir les informations génétiques de la plante avec Python
Le cours de l'action a chuté avec "nouvelle Corona"? J'ai essayé d'obtenir le cours moyen de l'action Nikkei par grattage Web
J'ai essayé de prédire le nombre de personnes infectées au niveau national de la nouvelle corona avec un modèle mathématique
J'ai essayé de résoudre la première question de l'examen d'entrée en mathématiques 2019 de l'Université de Tokyo avec python sympy
(Python) J'ai essayé d'analyser 1 million de mains ~ J'ai essayé d'estimer le nombre d'AA ~
J'ai essayé d'analyser la négativité de Nono Morikubo. [Comparer avec Posipa]
J'ai essayé de prédire le comportement du nouveau virus corona avec le modèle SEIR.
J'ai essayé d'analyser la carte du Nouvel An par moi-même en utilisant python
J'ai essayé de sauvegarder les données avec discorde
J'ai essayé de visualiser facilement les tweets de JAWS DAYS 2017 avec Python + ELK
[Introduction à Python] Comment obtenir l'index des données avec l'instruction for
J'ai essayé de démarrer avec le script python de blender_Part 01
J'ai essayé de toucher un fichier CSV avec Python
J'ai essayé de démarrer avec le script python de blender_Partie 02
J'ai essayé de résoudre le problème avec Python Vol.1
[Python] J'ai essayé d'obtenir Json de squid ring 2
J'ai essayé de résumer les opérations de chaîne de Python
[Python & SQLite] J'ai analysé la valeur attendue d'une course avec des chevaux dans la fourchette 1x win ①
J'ai essayé de visualiser les caractéristiques des nouvelles informations sur les personnes infectées par le virus corona avec wordcloud
[New Corona] Le prochain pic est-il en décembre? J'ai essayé l'analyse des tendances avec Python!
J'ai essayé de visualiser les données de course du jeu de course (Assetto Corsa) avec Plotly
Je voulais juste extraire les données de la date et de l'heure souhaitées avec Django
Le 15e temps réel hors ligne, j'ai essayé de résoudre le problème de l'écriture avec python
Je veux pouvoir analyser des données avec Python (partie 3)
J'ai essayé la "correction gamma" de l'image avec Python + OpenCV
J'ai essayé de simuler la propagation de l'infection avec Python
J'ai essayé d'obtenir les informations de localisation du bus Odakyu
J'ai essayé de créer diverses "données factices" avec Python faker
J'ai essayé de trouver la moyenne de plusieurs colonnes avec TensorFlow
Je veux pouvoir analyser des données avec Python (partie 1)
Je veux pouvoir analyser des données avec Python (partie 4)
Débarrassez-vous des données sales avec Python et les expressions régulières
Je veux pouvoir analyser des données avec Python (partie 2)
[Python] J'ai essayé de visualiser des tweets sur Corona avec WordCloud
Je veux connaître la nature de Python et pip
[Python] J'ai essayé de collecter des données en utilisant l'API de wikipedia
J'ai essayé d'énumérer les différences entre java et python
J'ai essayé de créer une interface graphique à trois yeux côte à côte avec Python et Tkinter
Obtenez des données supplémentaires vers LDAP avec python (Writer et Reader)
[Introduction à Python] Comment obtenir des données avec la fonction listdir
Récupérez la source de la page à charger indéfiniment avec python.
J'ai essayé d'afficher les données du groupe de points DB de la préfecture de Shizuoka avec Vue + Leaflet