Evolution du stock de vaccin et des rendez-vous
Code
Les sources proviennent de l’INSEE: stock et rdv
import pandas as pd
import plotly.graph_objects as go
from plotly.subplots import make_subplots
from datetime import datetime
import numpy as np
from plotly.offline.offline import plot
Fetch data
regions = [
"Ile de France", "Auvergne-Rhone-Alpes", "Nouvelle Aquitaine",
"Haut-de-France", "Occitanie", "Grand Est", "Provence-Alpes-Cote d'Azur",
"Pays de la Loire", "Bretagne", "Normandie",
"Bourgogne-Franche Comté", "Centre-Val-de-Loire",
"Guadeloupe", "Martinique", "Corse", "Gyuane"
]
stock = pd.read_csv('vaccins/stocks-es-par-region.csv', usecols=["nom_reg", "type_de_vaccin", "nb_doses", "date"])
stock.columns = ["region", "type", "nb", "date"]
stock["date"] = pd.to_datetime(stock["date"])
rdv = pd.read_csv('vaccins/2021-03-22-prise-rdv-par-reg.csv', usecols=["region", "rang_vaccinal", "date_debut_semaine", "nb"])
rdv.columns = ["region", "rang", "date", "nb"]
rdv["date"] = pd.to_datetime(rdv["date"])
def build_timeline_region(fig, reg, row, col):
stock_r = stock[stock["region"] == reg]
t = stock_r["date"].unique()
t.sort()
areas = pd.Series(index=t, data=np.zeros(t.size))
for i, (vaccin, color) in enumerate([("AstraZeneca", "cyan"), ("Moderna", "red"), ("Pfizer", "green")]):
stock_r_v = stock_r[stock_r["type"] == vaccin]
stock_r_v.set_index("date", inplace=True)
areas = areas.add(stock_r_v["nb"], fill_value=0)
fig.add_trace(go.Scatter(
name=vaccin,
x=areas.index,
y=areas,
mode='lines',
line=dict(color=color),
showlegend=reg == "IDF",
fill=('tonexty' if i else 'tozeroy')), row=row, col=col)
rdv_r = rdv[rdv["region"] == reg][["date", "nb"]]
rdv_r = rdv_r.groupby("date").sum()
rdv_r = rdv_r.loc[areas.index.min():areas.index.max()]
fig.add_trace(go.Scatter(
name='RDV',
x=rdv_r.index,
y=rdv_r["nb"],
mode="lines",
showlegend=reg == "IDF",
line=dict(color='black')), row=row, col=col)
fig = make_subplots(rows=8, cols=2, shared_xaxes=True, subplot_titles=regions)
build_timeline_region(fig, "IDF", 1, 1)
build_timeline_region(fig, "ARA", 1, 2)
build_timeline_region(fig, "NAQ", 2, 1)
build_timeline_region(fig, "HDF", 2, 2)
build_timeline_region(fig, "OCC", 3, 1)
build_timeline_region(fig, "GES", 3, 2)
build_timeline_region(fig, "PAC", 4, 1)
build_timeline_region(fig, "PDL", 4, 2)
build_timeline_region(fig, "BRE", 5, 1)
build_timeline_region(fig, "NOR", 5, 2)
build_timeline_region(fig, "BFC", 6, 1)
build_timeline_region(fig, "CVL", 6, 2)
build_timeline_region(fig, "GDP", 7, 1)
build_timeline_region(fig, "MAR", 7, 2)
build_timeline_region(fig, "COR", 8, 1)
build_timeline_region(fig, "GUY", 8, 2)
fig.update_layout(height=1000, title="Stock vs RDV par région")
# fig.show()
print(plot(fig, include_plotlyjs=False, include_mathjax=False, output_type='div'))
Ces graphiques montrent le stock de vaccin par des empilements de couleurs selon le type de vaccin et les rendez-vous par la ligne noire. A noter qu’il s’agit des rendez-vous, certains sont peut-être annulés et non donc pas donné lieu à une dose de vaccin.
De ces graphiques on remarque deux choses:
- le fameux vaccin AstraZeneca est minoritaire, voire absent du plan de vaccination. Il a d’abord eu un pic de stock milieu février, mais l’État ne semble pas avoir renouveler son stock. Le fabricant ne peut-il pas livrer ? Ou l’État avait déjà plus ou moins banni ce vaccin avant l’annonce officielle ?
- Certaines régions aujourd’hui confinées comme l’île de France ou l’Haut-de-France semblent être en pénurie de stock face aux prises de rendez-vous. A contrario, des régions comme la Guadeloupe ou la Martinique semblent être en surstock.
Néanmoins dans l’ensemble, vu la difficulté logistique des vaccins et la volatilité des prises de rendez-vous. Le stock de vaccin semble distribuer en adéquation avec la demande.