COVID19 - FR - Entrées et sorties par région pour 1 million d'hab.
Tags: #opendata #france #analytics
Author: MyDigitalSchool
Sur géodes (https://geodes.santepubliquefrance.fr/#c=indicator&view=map2…), aller dans COVID>données hospitalières>Nombre quotidien de nouvelles personnes en réanimation
Récupérer les entrées pour chaque région
Sur géodes, aller dans COVID>données hospitalières>Nombre de personnes actuellement en réanimation.
Récupérer le total pour chaque région
Pour chaque jour et chaque région, calculer : a) Le solde (Total J - Total J-1) b) les sorties (entrées - soldes)
Lisser ces données sur les 7 derniers jours
Représenter la courbe des entrées, celles des sorties, le solde entre les 2 Le site de SP : https://santepubliquefrance.fr/maladies-et-traumatismes/maladies-et-infections-respiratoires/infection-a-coronavirus/articles/infection-au-nouveau-coronavirus-sars-cov-2-covid-19-france-et-monde…
Video explicative : https://drive.google.com/file/d/1Mx7pEeH_3puzkDyicvRJ5opgiI3wZJ-d/view Production : Nairobi Team, 2020/04/24 (MyDigitalSchool)

Input

Import libraries

1
import requests
2
import pandas as pd
3
from datetime import datetime, timedelta
4
import plotly.graph_objects as go
5
from plotly.subplots import make_subplots
6
import numpy as np
Copied!

Variables

1
# URLs
2
BASE_URL_ENTREE = 'https://geodes.santepubliquefrance.fr/GC_indic.php?lang=fr&prodhash=3c0e7522&indic=incid_rea&dataset=covid_hospit_incid&view=map2&filters=jour='
3
BASE_URL_TOTAL = 'https://geodes.santepubliquefrance.fr/GC_indic.php?lang=fr&prodhash=3c0e7522&indic=rea&dataset=covid_hospit&view=map2&filters=sexe=0,jour='
4
5
# Liste des départements
6
DEPARTMENTS = ['Ain', 'Aisne', 'Allier', 'Alpes-de-Haute-Provence', 'Hautes-Alpes', 'Alpes-Maritimes', 'Ardèche', 'Ardennes', 'Ariège', 'Aube', 'Aude', 'Aveyron',
7
'Bouches-du-Rhône', 'Calvados', 'Cantal', 'Charente', 'Charente-Maritime', 'Cher', 'Corrèze', 'Côte-d\'Or', 'Côtes-d\'Armor', 'Creuse', 'Dordogne',
8
'Doubs', 'Drôme', 'Eure', 'Eure-et-Loir', 'Finistère', 'Corse-du-Sud', 'Haute-Corse', 'Gard','Haute-Garonne','Gers','Gironde','Hérault',
9
'Ille-et-Vilaine','Indre','Indre-et-Loire','Isère','Jura','Landes','Loir-et-Cher','Loire','Haute-Loire','Loire-Atlantique','Loiret','Lot',
10
'Lot-et-Garonne','Lozère','Maine-et-Loire','Manche','Marne','Haute-Marne','Mayenne','Meurthe-et-Moselle','Meuse','Morbihan','Moselle','Nièvre',
11
'Nord','Oise','Orne','Pas-de-Calais','Puy-de-Dôme','Pyrénées-Atlantiques','Hautes-Pyrénées','Pyrénées-Orientales','Bas-Rhin','Haut-Rhin','Rhône',
12
'Haute-Saône','Saône-et-Loire','Sarthe','Savoie','Haute-Savoie','Paris','Seine-Maritime','Seine-et-Marne','Yvelines','Deux-Sèvres','Somme','Tarn',
13
'Tarn-et-Garonne','Var','Vaucluse','Vendée','Vienne','Haute-Vienne','Vosges','Yonne','Territoire de Belfort','Essonne','Hauts-de-Seine',
14
'Seine-Saint-Denis','Val-de-Marne','Val-d\'Oise','Guadeloupe','Martinique','Guyane','La Réunion','Mayotte', 'France Entière']
15
16
# Nombre de jours
17
LISSAGE_JOURS = 7
18
19
# Pour contenir les x derniers jours, x étant la variable "LISSAGE_JOURS"
20
DATES = []
21
22
# Les indices contiennent x tableaux ordonnés en fonction de "DATES" contenant les données des départements ordonné comme "DEPARTEMENTS"
23
INDICES_TEMP_ENTREES = []
24
INDICES_TEMP_REANIMATION = []
25
INDICES_TEMP_COURANT = []
26
INDICES_ENTREES = []
27
INDICES_COURANT = []
28
INDICES_SORTIES = []
Copied!

Model

Récupération des données

1
for i in range(LISSAGE_JOURS + 1):
2
# Génération des dates
3
DAY = (datetime.today() - timedelta(days = (LISSAGE_JOURS - i))).isoformat().split("T")[0]
4
DATES.append(DAY)
5
6
# Récupération des entrées en réanimation
7
URL = (BASE_URL_ENTREE + DAY)
8
RESPONSE = requests.get(URL)
9
JSON = RESPONSE.json()
10
INDICES_TEMP_ENTREES.append(JSON['content']['distribution']['values'])
11
TOTAL_ENTREES = 0
12
for value in JSON['content']['distribution']['values']:
13
TOTAL_ENTREES += value
14
INDICES_ENTREES.append(value)
15
INDICES_ENTREES.append(TOTAL_ENTREES)
16
17
# Récupération des personnes actuellement en réanimation
18
URL = (BASE_URL_TOTAL + DAY)
19
RESPONSE = requests.get(URL)
20
JSON = RESPONSE.json()
21
INDICES_TEMP_REANIMATION.append(JSON['content']['distribution']['values'])
Copied!

