Estimation des paramètres d’un modèle SIRD étendu pour la France

Le modèle proposé dans l’exemple Estimation des paramètres d’un modèle SIRD pour la France ne fonctionne pas très bien. Les données collectées sont erronées pour le recensement des personnes infectées. Comme les malades n’étaient pas testées au début de l’épidémie, le nombre officiel de personnes contaminées est en-deça de la réalité. On ajoute un paramètre pour tenir compte dela avec le modèle CovidSIRDc. Le modèle suppose en outre que la contagion est la même tout au long de la période d’étude alors que les mesures de confinement, le port du masque impacte significativement le coefficient de propagation. L’épidémie peut sans doute être modélisée avec un modèle SIRD mais sur une courte période.

Récupération des données

from datetime import timedelta
import warnings
import numpy
import pandas
from pandas import to_datetime
import matplotlib.gridspec as gridspec
import matplotlib.pyplot as plt
from matplotlib.cbook.deprecation import MatplotlibDeprecationWarning
from aftercovid.data import extract_hopkins_data, preprocess_hopkins_data
from aftercovid.models import CovidSIRDc, rolling_estimation


data = extract_hopkins_data()
diff, df = preprocess_hopkins_data(data)
df.tail()
deaths confirmed recovered infected safe
10/12/21 114835.540649 6.888352e+06 6.686947e+06 91134.0 6.010708e+07
10/13/21 114861.994404 6.892420e+06 6.692726e+06 84777.0 6.010764e+07
10/14/21 114888.285866 6.900806e+06 6.697974e+06 88196.0 6.009894e+07
10/15/21 114921.393632 6.906071e+06 6.703270e+06 88125.0 6.009368e+07
10/16/21 114936.000000 6.910527e+06 6.708011e+06 87793.0 6.008926e+07


Graphes.

fig = plt.figure(tight_layout=True, figsize=(12, 10))
gs = gridspec.GridSpec(2, 2)
axs = []
ax = fig.add_subplot(gs[0, :])
df.plot(logy=True, title="Données COVID", ax=ax)
axs.append(ax)
ax = fig.add_subplot(gs[1, 0])
df[['recovered', 'confirmed', 'infected']].diff().plot(
    title="Différences", ax=ax)
axs.append(ax)
ax = fig.add_subplot(gs[1, 1])
df[['deaths']].diff().plot(title="Différences", ax=ax)
axs.append(ax)
for a in axs:
    for tick in a.get_xticklabels():
        tick.set_rotation(30)
Données COVID, Différences, Différences

Estimation d’un modèle

L’approche sur une fenêtre glissante suggère que le modèle n’est pas bon pour approcher les données sur toute une période, mais que sur une période courte, le vrai modèle peut être approché par un modèle plus simple. On note \(W^*(t)\) les paramètres optimaux au temps t, on étudie les courbes \(t \rightarrow W^*(t)\) pour voir comment évolue ces paramètres.

model = CovidSIRDc()
print(model.quantity_names)

data = df[['safe', 'infected', 'recovered',
           'deaths']].values.astype(numpy.float32)
print(data[:5])

X = data[:-1]
y = data[1:] - data[:-1]
dates = df.index[:-1]

Nlast = 150
X = X[-Nlast:]
y = y[-Nlast:]
dates = dates[-Nlast:]

Out:

['S', 'I', 'R', 'D']
[[6.7e+07 0.0e+00 0.0e+00 0.0e+00]
 [6.7e+07 1.0e+00 0.0e+00 0.0e+00]
 [6.7e+07 1.0e+00 0.0e+00 0.0e+00]
 [6.7e+07 2.0e+00 0.0e+00 0.0e+00]
 [6.7e+07 2.0e+00 0.0e+00 0.0e+00]]

Estimation.

# 3 semaines car les séries sont cycliques
dfcoef, model = rolling_estimation(
    X, y, delay=21, dates=dates, verbose=1, model_name='SIRDc')
dfcoef.head(n=10)

Out:

k=7 iter=239 loss=52762179.048 l1=0.00015 coef=[ 0.04491735  0.06012674  0.001      -0.43017192  0.03898211  0.00812498] R0=0.7348232874448997 lr=1e-06 cn=-6.41347418177589e-05
k=14 iter=7 loss=42870424.381 l1=0.000142 coef=[ 4.50879327e-02  6.57729452e-02  1.00000000e-03 -4.28410567e-01
  2.39143611e-02  4.24128466e-09] R0=0.6752425334881161 lr=1e-06 cn=-6.38743644193613e-05
