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.

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

propagation

3. Moyens

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 choisir Enregistrer 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 :

excel

Il est important ici de remarquer les noms des colonnes qui constitue le tableau. On y trouve :

  • Province/State

  • Country/Region

  • Lat et Long

  • dates

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 open, read et write premettent de gérer les fichiers :

  • open(filename, mode) : Ouverture du fichier filename. mode indique la nature des droits sur le fichier : lecture, écriture, modification, …​. Retourne un objet fichier sur lequel on pourra agir conformément aux droits conférés par le mode d’ouverture.

  • write(text) : Méthode qui s’applique à l’objet fichier ouvert et qui écrit ou ajoute le contenu de text dans le fichier.

  • read() : Méthode qui s’applique à l’objet fichier ouvert et qui retourne le contenu entier du fichier.

Remarque : L’utilisation de with évite d’avoir d’avoir à gérer la fermeture du fichier ouvert après son utilisation.

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 matplotlib.pyplot :

import matplotlib.pyplot as plt

Son usage de base pour afficher les points contenus dans les listes x et y est :

plt.plot(x, y)
plt.show()
plt.close()

Pour ajouter les légendes et un titre :

plt.title("The main title")
plt.xlabel('Label for x axis')
plt.ylabel('label for y axis')

# Legend of plotted data - useful for multiple charts
plt.legend()

Faire une image du graphique :

plt.savefig('nom_image.png')

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

7.3. Résultat attendu

covid Confimed

the_end.jpg