Niveau
Moyen
Env.
Local (Windows), Local (Linux)
Code
Python
Libs
yaml, requests, time, pandas, datetime
Sources

Covid-19 : Récupérer les données brutes officielles

Confinés, nous suivons tous l’évolution de ce satané virus. Non ? Ce que je vous propose au travers de cet article c’est de récupérer par vous même les données officielles de Santé Publique ainsi que du ministère de la santé afin de faire vos propres analyses. Ces données sont déposées dans github : https://github.com/opencovid19-fr/data mais elles sont au format YAML et nécessitent quelques retouches pour être utilisable.

Format de données YAML

Ce format est un format assez simple d’utilisation, une sorte de json très simplifié qui ressemble à des données structurées via de l’indentation. Voici un exemple de fichier :

YAML
date: "2020-01-24"
source:
  nom: Ministère des Solidarités et de la Santé
  url: https://solidarites-sante.gouv.fr/IMG/pdf/200124-cp_coronavirus.pdf
  archive: https://web.archive.org/web/20200322183046/https://solidarites-sante.gouv.fr/IMG/pdf/200124-cp_coronavirus.pdf
donneesNationales:
  casConfirmes: 3
  hospitalises: 3
  deces: 0
donneesRegionales:
  - nom: Île-de-France
    code: REG-11
    casConfirmes: 2
    hospitalises: 2
  - nom: Nouvelle-Aquitaine
    code: REG-75
    casConfirmes: 1
    hospitalises: 1

Heureusement, et comme souvent Python fournit une librairie pour gérer ce type de format automatiquement et le convertir dans un format utilisable simplement : JSON.

Pour ce faire, il faut installer le package :

ShellSession
pip install yaml

Ensuite il suffira de lire le fichier avec la méthode :

Python
json_data = yaml.load(, Loader=yaml.FullLoader)

La valeur de json_data est retournée au format JSON.

Récupération des données brutes

Nous allons récupérer les données directement en interrogeant Github. Pour ce faire il faut interroger Github directement sur les données (raw) dans : https://raw.githubusercontent.com/opencovid19-fr/data/master/sante-publique-france/

Chaque fichier est au format YYYY-MM-DD.yaml il faudra donc balayer toutes les dates depuis le début jusqu’à aujourd’hui.

Python
r = requests.get('https://raw.githubusercontent.com/opencovid19-fr/data/master/sante-publique-france/2020-03-24.yaml')
if (r.status_code==200):
    print (yaml.load(r.text, Loader=yaml.FullLoader))

Créer le nom de fichier à récupérer n’a rien de bien complexe, il suffit de récupérer toutes les dataes les unes après les autres et de recomposer le nom de fichier dans GitHub:

Python
hier = date.today() + timedelta(-1)
shier = hier.strftime("%Y-%m-%d")
fichier = 'https://raw.githubusercontent.com/opencovid19-fr/data/master/sante-publique-france/' + shier + '.yaml'

Si on veut récupérer le fichier d’hier, voici une petite fonction qui va le faire en quelques lignes :

Python
def RecupCovid19Hier():
    hier = date.today() + timedelta(-1)
    shier = hier.strftime("%Y-%m-%d")
    fichier = 'https://raw.githubusercontent.com/opencovid19-fr/data/master/sante-publique-france/' + shier + '.yaml'
    out = ""
    r = requests.get(fichier)
    if (r.status_code==200):
       out = yaml.load(r.text, Loader=yaml.FullLoader)
    return out

Récupérons les données san Santé Publique France

Les données ont été publiées à partir du 23 janvier 2020.

Voici la fonction qui va permettre de récupérer les données au travers des fichiers YAML (un par jour) via les principes expliqués ci-dessus.

Python
import yaml
import requests
import time
from datetime import datetime, timedelta, date
import pandas as pd
# INITIALISATION DE VARIABLES GLOBALES
sDateDebut = "2020-01-23"
sAujourdhui = date.today().strftime("%Y-%m-%d")
dDemarrageDate = datetime.fromisoformat(sDateDebut) 
cols = ['Date', 
        'FR Tot Cas Confirmés', 
        'FR Tot Décès', 
        'WW Tot Cas Confirmés', 
        'WW Tot Décès', 
        'Source',
        'FR Tot Guéris',
        'FR Tot Hospitalisés'
       ]
