Python et COVID 19

Je suis loin d'être une développeuse python. Je n'ai jamais vraiment appris ce langage... Je l'utilise plutôt comme un outil...
Depuis hier, on parle de sortie du confinement et je me suis demandé comment représenter l'état de la situation actuelle. En gros, on a des gens qui rentre à l'hôpital à cause du COVID 19. Parmi ceux-ci, certains sont en réanimation. Au bout d'un certain temps, les malades finissent par sortir, soit parce qu'ils sont morts, soit parce qu'ils sont sur la voix de la guérison et peuvent rentrer chez eux.
Après avoir pas mal tâtonné, j'ai réussi à produire ce genre de graphique :
Données hospitalières COVID19 pour l'Essonne le 8 avril

Aujourd'hui 8 avril, dans le département 91, Il y a 1125 personnes à l'hôpital (les carrés bleus), dont 222 en réanimation (les carrés rouges). Il y a eu 163 décès depuis le 19 mars et 394 retours.
Si je génère ces graphiques depuis le début, cela donne cette animation :
Données hospitalières COVID19 pour l'Essonne depuis le 19 mars

On voit clairement qu'il y a de plus en plus de monde à l'hôpital, et que la fin de la quarantaine n'est pas pour demain. Par soucis de transparence, et pour que chacun puisse jouer avec les données, voilà des bouts de code python que j'ai utilisés.

Lecture du fichier csv

J'ai d'abord un petit script qui ne fait que lire ce qu'il y a dans le fichier fournit par santé publique France [1] Par exemple, cette fonction lit le nombre cumulé de décès, les filtre par département (par exemple le 93) et les stocke dans un tableau. Il peut être téléchargé sur Sourcesup [2]

import csv
  def depdc(dpt,sex,fichier):
  tab=[]
  with open(fichier, newline='') as dhcovid:
     lecteur=csv.reader(dhcovid)
     for ligne in lecteur:
         dc=ligne[6]
         if (ligne[1] == sex) and (ligne[0] == dpt):
          nb = int(dc)
          tab.append(nb)
  return tab


Pour le département 93, tout sexe confondu, la fonction retourne ce tableau :
[5, 5, 19, 20, 23, 28, 38, 47, 68, 82, 100, 113, 124, 161, 187, 208, 240, 263, 285, 296, 368, 402]
Libre à moi d'en faire ensuite ce que je veux.

Diagramme barre :

Maintenant que j'ai mes données, je peux en faire ce que je veux. Si je récupère les dates dans un autre tableau, je peux par exemple utiliser pyplot pour représenter un diagramme barre. 
Evolution du nombre de décès pour le département 93
Le bout de fonction qui fait ça : 

import matplotlib.pyplot as plt
def barres(quand,quoi,couleur):
   plt.figure(figsize=(10, 10))
   plt.xticks(rotation=90)
   plt.bar(quand, quoi,color=couleur)
   plt.show()


Représentation avec des croix...

Comme les morts ne bougent plus beaucoup, j'ai choisi de les aligner par ligne de 20 en dessinant un "+". 

import matplotlib.pyplot as plt
def croix(combien):
   plt.axis("off")
   x=0
   y=0
for i in range(combien):
   x=x+5
   if x>100:
     y=y+1
     x=5
   plt.plot(x,y,'b+')


Pour tester, le Jura est pas mal. Il n'y a que 19 décès, 100 personnes hospitalisées et 30 retours à domicile.
Données hospitalières COVID19 pour le Jura le 8 avril



Représentation des hospitalisés et des retours

J'ai choisi de représenter les personnes hospitalisées et rentrées à la maison par des positions aléatoires, surtout pour m'amuser je crois....
Si je prends les données des Bouches du Rhône, on voir que l'on a beaucoup plus de retours que dans l'Essonne.
Données hospitalières COVID19 pour les Bouches de Rhône
Pour dessiner un rond, j'utilise la fonction scatter de pyplot :

import random
import matplotlib.pyplot as plt


def points(combien): 
   plt.axis("off") 
   for i in range(combien): 
         x=random.randint(0,100) 
         y=random.randint(0,100) 
         plt.scatter(x,y)

Pour dessiner un carré, j'utilise plot, avec "rs" pour "red square" pour les personnes en réanimation, ou "bs" avec un b comme bleu pour les autres :

plt.plot(x,y,'rs') 
plt.plot(x,y,'bs')

Est-ce dû à la chloroquine ? Il faut faire extrêmement attention quand on manipule des données, et ne pas oublier le paradoxe de Simpson dont parle David Louapre dans cette vidéo.


Séparation en trois parties.

Comme je ne suis pas une spécialiste de python,j'ai eu besoin d'un peu de documentation pour avoir 2 colonnes et deux lignes.
Sur la première colonne et occupant deux lignes (121), j'affiche les hospitalisés.
Sur la deuxième colonne, j'affiche les décès sur la première ligne (222) et les retours sur la deuxième ligne (224).

import lecteurcsv,random 
import matplotlib.pyplot as plt 
source="donnees-hospitalieres-covid19-2020-04-08-19h00.csv" 

# Le département 
lieu = "71" 
# Le sexe 
qui = "0" 
# Le numéro du jour 
num = 21

plt.suptitle ("Dep "+lieu+" : "+dates[num])
plt.subplot(121)
plt.title(str (hosp[num])+" hosp (dont "+str(rea[num])+" rea)")
deuxfig(hosp[num],rea[num])
plt.subplot(222)
plt.title(str (deces[num])+" décès")
croix(deces[num])

plt.subplot(224)
plt.title(str (rad[num])+" retours")
points(rad[num])



Pour la Saône et Loire, ça donne ça :
Données hospitalières COVID19 pour la Saône et Loire

On voit aussi qu'il y a plus de retours que de personnes hospitalisées.
Outre le fait de s'amuser avec python, ces petits points montrent que dans certains départements, comme l'Essonne, la sortie du confinement n'est pas pour demain. Si c'est le cas, ce serait vraiment idiot. Il y a de plus en plus de personnes hospitalisées et peu sont encore sorties.
Attention aussi à l'excès de confiance. Dans le cas du COVID 19, il peut être mortel !




Mise à jour le 24 avril 2020 :


Il y a encore beaucoup de monde dans les hôpitaux de l'Essonne. Si le nombre de personnes en soins intensifs diminue légèrement, le nombre d'hospitalisés stagne plus ou moins... Cela doit sans doute correspondre à la capacité maximale des hôpitaux. 



  1. Données hospitalières relatives à l'épidémie de COVID-19
  2. git clone https://git.renater.fr/anonscm/git/dhzazaa/dhzazaa.git


Commentaires

Emmanuelle a dit…
C'est très intéressant à observer... j'ai l'impression que la proportion de personnes en réa augmente, mais je n'ai pas pris le temps de relever les chiffres pour faire le calcul et vérifier.
Ce qui est sûr, c'est qu'effectivement, on y est pour un moment, d'autant que certains commerces (jardineries, bricolages) ré-ouvrent en mode "plages courtes", mais on peut observer des dérives (genre une famille entière qui va faire ses courses de première nécessité à la jardinerie)...