cassionAnalyse de données

Atelier · Intermédiaire

Faites-le tourner sur l'ordinateur de quelqu'un d'autre

On vous remet une analyse qui fonctionne, dans un seul carnet, avec des chemins codés en dur, aucun fichier d'environnement et un graphique exporté à la main. Transformez-la en quelque chose qu'un collègue peut cloner et exécuter — et prouvez-le en l'exécutant là où elle n'est jamais allée.

PythonVotre propre machine180 min

L’analyse fonctionne. Elle produit une estimation de MAG par commune, un graphique et un paragraphe pour le rapport de cluster, et elle le fait depuis quatre mois.

C’est un seul carnet. Le chemin vers les données est /Users/aline/Downloads/muac.csv, le graphique a été exporté par un clic droit, la graine est là où le hasard de numpy l’a laissée, et la personne qui l’a écrit part dans trois semaines.

Votre travail est de lui faire survivre à cela.

Le fichier

muac-screening-artibonite-2024.v1.csv — 4 218 dépistages sur douze communes. Traitez-le comme l’export mensuel : il arrive, il est en lecture seule, et celui du mois prochain aura la même forme avec d’autres lignes.

Partie un : l’organisation

Construisez la structure de la leçon 1 et déplacez-y l’analyse. Rien dans src/ ne doit contenir un chemin absolu, et rien ne doit être produit à la main.

project/
  data/raw/          the CSV, read-only, with CHECKSUMS
  src/               one function per step
  outputs/           everything regenerated
  tests/
  run.py             the whole pipeline, one command
  .gitignore         written first
  README.md

Commitez .gitignore avant tout le reste, et assurez-vous que data/raw/* est exclu avec !data/raw/CHECKSUMS laissant revenir l’empreinte.

Partie deux : l’environnement

Initialisez uv, ajoutez ce que l’analyse importe, commitez pyproject.toml et uv.lock. Figez la version de Python sous forme de plage.

Supprimez ensuite votre environnement virtuel et lancez uv sync. S’il manque quelque chose, l’analyse importait une chose qu’elle n’a jamais déclarée.

Partie trois : les quatre sources de différence

Le carnet d’origine en contient au moins trois des quatre de la leçon 4. Trouvez-les et corrigez-les :

  • l’horloge — tout ce qui emploie la date du jour ;
  • la graine — l’analyse bootstrappe un intervalle de confiance ;
  • l’ordre des fichiers — si elle emploie un glob ;
  • la locale — la lecture du CSV et toute analyse de date.

Prouvez-le ensuite. Exécutez la chaîne deux fois vers des répertoires différents et comparez-les. Le diff doit être vide.

python run.py && cp -r outputs outputs-first
rm -rf outputs && python run.py && diff -r outputs outputs-first

Partie quatre : les vérifications

Ajoutez les vérifications de chargement de la leçon 6. Au minimum : colonnes requises présentes, nombre de lignes dans la plage, valeurs de commune dans l’ensemble connu, muac_mm dans une plage plausible, et une assertion que les dénominateurs du résumé totalisent le nombre de dépistages.

Cassez ensuite les données exprès — une copie avec une colonne renommée, une copie tronquée à 500 lignes, une copie avec Anse Rouge au lieu d’Anse-Rouge — et confirmez que chacune arrête la chaîne avec un message nommant le problème.

Partie cinq : prouvez-le ailleurs

git clone . /tmp/handover-test && cd /tmp/handover-test
uv sync
python run.py
diff -r outputs/ ~/project/outputs/

Un clone neuf dans un répertoire temporaire est le minimum. L’ordinateur d’un collègue vaut mieux. Si vous disposez d’une intégration continue, ajoutez un flux qui fait exactement cela à chaque poussée.

Partie six : la passation

Écrivez HANDOVER.md en employant les sept sections de la leçon 7. Les sections 4 et 6 sont celles qui sont évaluées :

La section 4 doit consigner chaque décision que prend votre chaîne et que le code n’explique pas — quelles communes sont normalisées et pourquoi, ce qu’il advient des dépistages sans âge, si les cas d’œdème sont comptés, et quelle est la définition de cas.

La section 6 doit nommer le constat qui sera contesté. Vous savez déjà lequel si vous avez fait le cours de visualisation : le classement des communes.

Vérifiez vos nombres

Attendu
Dépistages 4 218
Communes 12
Dépistages, plus petite et plus grande commune 189 et 768
MAG, district entier (PB ou œdème) 10,3 %
MAG, PB sous 125 mm seulement 9,3 %
Commune la plus haute et la plus basse 15,3 % et 5,6 %
Communes dont l’intervalle dépasse la médiane du district 3
Seconde exécution de la chaîne identique à l’octet près à la première
Exécution depuis un clone neuf identique aux deux

Si vos deux exécutions ne diffèrent que par un fichier de figure, vous avez trouvé l’horodatage dont parle la leçon 4 — les écrivains SVG et PNG en incorporent un à moins qu’on leur dise de ne pas le faire.

Les questions à traiter en prose

Trois phrases chacune.

1. Nommez les sources de différence entre exécutions que vous avez trouvées et comment vous avez trouvé chacune. Pour celles des quatre que vous n’avez pas trouvées, dites pourquoi l’analyse y était déjà immunisée.

2. Vous avez cassé les données de trois façons et chacune a arrêté la chaîne. Pour le fichier tronqué, dites ce que l’analyse aurait rapporté sans la vérification, et à quel point ce nombre aurait paru plausible.

3. Votre section 4 de passation consigne des décisions. Choisissez celle qu’un successeur risque le plus de changer sans réaliser qu’elle compte, et dites quelle en serait la conséquence.

Ce qu’il faut rendre

  • le projet restructuré, exécutable depuis un clone neuf en deux commandes
  • uv.lock, commité
  • tests/ avec les vérifications de chargement, et la preuve que chacune attrape son défaut
  • HANDOVER.md, sept sections
  • la sortie du diff entre deux exécutions et celle du diff depuis un clone neuf, tous deux vides
  • les trois réponses en prose

Comment savoir que c’est fini

Donnez-le à quelqu’un d’autre et regardez-le l’exécuter sans l’aider. Chaque question qu’il pose est une ligne manquante du README ou de la passation, et chaque échec est une dépendance que vous n’avez pas déclarée.

À défaut : supprimez entièrement votre copie locale, clonez depuis le dépôt distant dans un nouveau répertoire, et exécutez. Cela attrape tout sauf ce qui est installé globalement sur votre machine — la seule chose que seule une autre machine trouve.

Ce que ce laboratoire n’est pas

Ce n’est pas une analyse nutritionnelle. L’estimation de MAG est celle que le cours de nutrition a déjà produite, et la reproduire est l’objet plutôt que le constat.

Ce n’est pas non plus une affaire de préférence d’outil. uv et renv sont les outils qu’emploie ce cours ; conda, poetry, pip-tools et packrat satisfont tous la même exigence, à savoir qu’un fichier de verrouillage existe et soit commité. L’exigence est la leçon ; l’outil est un détail qui changera.