diff --git a/module2/exo4/daily.png b/module2/exo4/daily.png index 4759aa84b5e7356db2c50e4a073019fd4ff8d52a..613f1b2f5b5ff513a6fa3b67ad8dbcc452d49c10 100644 Binary files a/module2/exo4/daily.png and b/module2/exo4/daily.png differ diff --git a/module2/exo4/exercice_python_fr.org b/module2/exo4/exercice_python_fr.org index d8a6ecd206facac8582fec3737d8e1eca0e9125c..7b66d598bc9a44b4c96869ca628d30cacb7e9ab3 100644 --- a/module2/exo4/exercice_python_fr.org +++ b/module2/exo4/exercice_python_fr.org @@ -11,18 +11,39 @@ #+HTML_HEAD: +* Identification du système + +#+BEGIN_SRC shell :exports both + uname -a +#+END_SRC + +#+RESULTS: +: Linux aluminium 4.14.0-3-amd64 #1 SMP Debian 4.14.17-1 (2018-02-14) x86_64 GNU/Linux + +#+BEGIN_SRC python :results value :session :exports both + import sys + sys.version +#+END_SRC + +#+RESULTS: +: 3.7.3rc1 (default, Mar 13 2019, 11:01:15) +: [GCC 8.3.0] + + * Récupération des données On prend les données distribuées par [[https://ourworldindata.org][Our World In Data]], elles-mêmes issues de l'[[https://www.ecdc.europa.eu/][ECDC]] : -#+BEGIN_SRC python :results none :session :exports none +#+BEGIN_SRC python :results output :session :exports none import numpy as np import matplotlib.pyplot as plt import pandas as pd plt.style.use('seaborn') #+END_SRC +#+RESULTS: + #+BEGIN_SRC python :results value :session :exports both url = "https://covid.ourworldindata.org/data/ecdc/full_data.csv" data_raw = pd.read_csv(url, index_col='date') @@ -32,9 +53,10 @@ l'[[https://www.ecdc.europa.eu/][ECDC]] : #+RESULTS: : location new_cases new_deaths total_cases total_deaths : date -: 2020-04-04 Zimbabwe 1 0 9 1 -: 2020-04-05 Zimbabwe 0 0 9 1 : 2020-04-06 Zimbabwe 0 0 9 1 +: 2020-04-07 Zimbabwe 0 0 9 1 +: 2020-04-08 Zimbabwe 1 0 10 1 + * Evolution comparée de l'épidémie dans quelques pays @@ -43,6 +65,37 @@ comparable d'un pays à l'autre que, par exemple, le nombre de cas dépistés. A de recaler l'axe temporel, on positionne $t=0$ au moment où le nombre total de morts dépasse 100. +La logique est la suivante : on considère le nombre $n^c$ (de décès ou de cas) +dans un pays $c$. On suppose que l'évolution de $n^c$ en fonction du temps $t$ +suit une loi de croissance exponentielle (au moins dans une phase initiale). On +s'attend ainsi à avoir une expression du type : +\[ + n^c(t) = n^c_0 \, e^{\lambda^c \left(t-t^c_0\right)}. +\] +Dans cette expression, la valeur initiale $n^c_0 = n^c(t^c_0)$ est liée à la +taille de la population considérée. La constante de temps $\lambda^c$ en revanche, +n'a pas vraiment de raison de l'être : elle reflète simplement le rythme auquel +l'épidémie se propage. + +Si l'on se donne un seuil $\tau$ unique, on peut fixer pour chaque pays +l'instant initial $t^c_0$ de sorte que +\[ + n^c(t^c_0) = \tau. +\] +En effectuant un recalage de l'instant initial, c'est à dire en effectuant le +changement de variable temporelle $\tilde{t}^c=t-t^c_0$, on obtient +\[ + n^c(\tilde{t}^c) = \tau \, e^{\lambda^c\,\tilde{t}^c}, +\] +ce qui signifie que tous les pays deviennent comparables, indépendamment de leur +taille : on s'est ramené à comparer les constantes de temps $\lambda^c$ entre +elles. + +En pratique, on prend +\[ + t^c_0 = \min \left\{t ; n^c(t) > \tau \right\}. +\] + #+BEGIN_SRC python :results value :exports both :session # Parameters column = "total_deaths" @@ -53,21 +106,44 @@ morts dépasse 100. for country in countries: total[country] = data_raw.query(f"location == '{country}' & {column} > {threshold}") - daily[countries[0]].head(3) + total[countries[0]] #+END_SRC #+RESULTS: -: location new_cases new_deaths total_cases total_deaths -: date -: 2020-03-14 France 785 18 3661 79 -: 2020-03-16 France 924 36 5423 127 -: 2020-03-17 France 1210 21 6633 148 +#+begin_example + location new_cases new_deaths total_cases total_deaths +date +2020-03-16 France 924 36 5423 127 +2020-03-17 France 1210 21 6633 148 +2020-03-18 France 1097 27 7730 175 +2020-03-19 France 1404 69 9134 244 +2020-03-20 France 1861 128 10995 372 +2020-03-21 France 1617 78 12612 450 +2020-03-22 France 1847 112 14459 562 +2020-03-23 France 1559 112 16018 674 +2020-03-24 France 3838 186 19856 860 +2020-03-25 France 2446 240 22302 1100 +2020-03-26 France 2931 231 25233 1331 +2020-03-27 France 3922 365 29155 1696 +2020-03-28 France 3809 299 32964 1995 +2020-03-29 France 4611 319 37575 2314 +2020-03-30 France 2599 292 40174 2606 +2020-03-31 France 4376 418 44550 3024 +2020-04-01 France 7578 499 52128 3523 +2020-04-02 France 4861 509 56989 4032 +2020-04-03 France 2116 471 59105 4503 +2020-04-04 France 5233 2004 64338 6507 +2020-04-05 France 4267 1053 68605 7560 +2020-04-06 France 1873 518 70478 8078 +2020-04-07 France 3912 833 74390 8911 +2020-04-08 France 3777 1417 78167 10328 +#+end_example #+BEGIN_SRC python :session :results output file :exports results :var pltfile="total.png" plt.figure(figsize=(10,5)) for country in total.keys(): x = total[country]['total_deaths'] - plt.plot(numpy.arange(len(x)), x, label=country, linewidth=3) + plt.plot(np.arange(len(x)), x, label=country, linewidth=3) plt.xlabel(f"Number of days since {column} > {threshold}") plt.yscale("log") plt.legend(fontsize='x-large') @@ -95,21 +171,23 @@ de morts dépasse 15. for country in countries: daily[country] = data_raw.query(f"location == '{country}' & new_deaths > {threshold}") - daily[countries[0]].head(3) + daily[countries[0]].tail(3) #+END_SRC #+RESULTS: : location new_cases new_deaths total_cases total_deaths : date -: 2020-03-14 France 785 18 3661 79 -: 2020-03-16 France 924 36 5423 127 -: 2020-03-17 France 1210 21 6633 148 +: 2020-04-04 France 5233 2004 64338 6507 +: 2020-04-05 France 4267 1053 68605 7560 +: 2020-04-06 France 1873 518 70478 8078 +: 2020-04-07 France 3912 833 74390 8911 +: 2020-04-08 France 3777 1417 78167 10328 #+BEGIN_SRC python :session :results output file :exports results :var pltfile="daily.png" plt.figure(figsize=(10,5)) for country in daily.keys(): x = daily[country]['new_deaths'] - plt.plot(numpy.arange(len(x)), x, label=country, linewidth=3) + plt.plot(np.arange(len(x)), x, label=country, linewidth=3) plt.xlabel(f"Number of days since daily deaths > {threshold}") plt.yscale("log") plt.legend(fontsize='x-large') @@ -121,3 +199,8 @@ de morts dépasse 15. #+RESULTS: [[file:daily.png]] + +# Local Variables: +# org-babel-python-command: "python3" +# org-confirm-babel-evaluate: nil +# End: diff --git a/module2/exo4/total.png b/module2/exo4/total.png index 67b3ef5aca56e58b20932b5aef8d3ff9bf545332..7049bc19f11416b0d42acf2e1656f4fe90e47e21 100644 Binary files a/module2/exo4/total.png and b/module2/exo4/total.png differ