Aller au contenu

Reprise de l'ancien projet spatial

Cette page audite la reprise des éléments des notebooks historiques Notebooks/ dans le pipeline local parking_search_prediction.

Synthèse

Les éléments centraux de l'approche spatiale sont repris : préparation des legs, filtres qualité, sélection des déplacements voiture-marche vers Genève, sélection de la dernière leg voiture, seuils géométriques, distance dans le buffer, durée interpolée, passage près de l'activité, boucles, tortuosité, distance de marche après stationnement, variables descriptives PL23 et cartes de contrôle.

Les modifications principales sont :

  • les notebooks historiques sont transformés en modules Python testables et scripts relançables ;
  • PL23 est lu depuis le GPKG layer_GE, pas depuis le pickle historique complet par défaut ;
  • l'approche Déclic ajoute une jointure temporelle waypoint-leg et une approche temporelle ReLUT qui n'existaient pas dans l'ancien projet ;
  • dist_excess est produit par les étapes 25 à 27 via un cache xyt_routing local ; les échecs de routage et cas extrêmes restent à contrôler avant validation ;
  • le filtre géographique Genève est explicite côté PL23, mais reste à décider et implémenter côté Déclic si les legs disponibles dépassent le périmètre institutionnel visé ;
  • les cellules H3 historiques de zones tunnel sont réactivées dans les règles d'éligibilité, avec flags d'exclusion exportés ;
  • les courbes cumulées, cartes H3 thématiques et graphiques survey généraux sont réintégrés via l'étape 24 ;
  • l'analyse communale est prête côté code, mais reste conditionnée à la fourniture d'une couche communale validée.

Conclusion de la passe d'audit : les blocs méthodologiques utiles au protocole spatial de base sont soit repris, soit remplacés par une implémentation plus reproductible, soit explicitement mis en attente. Les seuls blocs qui restent hors pipeline actif sont ceux qui dépendent d'un matching externe, d'une pondération statistique à valider, ou d'une couche géographique supplémentaire.

Matrice de reprise