k=21 iter=500 loss=37569179.429 l1=0.000114 coef=[ 0.02291349  0.06371711  0.001      -0.75004788  0.54543764  0.44491394] R0=0.3540561065863692 lr=0.0001 cn=-0.00011175408914315506
k=28 iter=141 loss=19779786.667 l1=7.76e-05 coef=[ 1.48083478e-02  7.83686749e-02  1.00000089e-03 -7.10786923e-01
  1.10080964e+00  1.01965979e+00] R0=0.18657672772685818 lr=1e-06 cn=-0.00010581721288989767
k=35 iter=24 loss=26628550.095 l1=9.72e-05 coef=[ 3.33580875e-02  6.05222217e-02  1.00000000e-03 -6.51754600e-01
  3.62462277e-01  1.65852794e+00] R0=0.5422120108237823 lr=1e-06 cn=-9.71254303787704e-05
k=42 iter=92 loss=37162599.619 l1=0.000126 coef=[ 1.37419805e-01  3.30758368e-02  1.00000857e-03 -7.58285969e-02
  6.81537541e-05  1.93857177e+00] R0=4.032762901917571 lr=1e-06 cn=-1.1306373151031755e-05
k=49 iter=500 loss=75160868.571 l1=0.000169 coef=[ 1.27818442e-01  2.77764940e-03  1.00029484e-03 -2.04049286e-01
  0.00000000e+00  1.97265620e+00] R0=33.83280273901936 lr=1e-06 cn=-3.0424662196359343e-05
k=56 iter=500 loss=162350043.429 l1=0.000263 coef=[ 9.57900443e-02  1.77511219e-03  1.00000000e-03 -2.56707019e-01
  1.76680362e-08  1.95689377e+00] R0=34.51753937752419 lr=1e-06 cn=-3.8276165893326614e-05
k=63 iter=500 loss=244532370.286 l1=0.000338 coef=[ 7.76274237e-02  1.06261050e-02  1.00000000e-03 -3.73170220e-01
  5.13806698e-10  1.64175971e+00] R0=6.6769931541616225 lr=1e-06 cn=-5.564135070030253e-05
k=70 iter=500 loss=198349677.714 l1=0.000277 coef=[ 0.06615626  0.03560687  0.001      -0.17101364  0.          0.31194215] R0=1.8072087899287679 lr=1e-06 cn=-2.5498899343377997e-05
k=77 iter=500 loss=96602020.571 l1=0.000208 coef=[ 5.86172923e-02  4.28282644e-02  1.00000000e-03 -1.49176312e-01
  4.00789912e-06  1.48273641e-01] R0=1.3374312920139637 lr=1e-06 cn=-2.2242855449049818e-05