Calcul des données

1
for i in range(1, LISSAGE_JOURS + 1):
2
TOTAL_SORTIES = 0
3
for j in range(len(DEPARTMENTS) - 1):
4
INDICES_TEMP_COURANT.append([])
5
INDICES_TEMP_COURANT[i-1].append(INDICES_TEMP_REANIMATION[i][j] - INDICES_TEMP_REANIMATION[i - 1][j])
6
TOTAL_SORTIES += INDICES_TEMP_ENTREES[i][j] - INDICES_TEMP_COURANT[i - 1][j]
7
INDICES_SORTIES.append(INDICES_TEMP_ENTREES[i][j] - INDICES_TEMP_COURANT[i - 1][j])
8
INDICES_SORTIES.append(TOTAL_SORTIES)
9
10
INDICES_ENTREES = INDICES_ENTREES[len(DEPARTMENTS) : len(INDICES_ENTREES)]
11
DATES.pop(0)
12
13
for value in INDICES_TEMP_COURANT:
14
TOTAL_COURANT = 0
15
for v in value:
16
TOTAL_COURANT += v
17
INDICES_COURANT.append(v)
18
INDICES_COURANT.append(TOTAL_COURANT)
Copied!

Mise en forme des données

1
iterables = []
2
iterables.append(DATES)
3
iterables.append(DEPARTMENTS)
4
idx = pd.MultiIndex.from_product(iterables, names=['DATE', 'ZONE'])
5
6
datas = []
7
for i in range(len(iterables[1]) * len(iterables[0])) :
8
datas.append(np.array([INDICES_ENTREES[i], INDICES_SORTIES[i],INDICES_COURANT[i], datetime.today()]))
9
10
df = pd.DataFrame(datas, index=idx, columns=['ENTREES', 'SORTIES', 'SOLDES', 'LAST UPDATE'])
11
df
Copied!

Output

Plotting

1
# Prépare la figure pour deux graphes
2
fig = make_subplots(rows=2, cols=1)
3
#fig = go.Figure()
4
5
# Application d'un filtre pour le graphe
6
# df = df.filter(like='France Entière', axis=0)
7
8
# Création des éléments du dropdown pour appliquer les filtres
9
buttons = []
10
buttons.append(dict(method='restyle', label="Entire France",
11
args=[{'y':[df.filter(like="France Entière", axis=0).ENTREES, df.filter(like="France Entière", axis=0).SORTIES, df.filter(like="France Entière", axis=0).SOLDES]}]))
12
for i in range(len(DEPARTMENTS) - 1):
13
dep = DEPARTMENTS[i]
14
buttons.append(dict(method='restyle', label=dep,
15
args=[{'y':[df.filter(like=dep, axis=0).ENTREES, df.filter(like=dep, axis=0).SORTIES, df.filter(like=dep, axis=0).SOLDES]}]))
16
17
# Affichage des lignes dans le graphe
18
fig.add_trace(go.Scatter(x=df.filter(like='France Entière', axis=0).index.get_level_values('DATE'), y=df.filter(like='France Entière', axis=0).ENTREES, fill='tozeroy',name="Admissions",line=dict(width=0.5,color="rgb(160,0,0)"),line_shape='spline'), row = 1, col = 1)
19
fig.add_trace(go.Scatter(x=df.filter(like='France Entière', axis=0).index.get_level_values('DATE'), y=df.filter(like='France Entière', axis=0).SORTIES, fill='tozeroy',name="Releases",line=dict(width=0.5,color="rgb(0,160,0)"),line_shape='spline'), row = 1, col = 1)
20
fig.add_trace(go.Scatter(x=df.filter(like='France Entière', axis=0).index.get_level_values('DATE'), y=df.filter(like='France Entière', axis=0).SOLDES, fill='tozeroy',name="Balance",line=dict(width=0.5,color="rgb(0,0,160)"),line_shape='spline'), row = 2, col = 1)
21
22
# Redimensionnement et couleur de fond du graphe
23
fig.update_layout(width=1400, height=400, plot_bgcolor='rgb(255,255,255)', title_text="Admissions, releases and balance for COVID-19 reanimation services in France (last update : " + str(df['LAST UPDATE'][0]) + ")")
24
25
# Mise en place du dropdown
26
fig.update_layout(updatemenus=[dict(buttons=buttons, direction="down", pad={"r": 1, "t": 1}, showactive=True, x=0.05, xanchor="left", y=1.22, yanchor="top")])
27
28
fig.update_layout(annotations=[dict(text="Zone", x=0, xref="paper", y=1.18, yref="paper", align="left", showarrow=False)])
29
30
# Affichage du graphe
31
fig.show()
32
#df
Copied!
Copy link
Edit on GitHub