Élément archive Statut nouveau pipeline Commentaire
safe_merge Repris conceptuellement Les merges sont désormais explicites dans les modules, avec colonnes contrôlées.
Lecture PL23 legs.pkl Modifié L'étape 23 lit 241120_legs.gpkg, couche layer_GE, pour un run plus reproductible et moins coûteux en mémoire.
Filtres qualité usr_w_constant_bad_signal, low_quality_legs_2, extreme99_length_mode Repris Appliqués si les colonnes existent dans la source.
Conservation des lignes Track Repris Appliqué dans Déclic et PL23.
Jointure leg_idtrip_id Repris Via les fichiers map disponibles dans chaque source.
Destination dans Genève Partiel PL23 utilise leading_activity_in_KT == GE et l'appariement leading_stay_id == leading_activity_id. Côté Déclic, aucun spatial join canton Genève explicite n'est encore appliqué ; ce filtre est classé comme point ouvert méthodologique.
Modes Walk + Car Modifié Repris, avec ajout explicite de Mode::Ecar. Les autres modes restent exclus par défaut.
Durée maximale trip 5h Repris à l'identique max_trip_duration_seconds: 18000.
Dernière leg voiture du déplacement Repris La sélection est faite par ordre temporel intra-trip_id.
Durée minimale leg 5 min Repris à l'identique min_leg_duration_seconds: 300.
Longueur minimale leg 500 m Repris à l'identique min_leg_length_m: 500.
Vitesse 1-150 km/h Repris à l'identique min_speed_kmh: 1, max_speed_kmh: 150.
Distance origine-destination minimale 75 m Repris à l'identique min_origin_destination_distance_m: 75.
Distance stationnement-activité maximale 2000 m Repris à l'identique max_parking_activity_distance_m: 2000.
Buffer destination 1000 m Repris à l'identique destination_buffer_m: 1000.
Distance suspecte dans buffer 2500 m Repris à l'identique suspicious_dist_buffer_m: 2500.
Passage près de l'activité, rayon 25 m, exclusion finale 150 m Repris à l'identique activity_location_radius_m: 25, exclusion_end_segment_m: 150.
point_entry_buffer Repris sous forme WKB spatial_entry_point_wkb_2056 est écrit et consommé par l'étape 25.
dist_buffer Renommé spatial_search_distance_m.
duration_buffer Renommé et calcul équivalent spatial_search_duration_seconds, calculé par fraction de longueur sous hypothèse de vitesse constante.
Interpolation temporelle sur LineString 3D Modifié Le nouveau pipeline ne stocke pas une géométrie 3D complète ; il calcule les timestamps de début/fin de portion par prorata de longueur. Hypothèse équivalente de vitesse constante.
suspicious_cruising_activity_location Repris spatial_passes_near_activity_before_end.
Distance parking-activité Repris parking_activity_distance_m.
Distance de marche après voiture Repris pour PL23 et Déclic subsequent_walk_distance_m. Côté Déclic, la variable est calculée à partir des legs postérieures à la dernière leg voiture lorsque ces legs sont en marche.
Boucles geometry.is_simple Repris avec prudence Inclus dans la règle large, exclu de la règle conservatrice.
Tortuosité du segment final Repris spatial_tortuosity_last_segment, seuil tortuosity_min: 2.0.
H3 résolution 8 Repris pour les exclusions tunnel h3_resolution: 8 est utilisé pour calculer h3_index_destination. L'EDA territoriale reste en grille métrique EPSG:2056.
Exclusion H3 tunnels Repris avec traçabilité Les destinations dans les cellules tunnel historiques sont flaggées (spatial_excluded_tunnel_zone, spatial_exclusion_reason) puis exclues de spatial_eligible.
Cartes H3 Repris, sortie consolidée Les statistiques H3 restent produites en étape 24. La carte active de restitution territoriale est désormais territorial_h3_hotspots.html, pour éviter de multiplier les cartes redondantes.
Cartes de legs avec buffer, activité, stationnement, portion détectée Repris comme diagnostic Les cartes HTML d'exemples Déclic et PL23 restent régénérables depuis les notebooks dédiés. Elles ne sont plus conservées par défaut dans Output/maps. La relecture prioritaire se fait via relut_full_leg_probability_sample.html et routing_geometry_comparison.html.
dist_excess Google Maps Adapté Aucun appel API externe par défaut. Les paires de routage sont préparées en étape 25 et peuvent être routées via xyt_routing local en étape 26.
Test OSRM public Remplacé Remplacé par l'appel à xyt_routing local, avec weighting: distance.
Filtre canton Genève Déclic Non repris À ajouter si le périmètre Déclic ne doit pas couvrir toutes les legs disponibles dans legs.parquet.
CO2 181.9 g/km Modifié Nouveau facteur par défaut 111 g/km, avec analyse de sensibilité incluant notamment 180 g/km.
Pondération wgt_agg_trim_gps Partiel Non utilisée dans les agrégations livrables actuelles ; à ajouter si les résultats PL23 doivent être extrapolés statistiquement.
Motif agrégé Repris pour PL23 purpose_agg, même regroupement que l'ancien notebook.
Jour de semaine Repris pour PL23 weekday.
Tranche horaire de fin Repris pour PL23 time_of_day_end_trip, mêmes bins.
Stationnement domicile/travail Repris pour PL23 space_home, space_work, dérivés du questionnaire.
Zones domicile/travail Repris pour PL23 zone_domicile, zone_travail.
Classe ARE domicile Repris pour PL23 KLASSE_ARE_dom.
Tableaux par motif, jour, heure, stationnement Repris pour PL23 pl23_spatial_group_summary.csv.
Exports pickle legs_cruising_to_analyse.pkl Remplacé Exports Parquet/CSV documentés et dictionnaire de variables.

Checklist détaillée WP1 / WP2 / WP3

Cette checklist reprend les blocs observés dans les notebooks archivés WP1_Data_prep.ipynb et WP2_WP3.ipynb.