k=84 iter=71 loss=165666499.048 l1=0.000247 coef=[ 0.05022608  0.04460145  0.001      -0.22891802  0.06758774  0.10092185] R0=1.1014142040901904 lr=1e-06 cn=-3.412261442231255e-05
k=91 iter=500 loss=183204254.476 l1=0.000266 coef=[ 0.04128754  0.04587714  0.001      -0.3262276   0.10356524  0.05239492] R0=0.8807607266121246 lr=1e-06 cn=-4.862653892464688e-05
k=98 iter=500 loss=187210971.429 l1=0.000267 coef=[ 0.03321923  0.05062824  0.001      -0.4963494   0.16785067  0.13274835] R0=0.6434313359729658 lr=1e-06 cn=-7.398286497280704e-05
k=102 iter=500 loss=186198771.810 l1=0.000261 coef=[ 0.03192521  0.05124277  0.001      -0.6138272   0.15802542  0.07211005] R0=0.6110933932644377 lr=1e-06 cn=-9.15007978022797e-05
k=104 iter=500 loss=179447966.476 l1=0.00025 coef=[ 0.03867866  0.05729605  0.001      -0.4073663   0.10040932  0.06099765] R0=0.6634867511071336 lr=1e-06 cn=-6.072515241685411e-05
k=106 iter=500 loss=190668982.857 l1=0.000259 coef=[ 0.03171775  0.055193    0.001      -0.59326438  0.11877806  0.06535156] R0=0.5644430057516723 lr=1e-06 cn=-8.844064799508798e-05
k=108 iter=82 loss=197278939.429 l1=0.000268 coef=[ 0.03078933  0.05481554  0.001      -0.69860763  0.13771173  0.15291958] R0=0.5516265132635662 lr=1e-06 cn=-0.00010414497178104193
k=110 iter=500 loss=193143588.571 l1=0.000262 coef=[ 0.02889833  0.05544547  0.001      -0.81503316  0.14567089  0.16409239] R0=0.5119689422259526 lr=1e-06 cn=-0.0001215033522541782
k=112 iter=500 loss=162826410.667 l1=0.000225 coef=[ 0.03700204  0.05843769  0.001      -0.64316085  0.09734172  0.06702099] R0=0.6225349759437097 lr=1e-06 cn=-9.588363383691155e-05
k=114 iter=500 loss=162816365.714 l1=0.000219 coef=[ 0.03445113  0.05923777  0.001      -0.64822802  0.07588833  0.04240069] R0=0.5719191183624076 lr=1e-06 cn=-9.664237434587934e-05
k=116 iter=500 loss=163544600.381 l1=0.000218 coef=[ 0.03526229  0.0579485   0.001      -0.75158621  0.07496577  0.04097244] R0=0.598188064915182 lr=1e-06 cn=-0.00011205368018494775
k=118 iter=31 loss=152333945.905 l1=0.000205 coef=[ 0.02952013  0.05655759  0.001      -0.81997006  0.05778744  0.        ] R0=0.5128799082806429 lr=1e-06 cn=-0.00012225258249721113
k=120 iter=500 loss=150586404.571 l1=0.000204 coef=[ 0.03170847  0.05349608  0.001      -0.87469012  0.06286709  0.05566052] R0=0.5818485636525237 lr=0.01 cn=-0.0001304108309413089
k=122 iter=15 loss=85246531.048 l1=0.000145 coef=[ 0.03799105  0.05707199  0.00100003 -0.6359718   0.03457749  0.        ] R0=0.6542057001335225 lr=1e-06 cn=-9.482108230204461e-05
k=123 iter=475 loss=84627779.048 l1=0.000143 coef=[ 0.04010853  0.0580565   0.001      -0.58819473  0.02795776  0.        ] R0=0.6791552466752364 lr=1e-06 cn=-8.769829559600298e-05
k=124 iter=258 loss=82320700.952 l1=0.00014 coef=[ 0.03901974  0.05667932  0.001      -0.65836775  0.03137966  0.        ] R0=0.6764943238105682 lr=1e-06 cn=-9.81608959372223e-05
k=125 iter=74 loss=61521328.762 l1=0.000127 coef=[ 0.02629042  0.05613817  0.001      -0.82339314  0.11265921  0.05187956] R0=0.46012011461887226 lr=1e-06 cn=-0.00012275478875351572
k=126 iter=500 loss=30714282.667 l1=9.54e-05 coef=[ 0.0349982   0.05956885  0.001      -0.4138669   0.15636815  0.09265684] R0=0.5778251136588736 lr=1e-06 cn=-6.168606921871525e-05
k=127 iter=500 loss=33927512.381 l1=0.000102 coef=[ 0.0431655   0.06288829  0.001      -0.38007437  0.01369197  0.039896  ] R0=0.675640260167872 lr=1e-06 cn=-5.666874753755107e-05
k=128 iter=500 loss=34132019.810 l1=0.000105 coef=[ 0.0476068   0.06392513  0.001      -0.32335179  0.02313796  0.08983926] R0=0.7332569247170068 lr=1e-06 cn=-4.8209745700733894e-05
k=129 iter=111 loss=33584734.476 l1=0.000104 coef=[ 0.04706534  0.06446351  0.001      -0.22563222  0.07885632  0.20873341] R0=0.7189553028828071 lr=1e-06 cn=-3.363100475141223e-05
k loss loss_l1 it R0 lr correctness beta mu nu a b c
date
6/15/21 7 5.276218e+07 0.000150 239 0.734823 0.000001 -0.000064 0.044917 0.060127 0.001 -0.430172 3.898211e-02 8.124979e-03
6/22/21 14 4.287042e+07 0.000142 7 0.675243 0.000001 -0.000064 0.045088 0.065773 0.001 -0.428411 2.391436e-02 4.241285e-09
6/29/21 21 3.756918e+07 0.000114 500 0.354056 0.000100 -0.000112 0.022913 0.063717 0.001 -0.750048 5.454376e-01 4.449139e-01
7/6/21 28 1.977979e+07 0.000078 141 0.186577 0.000001 -0.000106 0.014808 0.078369 0.001 -0.710787 1.100810e+00 1.019660e+00
7/13/21 35 2.662855e+07 0.000097 24 0.542212 0.000001 -0.000097 0.033358 0.060522 0.001 -0.651755 3.624623e-01 1.658528e+00
7/20/21 42 3.716260e+07 0.000126 92 4.032763 0.000001 -0.000011 0.137420 0.033076 0.001 -0.075829 6.815375e-05 1.938572e+00
7/27/21 49 7.516087e+07 0.000169 500 33.832803 0.000001 -0.000030 0.127818 0.002778 0.001 -0.204049 0.000000e+00 1.972656e+00
8/3/21 56 1.623500e+08 0.000263 500 34.517539 0.000001 -0.000038 0.095790 0.001775 0.001 -0.256707 1.766804e-08 1.956894e+00
8/10/21 63 2.445324e+08 0.000338 500 6.676993 0.000001 -0.000056 0.077627 0.010626 0.001 -0.373170 5.138067e-10 1.641760e+00
8/17/21 70 1.983497e+08 0.000277 500 1.807209 0.000001 -0.000025 0.066156 0.035607 0.001 -0.171014 0.000000e+00 3.119422e-01