# FONCTIONS
def recupDataWithException2(_jsonout, _index1, _index2):
    try:
        data = _jsonout[_index1][_index2]
    except:
        data = 0
    return data
def AjouteSantePubliqueFrLigne(jsonout, df):
    df = df.append({
                    cols[0] : jsonout['date'] , 
                    cols[1] : recupDataWithException2(jsonout, 'donneesNationales', 'casConfirmes') , 
                    cols[2] : recupDataWithException2(jsonout, 'donneesNationales', 'deces'), 
                    cols[3] : recupDataWithException2(jsonout,'donneesMondiales', 'casConfirmes'),
                    cols[4] : recupDataWithException2(jsonout,'donneesMondiales', 'deces'),
                    cols[5] : 'sante-publique-france',
                    cols[6] : 0,
                    cols[7] : 0
                 } , 
                 ignore_index=True)
    return df
def ajouteLigneVide(df, madate):
    df = df.append({
                    cols[0] : madate , 
                    cols[1] : 0,
                    cols[2] : 0, 
                    cols[3] : 0,
                    cols[4] : 0,
                    cols[5] : 'no-data',
                    cols[6] : 0,
                    cols[7] : 0
                 } , 
                 ignore_index=True)
    return df
# RECUPERATION DONNEES SANTE PUBLIQUE FRANCE
def RecupereDonneesSantePubliqueFrance():
    print ('--> Démarrage du process')
    sDateParcours = sDateDebut
    i=1
    requesReturnCode=200
    yamls = pd.DataFrame()
    while (sDateParcours != sAujourdhui):
        myDate = dDemarrageDate + timedelta(days=i)
        sDateParcours = myDate.strftime("%Y-%m-%d")
        fichier = 'https://raw.githubusercontent.com/opencovid19-fr/data/master/sante-publique-france/' + sDateParcours + '.yaml'
        #print ('--> sante-publique-france / ', sDateParcours)
        req = requests.get(fichier)
        requesReturnCode = req.status_code
        if (requesReturnCode==200):
            yamlout = yaml.load(req.text, Loader=yaml.FullLoader)
            yamls = AjouteSantePubliqueFrLigne(yamlout, yamls)
        else:
            print ("(*) Pas de données pour ", myDate.strftime("%Y-%m-%d"))
            # ajoute une ligne vide
            yamls = ajouteLigneVide(yamls, myDate.strftime("%Y-%m-%d"))
        i=i+1
    print ('--> Fin du process')
    return yamls
    
data = RecupereDonneesSantePubliqueFrance()
data

Cette fonction retourne donc un dataframe Pandas qui contient les données de Santé Publique France.

Date 	FR Tot Cas Confirmés 	FR Tot Décès 	FR Tot Guéris 	FR Tot Hospitalisés 	Source 	WW Tot Cas Confirmés 	WW Tot Décès
0 	2020-01-24 	3.0 	0.0 	0.0 	0.0 	sante-publique-france 	897.0 	26.0
1 	2020-01-25 	3.0 	0.0 	0.0 	0.0 	sante-publique-france 	1329.0 	41.0
2 	2020-01-26 	3.0 	0.0 	0.0 	0.0 	sante-publique-france 	2026.0 	56.0
3 	2020-01-27 	3.0 	0.0 	0.0 	0.0 	sante-publique-france 	2820.0 	81.0
4 	2020-01-28 	4.0 	0.0 	0.0 	0.0 	sante-publique-france 	0.0 	0.0
... 	... 	... 	... 	... 	... 	... 	... 	...
64 	2020-03-28 	37575.0 	2314.0 	0.0 	0.0 	sante-publique-france 	591971.0 	27090.0
65 	2020-03-29 	0.0 	0.0 	0.0 	0.0 	no-data 	0.0 	0.0
66 	2020-03-30 	0.0 	0.0 	0.0 	0.0 	no-data 	0.0 	0.0
67 	2020-03-31 	0.0 	0.0 	0.0 	0.0 	no-data 	0.0 	0.0
68 	2020-04-01 	0.0 	0.0 	0.0 	0.0 	no-data 	0.0 	0.0
69 rows × 8 columns

