Un indice des prix non reproductible : jointure et arithmétique flottante
Le service calcule chaque mois un indice de prix local à partir de 12 millions de transactions. Le pipeline joint la table des transactions à la table des communes sur le code commune : dans les transactions, le code est stocké en texte et conserve les zéros initiaux ; dans la table de référence, il est stocké en entier. Résultat : 3,2 % des lignes ne sont pas appariées, concentrées sur les communes de l'Ouest. De plus, l'agrégation utilise une moyenne pondérée avec des flottants et un ORDER BY non déterministe sur les arrondis. Deux exécutions successives du même mois donnent 104,27 et 104,12. Le directeur doit publier l'indice demain. Le pipeline tourne sous Python avec une base PostgreSQL ; il n'existe pas de test automatisé. Vous êtes chargé de diagnostiquer et de corriger.
1. Diagnostiquer les causes de l'écart entre les deux exécutions et proposer des corrections reproductibles.
Read the worked answer
Deux causes se cumulent. (1) La jointure sur le code commune échoue pour les codes à zéro initial : côté transactions, « 01000 » est du texte ; côté communes, 1000 est un entier. PostgreSQL compare texte et entier après cast implicite, mais « 01000 » devient 1000 seulement si le cast est explicite ; sinon la jointure ne matche pas. D'où 3,2 % de non-appariés concentrés dans les départements à codes commençant par 0. Correction : normaliser la clé (LPAD(code,5,'0') ou CAST en entier des deux côtés), contrôler le taux d'appariement, et journaliser les rejets. (2) L'agrégation flottante avec ORDER BY non déterministe change l'ordre des additions ; l'addition en virgule flottante n'est pas associative, d'où l'écart 104,27/104,12. Correction : sommer en entier (centimes) ou en Decimal, trier explicitement avant agrégation, arrondir une seule fois à la fin. Ajouter un test qui rejoue le calcul deux fois et compare un hash.
2. Décrire les contrôles à mettre en place avant publication et la conduite à tenir vis-à-vis du directeur.
Read the worked answer
Contrôles bloquants : (a) rapprochement du total des transactions avant/après jointure (au moins 99,5 % d'appariement) ; (b) contrôle de la distribution des codes non appariés par département ; (c) calcul de l'indice en deux passes avec des méthodes différentes (Decimal et flottant trié) et tolérance inférieure à 0,01 ; (d) jeu de données de test avec des codes à zéro initial ; (e) revue par un pair du script. Conduite : informer le directeur que l'indice de 104,27 n'est pas reproductible et que la publication doit être différée ou accompagnée d'une note. Ne pas choisir la valeur qui arrange. Proposer un correctif immédiat, un rerun, et une communication factuelle : « l'indice initial était affecté d'un défaut de jointure ; la valeur corrigée est X ». Si la date de publication est réglementaire, publier avec la mention provisoire et corriger ensuite.