Saving the results.

df.index = to_datetime(df.index)
dfcoef.index = to_datetime(dfcoef.index)
df.to_csv("plot_covid_france_sird_cst.data.csv", index=True)
dfcoef.to_csv("plot_covid_france_sird_cst.model.csv", index=True)

Fin de la période.

k loss loss_l1 it R0 lr correctness beta mu nu a b c
date
2021-10-04 118 1.523339e+08 0.000205 31 0.512880 0.000001 -0.000122 0.029520 0.056558 0.001 -0.819970 0.057787 0.000000
2021-10-06 120 1.505864e+08 0.000204 500 0.581849 0.010000 -0.000130 0.031708 0.053496 0.001 -0.874690 0.062867 0.055661
2021-10-08 122 8.524653e+07 0.000145 15 0.654206 0.000001 -0.000095 0.037991 0.057072 0.001 -0.635972 0.034577 0.000000
2021-10-09 123 8.462778e+07 0.000143 475 0.679155 0.000001 -0.000088 0.040109 0.058057 0.001 -0.588195 0.027958 0.000000
2021-10-10 124 8.232070e+07 0.000140 258 0.676494 0.000001 -0.000098 0.039020 0.056679 0.001 -0.658368 0.031380 0.000000
2021-10-11 125 6.152133e+07 0.000127 74 0.460120 0.000001 -0.000123 0.026290 0.056138 0.001 -0.823393 0.112659 0.051880
2021-10-12 126 3.071428e+07 0.000095 500 0.577825 0.000001 -0.000062 0.034998 0.059569 0.001 -0.413867 0.156368 0.092657
2021-10-13 127 3.392751e+07 0.000102 500 0.675640 0.000001 -0.000057 0.043166 0.062888 0.001 -0.380074 0.013692 0.039896
2021-10-14 128 3.413202e+07 0.000105 500 0.733257 0.000001 -0.000048 0.047607 0.063925 0.001 -0.323352 0.023138 0.089839
2021-10-15 129 3.358473e+07 0.000104 111 0.718955 0.000001 -0.000034 0.047065 0.064464 0.001 -0.225632 0.078856 0.208733


Statistiques.