Bloc archive Statut Où / décision dans le nouveau pipeline
Lecture legs.pkl, trips.csv, user_statistics.csv, map_track_trip_journey.csv, staypoints.geojson, survey.csv Repris avec modification PL23 est lu par défaut depuis Data/GPS/pl23/20241120_dump_situee/241120_legs.gpkg, couche layer_GE. Les variables déjà jointes à la couche sont réutilisées. Les fichiers CSV historiques restent des sources de référence, mais ne sont plus relus systématiquement si la couche consolidée suffit.
Lecture frontières cantonales et communales swisstopo Partiel Le filtre Genève PL23 repose sur la couche layer_GE et les champs disponibles. L'analyse communale est implémentée en étape 24, mais reste inactive tant qu'une couche communale validée n'est pas configurée.
Filtres qualité usr_w_constant_bad_signal, low_quality_legs_2, extreme99_length_mode Repris Les colonnes sont appliquées quand elles existent. Le code reste tolérant aux sources qui ne portent pas exactement les mêmes champs.
Jointure leg_id / trip_id par safe_merge Repris avec modification Les jointures sont explicites dans les modules Python. safe_merge n'est pas conservé comme fonction centrale, mais son objectif de contrôle des clés est repris.
Projection EPSG:2056 Repris Les calculs métriques sont faits en EPSG:2056 pour Déclic et PL23.
Identification des trips arrivant dans le canton de Genève via staypoints et frontière cantonale Partiel Repris côté PL23 par la couche layer_GE et les champs d'activité. Non encore repris côté Déclic : TODO-METH-02.
Conservation des trips dont les modes sont voiture et marche uniquement Repris avec extension La logique voiture puis marche est conservée. Mode::Ecar est ajouté aux modes voiture.
Exclusion des trips de plus de 5 h Repris Paramètre max_trip_duration_seconds: 18000.
Définition valid_legs et legs_study_cruising Repris La dernière leg voiture du trip devient l'unité spatiale de détection.
Calcul origine, destination, distance O-D, distance parking-activité Repris Variables équivalentes exportées, dont parking_activity_distance_m.
Filtres durée, longueur, vitesse, distance parking-activité, distance O-D Repris Seuils historiques conservés.
Export intermédiaire pour map-matching manuel dans un autre repo Non repris L'archive indique que ce map-matching n'a finalement pas été appliqué. Le nouveau pipeline ne dépend pas d'un traitement manuel externe.
Filtre qualité map-matching OSRM, ratio trace / trace matchée et seuils de confiance Mis de côté Non actif dans le protocole historique final et non reproductible sans chaîne de matching locale. À réévaluer seulement si le futur routeur local fournit aussi un matching contrôlé.
H3 destination, résolution 8 Repris pour exclusion h3_index_destination est calculé pour appliquer le filtre tunnel.
Exclusion des cellules H3 tunnel Repris Les 11 cellules historiques sont conservées, avec flags spatial_excluded_tunnel_zone, spatial_exclusion_reason et compteur avant/après exclusion.
Vérifications visuelles initiales des legs et destinations Repris autrement Cartes Folium d'exemples et figures de distributions/sensibilité remplacent les plots exploratoires dispersés des notebooks archivés.
Fonction filter_final_legs_trips et cohérence final legs / final trips Repris conceptuellement La cohérence trip/legs est internalisée dans la sélection des legs candidates. Le fichier unique final_legs historique est remplacé par des bases candidates documentées.
Ajout du poids wgt_agg_trim_gps / Weight Partiel Weight est conservé côté PL23 si disponible. Les résultats livrables actuels ne sont pas pondérés. La pondération reste un point ouvert avant indicateur officiel.
Heure de fin du trajet et bins de moment de journée Repris time_of_day_end_trip est produit.
Jour de semaine Repris weekday est produit.
Motifs agrégés Repris purpose_agg est produit selon le regroupement historique.
Variables survey de stationnement domicile/travail Repris pour PL23 space_home et space_work sont exportées et utilisées dans les résumés par groupe. Non applicable tel quel à Déclic si les variables questionnaire ne sont pas présentes.
Zones domicile/travail et classe ARE Repris pour PL23 zone_domicile, zone_travail, KLASSE_ARE_dom sont exportées si disponibles.
Graphiques descriptifs survey stationnement général Repris en étape 24 geometric_survey_parking_graphs.png, à partir des variables disponibles.
Interpolation des timestamps sur LineString 3D Repris avec modification Le pipeline ne persiste pas une LineString 3D ; il calcule les heures de début/fin de portion par prorata de longueur, sous la même hypothèse de vitesse constante.
Export legs_cruising_to_analyse.pkl Remplacé Exports Parquet/CSV et dictionnaires de variables.
Export shared_values.json avec nb_jours_obs Mis de côté Nécessaire uniquement pour l'extrapolation par personne/jour. À restaurer avec la stratégie de pondération.
Création du buffer destination-activité Repris Buffer de 1000 m.
Extraction du dernier segment dans le buffer Repris Portion finale affectée exportée en WKB.
Point d'entrée dans le buffer Repris spatial_entry_point_wkb_2056, consommé par 25_prepare_routing_candidates.py.
Carte d'un déplacement complet et zoom destination Repris autrement Cartes HTML d'exemples Déclic et PL23.
dist_buffer et seuil 2500 m Repris avec renommage spatial_search_distance_m, spatial_candidate_broad / spatial_candidate_conservative.
Cumplots dist_buffer globaux Repris en étape 24 geometric_cumplots_indicators.png. Les déclinaisons par groupe restent à produire seulement si nécessaires au rapport.
Tableaux dist_buffer par motif, jour, heure, stationnement Repris avec consolidation pl23_spatial_group_summary.csv et résultats globaux par approche.
duration_buffer Repris avec renommage spatial_search_duration_seconds, calculé par interpolation linéaire temporelle.
Cumplots et tableaux duration_buffer Repris en étape 24 Courbes cumulées globales produites ; résumés par groupes disponibles côté PL23.
Passage près de l'activité avant la fin Repris spatial_passes_near_activity_before_end.
Distance parking-activité Repris parking_activity_distance_m.
Marche après stationnement Repris subsequent_walk_distance_m, y compris la logique voiture suivie de marche.
dist_excess via Google Directions API Adapté Remplacé par un contrat routeur local. Les paires entrée buffer → destination sont préparées ; Google pourra servir d'audit ponctuel si nécessaire.
Cache de routes Google, polyline encodée, shortest path décodé Adapté Cache Parquet routing_results.parquet prévu avec distance, durée, statut, versions et géométrie GeoJSON optionnelle.
Test OSRM public Remplacé Remplacé par xyt_routing local pour éviter une dépendance à un service public non contrôlé.
Seuil suspicious_dist_excess = 200 m Préparé routing.suspicious_dist_excess_m: 200; actif dans 27_apply_routing_dist_excess.py lorsque les résultats routés existent.
CO2 historique sur dist_excess Modifié Les sorties actuelles convertissent les distances affectées, pas un excès routé. Le facteur par défaut est paramétrable.
Cartes H3 dist_buffer, marche, legs suspectes Repris en étape 24 Carte H3 thématique et table H3 produites. Les couches fondées sur dist_excess pourront être ajoutées après l'étape 27.
Sélection et visualisation des legs suspectes dist_excess Préparé La sélection spatial_suspicious_dist_excess sera produite après routage. Les cartes d'exemples restent à étendre avec la géométrie routée.
Analyse des legs suspectes par motif, heure, jour Partiel Résumés par groupes disponibles côté spatial ; l'analyse spécifique dist_excess > 200 m dépend du cache routé.
Extrapolation dist_excess par jour-personne puis population arc lémanique Mis de côté Non robuste sans dist_excess, pondération validée et population de référence validée. À traiter avant indicateur officiel.
Analyse des profils des personnes suspectes, stationnement, classe ARE, zones Partiel Variables conservées et résumés généraux produits. Les profils des seuls cas dist_excess > 200 m seront restaurés lorsque cette Base_3 sera recalculée.
Annexe boucles geometry.is_simple Repris avec prudence Signal inclus dans la règle large, exclu de la règle conservatrice, documenté comme indicateur de forme non suffisant seul.
Annexe tortuosité Repris spatial_tortuosity_last_segment, seuil 2.0 configurable.
Annexe analyse communale Implémenté, conditionnel L'étape 24 produit geometric_commune_summary si une couche communale validée est fournie.
Annexe temps dans la dernière zone Mis de côté Redondant avec spatial_search_duration_seconds sauf définition territoriale différente à préciser.
Annexe vitesse du dernier segment Mis de côté Diagnostic possible, mais non utilisé dans les règles de détection. À ajouter seulement si utile pour contrôle qualité ou validation terrain.

