#+TITLE: Quelques statistiques de base #+AUTHOR: Samuel Loury #+DATE: [2020-06-23 Tue] #+LANGUAGE: fr # #+PROPERTY: header-args :eval never-export #+HTML_HEAD: #+HTML_HEAD: #+HTML_HEAD: #+HTML_HEAD: #+HTML_HEAD: #+HTML_HEAD: * Comment calculer quelques statistiques de base ** L'entrée On considère cette série : #+NAME: input | 14.0 | 7.6 | 11.2 | 12.8 | 12.5 | 9.9 | 14.9 | 9.4 | 16.9 | 10.2 | 14.9 | 18.1 | 7.3 | 9.8 | 10.9 | 12.2 | 9.9 | 2.9 | 2.8 | 15.4 | 15.7 | 9.7 | 13.1 | 13.2 | 12.3 | 11.7 | 16.0 | 12.4 | 17.9 | 12.2 | 16.2 | 18.7 | 8.9 | 11.9 | 12.1 | 14.6 | 12.1 | 4.7 | 3.9 | 16.9 | 16.8 | 11.3 | 14.4 | 15.7 | 14.0 | 13.6 | 18.0 | 13.6 | 19.9 | 13.7 | 17.0 | 20.5 | 9.9 | 12.5 | 13.2 | 16.1 | 13.5 | 6.3 | 6.4 | 17.6 | 19.1 | 12.8 | 15.5 | 16.3 | 15.2 | 14.6 | 19.1 | 14.4 | 21.4 | 15.1 | 19.6 | 21.7 | 11.3 | 15.0 | 14.3 | 16.8 | 14.0 | 6.8 | 8.2 | 19.9 | 20.4 | 14.6 | 16.4 | 18.7 | 16.8 | 15.8 | 20.4 | 15.8 | 22.4 | 16.2 | 20.3 | 23.4 | 12.1 | 15.5 | 15.4 | 18.4 | 15.7 | 10.2 | 8.9 | 21.0 | ** Les calculs :PROPERTIES: :ID: 5354d0c3-8cd0-4ba0-a6a3-b6db4565e9df :END: L'énoncé est « Calculer la moyenne et l'écart-type, le min, la médiane et le max des données suivantes ». Ceci se fait en une seule ligne de code avec pandas. #+NAME: describe #+BEGIN_SRC python :results value :var i=[[]] :exports code :session 5354d0c3-8cd0-4ba0-a6a3-b6db4565e9df from pandas import DataFrame desc = DataFrame(i).T.describe() #+END_SRC Malheureusement et étonnamment, org-mode ne fournit pas de moyen rapide d'afficher proprement un DataFrame. Il faut jouer avec la syntaxe org mode pour arriver à un résultat satisfaisant. Pour exporter l'index, il est préférable de le passer en colonne. #+NAME: index_as_column #+BEGIN_SRC python :results none :exports code :session 5354d0c3-8cd0-4ba0-a6a3-b6db4565e9df desc = desc.reset_index(level=0) #+END_SRC Puis, on doit sortir le tableau dans un format que emacs sait interpréter. #+NAME: fixup_desc #+BEGIN_SRC python :results value :exports code :session 5354d0c3-8cd0-4ba0-a6a3-b6db4565e9df [list(desc)] + [None] + desc.values.tolist() #+END_SRC #+NAME: code #+BEGIN_SRC python :results value :exports none :var i=input :noweb yes :session 5354d0c3-8cd0-4ba0-a6a3-b6db4565e9df <> <> <> #+END_SRC Enfin, pour afficher les résultats avec 2 chiffres après la virgule, il faut jouer avec l'affichage d'emacs. On définit un post processing qui transformera les nombres en leur équivalent formatté convenablement. #+NAME: round-tbl #+BEGIN_SRC emacs-lisp :export code :var tbl="" fmt="%.3f" (mapcar (lambda (row) (mapcar (lambda (cell) (if (numberp cell) (format fmt cell) cell)) row)) tbl) #+end_src On peut maintenant appeler le code et observer le résultat suivant : #+NAME: results #+CALL: code(input) :export both :post round-tbl(*this*, "%.2f") #+RESULTS: results | count | 100.00 | | mean | 14.11 | | std | 4.33 | | min | 2.80 | | 25% | 11.85 | | 50% | 14.50 | | 75% | 16.80 | | max | 23.40 |