k loss loss_l1 it R0 lr correctness beta mu nu a b c
count 32.00000 3.200000e+01 32.000000 32.000000 32.000000 32.000000 32.000000 32.000000 32.000000 3.200000e+01 32.000000 32.000000 32.000000
mean 89.03125 1.160866e+08 0.000190 347.500000 3.071528 0.000317 -0.000075 0.046733 0.051086 1.000011e-03 -0.505225 0.122461 0.393497
std 38.38219 6.916362e+07 0.000071 204.373788 8.251591 0.001767 0.000034 0.027477 0.017397 5.220815e-08 0.228500 0.210289 0.659832
min 7.00000 1.977979e+07 0.000078 7.000000 0.186577 0.000001 -0.000130 0.014808 0.001775 1.000000e-03 -0.874690 0.000000 0.000000
25% 61.25000 4.154511e+07 0.000127 106.250000 0.570050 0.000001 -0.000100 0.031873 0.049440 1.000000e-03 -0.668428 0.023720 0.042044
50% 105.00000 1.235942e+08 0.000204 500.000000 0.658846 0.000001 -0.000081 0.038335 0.056618 1.000000e-03 -0.542272 0.071277 0.080975
75% 120.50000 1.803870e+08 0.000259 500.000000 0.771308 0.000001 -0.000049 0.047201 0.059708 1.000000e-03 -0.325509 0.123511 0.234536
max 129.00000 2.445324e+08 0.000338 500.000000 34.517539 0.010000 -0.000011 0.137420 0.078369 1.000295e-03 -0.075829 1.100810 1.972656


Fin de la période.

df.tail(n=10)
deaths confirmed recovered infected safe
2021-10-07 114700.883850 6.867579e+06 6.657791e+06 98020.0 6.012949e+07
2021-10-08 114737.886648 6.871363e+06 6.664015e+06 95294.0 6.012595e+07
2021-10-09 114752.493016 6.875669e+06 6.670716e+06 92641.0 6.012189e+07
2021-10-10 114777.671612 6.879299e+06 6.675976e+06 90838.0 6.011841e+07
2021-10-11 114811.753136 6.883071e+06 6.680999e+06 91923.0 6.011227e+07
2021-10-12 114835.540649 6.888352e+06 6.686947e+06 91134.0 6.010708e+07
2021-10-13 114861.994404 6.892420e+06 6.692726e+06 84777.0 6.010764e+07
2021-10-14 114888.285866 6.900806e+06 6.697974e+06 88196.0 6.009894e+07
2021-10-15 114921.393632 6.906071e+06 6.703270e+06 88125.0 6.009368e+07
2021-10-16 114936.000000 6.910527e+06 6.708011e+06 87793.0 6.008926e+07


Statistiques.

deaths confirmed recovered infected safe
count 634.000000 6.340000e+02 6.340000e+02 634.000000 6.340000e+02
mean 59912.078832 2.571181e+06 2.290882e+06 223529.728707 6.442568e+07
std 40014.499105 2.511070e+06 2.384129e+06 229390.013635 2.509127e+06
min 0.000000 4.547627e-01 0.000000e+00 0.000000 6.008926e+07
25% 29195.520644 1.377237e+05 1.077570e+05 9125.000000 6.165032e+07
50% 54004.818639 2.042993e+06 1.668568e+06 167931.500000 6.495480e+07
75% 105753.196916 5.360797e+06 4.824042e+06 367809.000000 6.685920e+07
max 114936.000000 6.910527e+06 6.708011e+06 922350.000000 6.700000e+07


Graphe.

dfcoef['R0=1'] = 1
dfcoef['a_'] = -dfcoef['a']
dfcoef['cn'] = -dfcoef['correctness']

fig, ax = plt.subplots(2, 3, figsize=(14, 6), sharex=True)
with warnings.catch_warnings():
    warnings.simplefilter("ignore", MatplotlibDeprecationWarning)
    dfcoef[["mu", "nu"]].plot(ax=ax[0, 0], logy=True)
    dfcoef[["beta"]].plot(ax=ax[0, 1], logy=True)
    dfcoef[["loss_l1"]].plot(ax=ax[1, 0], logy=True)
    dfcoef[["R0", "R0=1"]].plot(ax=ax[0, 2])
    dfcoef[["a_", "b", "c", "cn"]].plot(ax=ax[1, 2])
    ax[0, 2].set_ylim(0, 5)
    df.iloc[-Nlast:].drop('safe', axis=1).plot(ax=ax[1, 1], logy=True)
    for i in range(ax.shape[1]):
        for tick in ax[1, i].get_xticklabels():
            tick.set_rotation(30)
    fig.suptitle('Estimation de R0 tout au long de la période', fontsize=12)
plt.show()
Estimation de R0 tout au long de la période

Graphe sur les dernières valeurs.

dfcoeflast = dfcoef.iloc[-30:, :]
dflast = df.iloc[-30:, :]

