1. Covid-19 : Accès aux données
A l’heure des "fake news", ces fausses informations qui se répandent rapidement, il est important de vérifier en permanence l’exactitude des dépêches que nous recevons depuis divers supports, ce qui est loin d’être simple !
Les chercheurs de l’université Johns Hopkins ont dans ce but produit une carte qui permet de suivre et de visualiser les rapports sur l’épidémie en utilisant les données des Centres américains et chinois de contrôle et de prévention des maladies, de l’Organisation mondiale de la santé et d’autres sources. Au fur et à mesure de l’arrivée des rapports, la carte est actualisée avec le nombre total de cas confirmés, ainsi que ceux des décès et des guérisons. Chaque point rouge représente un foyer d’apparition de la maladie, dont la taille correspond à l’ampleur relative de contagion. En cliquant sur l’un d’entre eux, on obtient les informations relatives à la région.
-
Accès au site de l’université Johns Hopkins : https://systems.jhu.edu/
-
An interactive dashboard mapping the COVID-19 pandemic in real-time : https://systems.jhu.edu/research/public-health/ncov/
-
Accès aux données brutes sur leur espace github : https://github.com/CSSEGISandData/COVID-19
2. Objectif
Notre objectif est développer une application Python pour :
-
récupérer les données brutes de la propagation du virus au format csv,
-
les transformer au format json
-
les filtrer par pays,
-
Tracer un graphic de l’évolution de la propagation
3. Moyens
-
Utilisez votre environement de développement préféré (idle, pycharm, spyder, … ) ou travailler en ligne avec https://replit.com
-
Clonez le dépôt de code à compléter sur classeroom.github : https://classroom.github.com/a/q4bhhDkj
4. Téléchargement des données
4.1. Téléchargement manuel
En fouillant dans le dépôt github de l’université Johns Hopkins, vous trouverez les données brutes des cas de contamination, de décès et de guérison :
Comme vous pouvez le constater, les données sont présentées sous forme de fichier csv, facilitant ainsi leur traitement par un tableur comme Microsoft excel ou LibreOffice Calc.
Nous reviendrons sur se format plus loin.
Pour le moment, concentrons nous sur le téléchargement d’un des fichiers. Je vous propose de télécharger le fichier time_series_covid19_confirmed_global.csv
qui ressence les cas de contamination au quotidien depuis que les données épidémiologiques sont disponibles.
-
Pour télécharger le fichier, cliquez sur le lien du fichier, puis cliquez droit sur le bouton
Raw
et choisirEnregistrer la cible du lien sous …
. -
Ouvrez le fichier avec le tableur de votre choix. Il faut lui indiquer quel est le séparateur de champs, ici, c’est le caractère ",".
-
On peut maintenant utiliser notre tableur pour créer des graphique par exemple avec Excel :
Il est important ici de remarquer les noms des colonnes qui constitue le tableau. On y trouve :
|
4.2. Fonction de téléchargement
Pour accéder à un fichier en ligne, nous aurons besoin du module urllib.request
:
-
Ouvrez le fichier
covid19v1.py
qui contient le code à compléter. -
Complétez le code ci-dessous en vous aidant des indications contenues dans les commentaires. Faites un usage approprié de l’aide fournie en lien dans le code.
-
Exécutez le et constatez le téléchargement du fichier dans le même dossier que votre script.
Les fonctions
Remarque : L’utilisation de |
import urllib.request as urllib2
def download_file(url, file_name):
'''
Download a file from url and copy it localy with file_name as name
'''
try:
# open url passed in argument
file = urllib2.urlopen(___)
# open file for writing in binary mode
# https://docs.python.org/3/library/functions.html#open
with open(___, '___') as output:
# write in output the file read
output.___(file.___())
# OK : return true
return ___
except:
# Something is wrong : return false
return ___
# here the main code
if __name__ == '__main__':
# File name of datas
file = "time_series_19-covid-Confirmed.csv"
# where datas are located
url = ___
if download_file(url,file):
print(f'Téléchargement du fichier {file} terminé avec succès')
else:
print(f'Téléchargement du fichier {file} impossible')
5. Lire le fichier csv
Le but de cette partie est de procéder à une lecture des données contenues dans le fichier CSV, notamment la listes des pays pour lesquels on en dispose.
Un fichier CSV (Comma-Separated Values) est un fichier tableur, contenant des données sur chaque ligne séparés par un caractère de séparation (généralement une virgule, un point-virgule ou une tabulation). Le format CSV est un format de texte simple qui est utilisé dans de nombreux contextes lorsque de grandes quantités de données doivent être fusionnées sans être directement connectées les unes aux autres. L’extension de ce type de fichiers est .csv, et ils peuvent être utilisés entre différents outils informatiques et bases de données. Des tableurs tels qu’Excel (Microsoft) ou Calc (LibreOffice) sont capables d’importer et exporter des fichiers CSV. Toutefois, en raison de sa structure basique, le format de fichier CSV ne convient que pour des données structurées simples. |
Pour accéder manipuler un fichier CSV, nous aurons besoin du module csv
:
-
Ouvrez le fichier
covid19v2.py
qui contient le code à compléter. -
Complétez le code ci-dessous en vous aidant des indications contenues dans les commentaires. Faites un usage approprié de l’aide fournie en lien dans le code.
-
Exécutez le et constatez l’affichage de la liste des pays et régions pour lesquels on dispose de données épidémiologiques.
import urllib.request as urllib2
from covid19v1 import *
import csv
def read_CSV(file):
'''
Read a csv file and return :
- fields name as string in a list
- datas dictionary by countries in a list
'''
# datas is an empty list
datas = []
# open the file passed in argument as csvfile
# https://docs.python.org/3/library/csv.html#csv.reader
with open(file) as csvfile:
# Create a dictionnary with all datas
reader = csv.DictReader(____)
# each row in reader is a dictionary by country
for row in reader:
# add row in datas list
datas.___(___)
# return the list of dictionaries by countries
return datas
# here the main code
if __name__ == '__main__':
# File name of datas
file = "time_series_19-covid-Confirmed.csv"
# where datas are located
url = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid19_data/csse_covid19_time_series/time_series_covid19_confirmed_global.csv"
if download_file(url,file):
print(f'Téléchargement du fichier {file} terminé avec succès')
coutries = read_CSV(file)
print("liste des pays et régions recencés")
print("----------------------------------")
for row in coutries:
print(row['Province/State'], row['Country/Region'])
else:
print(f'Téléchargement du fichier {file} impossible')
6. Filtrage par pays
On souhaite ici écrire une fonction qui recherche un pays ou une région pour ne fournir que ses propres données.
-
Ouvrez le fichier
covid19v3.py
qui contient le code à compléter. -
Complétez le code de la fonction ci-dessous en vous aidant des indications contenues dans les commentaires.
-
Exécutez le en filtrant pour la France :
-
Province : ''
-
Pays: 'France'
-
-
Constatez l’affichage des données sous la forme d’un dictionnaire uniquement pour la France.
-
Exécutez le de nouveau en filtrant pour l'Italie puis pour la Chine, province de Hubei
import urllib.request as urllib2
import csv
from covid19v1 import *
from covid19v2 import *
def data_for_country(data, state = "", country = ""):
# for each country in data
for pays in ___:
# if 'Province/State' key match with state given in argument
# and if 'Country/Region' key match with country given in argument
if pays[___] == ___ and pays[___] == ___:
return pays
# here the main code
if __name__ == '__main__':
# File name of datas
file = "time_series_19-covid-Confirmed.csv"
# where datas are located
url = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv"
if download_file(url,file):
print(f'Téléchargement du fichier {file} terminé avec succès')
countries = read_CSV(file)
print("liste des pays et régions recencés")
print("----------------------------------")
# for row in coutries:
# print(row['Province/State'], row['Country/Region'])
france = data_for_country(countries, 'France', 'France')
print(france)
else:
print(f'Téléchargement du fichier {file} impossible')
7. Tracer le graphe de la propagation
7.1. Module pyplot
Pour tracer l’évolution du nombre d’inféctés jour par jour, nous allons utiliser le module matplotlib.pyplot
. Il regroupe un grand nombre de fonctions qui servent à créer des graphiques et les personnaliser (travailler sur les axes, le type de graphique, sa forme et même rajouter du texte).
Pour accéder aux fonctions de ce module, on ajoute la ligne d’import généralement associée à un alias pour éviter d’avoir à préfixer les fonction par
Son usage de base pour afficher les points contenus dans les listes
Pour ajouter les légendes et un titre :
Faire une image du graphique :
|
7.2. Compléter le programme
-
Ouvrez le fichier
covid19v4.py
qui contient le code à compléter. -
Complétez le code de la fonction ci-dessous en vous aidant des indications contenues dans les commentaires.
-
Exécutez le pour tracer les courbes de contamination pour les pays/provinces suivant :
-
France
-
Italie
-
Chine, province de Hubei
-
import urllib.request as urllib2
import csv
import matplotlib.pyplot as plt
from covid19v1 import *
from covid19v2 import *
from covid19v3 import *
def trace_data_for_country(country):
'''
Prepare lists of datas for x and y axis
'''
# x is an empty list
x = ___
# y is an empty list
y = ___
# browse through the country dictionary to get datas.
# - Keys contain dates
# - Values contain datas for y axis (number of daily cases)
# x axis contains the number of days since the beginning of pandemic
day = 0
#for key, value in the country dictionnary
for key, value in ___:
# Filter inappropriate keys
if key != 'Province/State' and key !='___' and key != '___' and key != '___':
# Add day number to the x list
x.___(___)
# Prepare for the next day
day = ___
# add value to the y list.
# value must be a number
y.___(float(___))
# return a tuple of lists x,y
return x,y
# here the main code
if __name__ == '__main__':
# File name of datas
file = "time_series_19-covid-Confirmed.csv"
# where datas are located
url = "https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv"
if download_file(url,file):
print(f'Téléchargement du fichier {file} terminé avec succès')
countries = read_CSV(file)
chine = data_for_country(countries, 'Hubei', 'China')
france = data_for_country(countries, '', 'France')
italie = data_for_country(countries, '', 'Italy')
print(chine)
print(france)
print(italie)
# Figure dimensions
plt.figure(figsize=(10, 7))
# Plot datas for China
x , y = trace_data_for_country(chine)
plt.plot(x, y, label="Chine")
# Plot datas for France
___
___
# Plot datas for Italy
___
___
# Add title to graph : "Infectés COVID-19 depuis le 22/01/2020"
___
# Add label on x axis : 'Nombre de jours'
___
# Add label on y axis : 'Nombre de contaminés'
___
# Add legend to graph
plt.___()
# Show graph
plt.___()
# Save the figure as an image
plt.___('covid19-Confimed.png')
# Close graph
plt.___()
else:
print(f'Téléchargement du fichier {file} impossible')