Récupération des données du ministère de la santé

La récupération va suivre le même principe. Néanmoins ici on ne va pas créer un nouveau dataframe Pandas, nous allons plutôt enrichir les données déjà récupérées précédemment avec celles du ministère (on récupère notamment quelques informations supplémentaires comme le nombre de guéris, le nombre d’hospitalisation).

Voici la fonction qui récupère et enrichit le dataframe précédent :

Python
# RECUPERATION DONNEES SANTE PUBLIQUE FRANCE
def RecupereDonneesMinistereSante(yamls):
    i=1
    sDateParcours = sDateDebut
    print ('--> Démarrage du process')
    while (sDateParcours != sAujourdhui):
        myDate = dDemarrageDate + timedelta(days=i)
        sDateParcours = myDate.strftime("%Y-%m-%d")
        #print("Traintement date: ",  dateParcours)
        fichier = 'https://raw.githubusercontent.com/opencovid19-fr/data/master/ministere-sante/' + sDateParcours + '.yaml'
        req = requests.get(fichier)
        requesReturnCode = req.status_code
        if (requesReturnCode==200):
            yamlout = yaml.load(req.text, Loader=yaml.FullLoader)
            if (yamls[cols[5]][i-1] == "no-data"):
                print ("(*) Modifie les données manquantes pour la date du ", myDate.strftime("%Y-%m-%d"))
                # Modifie toute la ligne
                yamls.loc[i-1, cols[1]] = recupDataWithException2(yamlout, 'donneesNationales', 'casConfirmes')
                yamls.loc[i-1, cols[2]]  = recupDataWithException2(yamlout, 'donneesNationales', 'deces')
                yamls.loc[i-1, cols[3]]  = recupDataWithException2(yamlout, 'donneesMondiales', 'casConfirmes')
                yamls.loc[i-1, cols[4]]  = recupDataWithException2(yamlout, 'donneesMondiales', 'deces')
                yamls.loc[i-1, cols[5]]  = "ministere-sante"
            # Ajoute les nouveaux champs
            yamls.loc[i-1, cols[6]] = recupDataWithException2(yamlout, 'donneesNationales', 'hospitalises')
            yamls.loc[i-1, cols[7]] = recupDataWithException2(yamlout, 'donneesNationales', 'gueris')
        i=i+1
    print ('--> Fin du process')
    return yamls

Quelques finitions sur les données

Les données brutes récupérées sont des données de cumuls. Par ailleurs, on constate que certains jours n’ont pas été officiellements publiés (no-data). La conséquence est que les données présentent des « trous » ce qui est un peu genant pour des données de cumul. Nous allons combler ces trous :

Python
def Bouchetrous(yamls):
    # On reparcourre toutes les lignes déjà récupérées précédemment
    i=1
    for index, row in yamls.iterrows():
        if (yamls[cols[5]][i-1] == "no-data"):
            for j in [1, 2, 3, 4, 6, 7]:
                yamls.loc[i-1, cols[j]] = yamls[cols[j]][i-2] 
                #yamls[cols[j]][i-1] = yamls[cols[j]][i-2] 
        i += 1
    return yamls

Pour ceux qui veulent aller plus loin , il pourrait être aussi intéressant de « desaggréger » les données, ou faire d’autres opérations.

Le résultat ?

Voici un aperçu des données, qui malheureusement nous montrent que le pic de l’épidémie n’est pas encore atteint.

Vous pouvez récupérer le code complet sur GitHub.

Pour ceux que ça interresse je vais essayer de faire tourner la moulinette tous les jours et mettre les résutats dans un fichier csv sur GitHub.

Partager cet article

2 Replies to “Covid-19 : Récupérer les données brutes officielles”

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.