fig, ax = plt.subplots(2, 3, figsize=(14, 6), sharex=True)
with warnings.catch_warnings():
    warnings.simplefilter("ignore", MatplotlibDeprecationWarning)
    dfcoeflast[["mu", "nu"]].plot(ax=ax[0, 0], logy=True)
    dfcoeflast[["beta"]].plot(ax=ax[0, 1], logy=True)
    dfcoeflast[["loss_l1"]].plot(ax=ax[1, 0], logy=True)
    dfcoeflast[["R0", "R0=1"]].plot(ax=ax[0, 2])
    ax[0, 2].set_ylim(0, 5)
    dfcoeflast[["a_", "b", "c", "cn"]].plot(ax=ax[1, 2])
    dflast.drop('safe', axis=1).plot(ax=ax[1, 1], logy=True)
    for i in range(ax.shape[1]):
        for tick in ax[1, i].get_xticklabels():
            tick.set_rotation(30)
    fig.suptitle('Estimation de R0 sur la fin de la période', fontsize=12)
plt.show()
Estimation de R0 sur la fin de la période

Prédictions

Ce ne sont pas seulement des prédictions mais des prédictions en boucle à partir d’un état initial. On utilise la méthode simulate.

predictions = model.simulate(X[-30:], 21)
df = pandas.DataFrame(
    predictions[9], columns='Spred Ipred Rpred Dpred'.split()).set_index(
        pandas.to_datetime(dates[-21:]))
df.tail()
Spred Ipred Rpred Dpred
2021-10-11 60099320.0 84943.882812 6663576.5 116180.312500
2021-10-12 60095452.0 82160.156250 6668464.0 116271.953125
2021-10-13 60091708.0 79467.484375 6673191.5 116360.593750
2021-10-14 60088092.0 76862.890625 6677763.5 116446.328125
2021-10-15 60084592.0 74343.523438 6682186.0 116529.250000


On représente les prédictions. Ipred est la valeur prédite, Itrue est la valeur connue. Idem pour Dpred et Dtrue.

fig, ax = plt.subplots(2, 3, figsize=(14, 6))

df = pandas.DataFrame(
    predictions[9], columns='S Ipred R Dpred'.split()).set_index(
        pandas.to_datetime(dates[-21:]))
df[["Ipred"]].plot(ax=ax[0, 0])
df[["Dpred"]].plot(ax=ax[1, 0])
df = pandas.DataFrame(X[-21:], columns='S Itrue R Dtrue'.split()
                      ).set_index(pandas.to_datetime(dates[-21:]))
df[["Itrue"]].plot(ax=ax[0, 0])
df[["Dtrue"]].plot(ax=ax[1, 0])
ax[0, 0].set_title("Prediction à partir de %s" % dates[-21])

dt = pandas.to_datetime(dates[-7])
dates2 = pandas.to_datetime([dt + timedelta(i) for i in range(21)])
df = pandas.DataFrame(
    predictions[-7], columns='S Ipred R Dpred'.split()).set_index(dates2)
df[["Ipred"]].plot(ax=ax[0, 1])
df[["Dpred"]].plot(ax=ax[1, 1])
df = pandas.DataFrame(X[-7:], columns='S Itrue R Dtrue'.split()
                      ).set_index(pandas.to_datetime(dates[-7:]))
df[["Itrue"]].plot(ax=ax[0, 1])
df[["Dtrue"]].plot(ax=ax[1, 1])
ax[0, 1].set_title("Prediction à partir de %s" % dates[-7])

dt = pandas.to_datetime(dates[-1])
dates2 = pandas.to_datetime([dt + timedelta(i) for i in range(21)])
df = pandas.DataFrame(
    predictions[-7], columns='S Ipred R Dpred'.split()).set_index(dates2)
df[["Ipred"]].plot(ax=ax[0, 2])
df[["Dpred"]].plot(ax=ax[1, 2])
ax[0, 1].set_title("Prediction à partir de %s" % dates[-1])
plt.show()
Prediction à partir de 9/25/21, Prediction à partir de 10/15/21

Ces prédictions varient beaucoup car une petite imprécision sur l’estimation a beaucoup d’impact à moyen terme.

Total running time of the script: ( 22 minutes 29.022 seconds)

Gallery generated by Sphinx-Gallery