Seuils modifiés ou ajoutés

Paramètre Archive Nouveau pipeline Statut
max_duration_trips 18 000 s 18 000 s identique
min_duration_leg_study_cruising 300 s 300 s identique
min_length_leg_study_cruising 500 m 500 m identique
min_speed_leg_study_cruising 1 km/h 1 km/h identique
max_speed_leg_study_cruising 150 km/h 150 km/h identique
distance_o_d_min 75 m 75 m identique
distance_parking_activity_max 2 000 m 2 000 m identique
buffer 1 000 m 1 000 m identique
exclusion_end_segment 150 m 150 m identique
radius_activity_location 25 m 25 m identique
suspicious_dist_buffer 2 500 m 2 500 m identique
suspicious_dist_excess 200 m 200 m actif après application du cache routé
co2_factor_cars 181.9 g/km 111 g/km par défaut, sensibilité configurable modifié
h3_resolution 8 8 pour le filtre tunnel ; grille métrique 1 km pour l'EDA partiel

Conséquences analytiques

La règle large du nouveau pipeline est plus explicitement assumée comme règle de repérage sensible. Elle combine distance dans le buffer, passage près de l'activité, boucle et tortuosité. La règle conservatrice permet de relire les résultats sans boucles ni tortuosité.

Les chiffres produits par le nouveau pipeline ne doivent donc pas être présentés comme une reproduction stricte du résultat PL23 historique tant que le cache dist_excess_m n'est pas produit. L'exclusion H3 des tunnels est réactivée. Les cartes H3 thématiques, les courbes cumulées et les graphiques survey sont désormais produits par l'étape 24. L'analyse communale dépend encore d'une couche communale configurée.

Les points ouverts méthodologiques issus de cette reprise sont décrits dans methodologie/points-ouverts.md : cache routé dist_excess, filtre géographique Genève côté Déclic, pondération/extrapolation PL23, couche communale à fournir si analyse communale, et éventuel matching qualité local.