Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

Exercice - niveau intermédiaire

Où on vous invite à visualiser des données liées au coronavirus.

Bon honnêtement à ce stade je devrais m’arrêter là, et vous laisser vous débrouiller complètement :)

Mais juste pour vous donner éventuellement des idées - voici des suggestions sur comment on peut s’y prendre.

import matplotlib.pyplot as plt
%matplotlib ipympl

Le dashboard de Johns Hopkins

Le département Center for Systems Science and Engineering (CSSE), de l’Université Johns Hopkins, publie dans un dépôt github https://github.com/CSSEGISandData/COVID-19 les données dans un format assez brut. C’est très détaillé et touffu :

# le repo github
official_url = "https://github.com/CSSEGISandData/COVID-19"

Le README mentionne aussi un dashboard, qui permet de visualiser les données en question. Il me semble que l’URL change tous les jours au fur et à mesure des updates, mais voici une capture d’écran pour donner une idée :

Ce qu’on vous propose de faire, pour s’amuser, c’est quelque chose d’anologue - en version beaucoup plus modeste naturellement - pour pouvoir visualiser facilement telle ou telle courbe.

Exercice 1 : un jeu de données intéressant

Pour ma part j’ai préféré utiliser un dépôt de seconde main, qui consolide en fait les données du CSSE, pour les exposer dans un seul fichier au jormat JSON. Cela est disponible dans ce second dépôt github https://github.com/pomber/covid19; la sortie de ce processus est mise à jour quotidiennement - à l’heure où j’écris ce texte en Mai 2020 - et est disponible (voir le README) à cette URL https://pomber.github.io/covid19/timeseries.json.

abridged_url = "https://pomber.github.io/covid19/timeseries.json"

Comme c’est du JSON, on peut charger ces données en mémoire comme ceci

# pour aller chercher l'URL
import requests

# pour charger le JSON en objets Python
import json
# allons-y
req = requests.get(abridged_url)
# en utilisant la property `text` on décode en Unicode
encoded = req.text
# que l'on peut décoder
decoded = json.loads(encoded)
## un peu de vérification
# si ceci n'est pas True, il y a un souci 
# avec le réseau ou cette URL
req.ok
True

Les données sont indexées par pays

# voici ce qu'on obtient
type(decoded)
dict
# une clé
list(decoded.keys())[0]
'Afghanistan'

Les données d’un pays sont dans un format très simple, une liste

france_data = decoded['France']
type(france_data)
list
france_data[0]
{'date': '2020-1-22', 'confirmed': 0, 'deaths': 0, 'recovered': 0}
france_data[-1]
{'date': '2023-3-9', 'confirmed': 39866718, 'deaths': 166176, 'recovered': 0}

Homogénéité par pays

Ce que j’ai constaté, et je suppose qu’on peut plus ou moins compter sur cette bonne propriété, c’est que

us_data = decoded['US']
us_data[0]
{'date': '2020-1-22', 'confirmed': 1, 'deaths': 0, 'recovered': 0}
us_data[-1]
{'date': '2023-3-9', 'confirmed': 103802702, 'deaths': 1123836, 'recovered': 0}
len(france_data) == len(us_data)
True
# nombre de pays
len(decoded)
201
# nombre de jours
len(france_data)
1143

Un sujet possible (#1)

Vous pourriez interpréter ces données pour créer un dashbord dans lequel on peut choisir :

et en fonction, afficher deux courbes qui montrent sur cette période

Selon votre envie, toutes les variantes sont possibles, pour simplifier (commencez sans dashboard), ou complexifier, comme vous le sentez. Pour revenir sur le dashboard de CSSE, on pourrait penser à utiliser un package comme folium pour afficher les résultats sur une carte du Monde; cela dit je vous recommande de bien réfléchir avant de vous lancer là-dedans, car c’est facile de se perdre, et en plus la valeur ajoutée n’est pas forcément majeure…

un mot par rapport à pandas

Il y a plein d’approches possibles, et toutes raisonnables :

La courbe d’apprentissage de pandas est parfois jugée un peu raide; c’est à vous de voir ce qui vous convient le mieux. Ce qui est clair c’est que quand on maitrise bien, et une fois qu’on a construit une grosse dataframe avec toutes les données, on dispose avec d’un outil surpuissant pour faire plein de choses en très peu de lignes.

Mais pour bien maitriser il faut avoir l’occasion de pratiquer fréquemment, ce n’est pas forcément le cas de tout le monde (ce n’est pas le mien par exemple), donc à chacun de choisir son approche.

Pour illustrer une approche disons hybride, voici ce qui pourrait être un début de mise en forme des données pour un pays et une caractéristique (parmi les 3 exposées dans ce jeu de donnéees)

import numpy as np
import pandas as pd

def extract_last_days(countryname, value, days):
    country = decoded[countryname]
    cropped = country[-(days):]
    dates = np.array([chunk['date'] for chunk in cropped])
    # take one more than requested for computing deltas including
    # for the first day (we need the value the day before the first day)
    cropped = country[-(days+1):]
    values = np.array([chunk[value] for chunk in cropped])
    # shift one day so we get the value from the day before
    shifted = np.roll(values, 1)
    # the daily increase; ignore first value which is wrong
    deltas = (values - shifted)[1:]
    relevant = values[1:]
    # all 3 arrays dates, deltas and relevant have the same shape
    data = {'dates': dates, value: relevant, 'daily': deltas}
    return pd.DataFrame(data=data)
    

df1 = extract_last_days('France', 'deaths', 45)
df1.plot();
Loading...

Exercice 2: idem mais à partir d’un autre jeu de données

Je vous signale une autre source de données, dans ce repo git https://github.com/owid/covid-19-data/tree/master/public/data; les données cette fois-ci sont au format excel, et publiées à cette adresse

alt_url = 'https://covid.ourworldindata.org/data/owid-covid-data.csv'

Comment partager ?

Je ne publie pas de corrigés pour cet exercice.

J’invite ceux d’entre vous qui le souhaitent à nous faire passer leur code; le plus simple étant de les ajouter dans le repo github dit de récréation, à cet endroit https://github.com/flotpython/recreation/tree/master/corona-dashboards.