Aller au contenu

Configuration YAML

La configuration centrale est config/default.yaml.

project

project:
  name: parking-search-prediction-test
  relut_repo: External/parking-search-prediction
  relut_model_path: External/parking-search-prediction/model/ParkingSearchPrediction.h5

Ce bloc décrit le nom du run et les chemins du dépôt ReLUT.

paths

paths:
  waypoint_glob: Data/GPS/declic/waypoints-sample/*.csv
  legs_file: Data/GPS/declic/cleaned-base/parquet/legs.parquet
  storyline_file: Data/GPS/anonymous/storyline.csv
  output_dir: Output

Les chemins relatifs sont résolus depuis la racine du dépôt parking_cruising.

legs_file doit couvrir les mêmes utilisateurs et la même période que les fichiers sélectionnés par waypoint_glob. storyline_file est conservé pour le mode de compatibilité storyline_csv.

Jeu de données présent dans le dépôt de travail

La configuration opérationnelle utilise la base nettoyée Déclic Mobilité legs.parquet. L'ancien fichier anonyme de storyline reste disponible pour contrôler le schéma historique, mais il n'est plus la source principale.

run

run:
  max_files: 1
  max_users: 25
  max_segments: 80
  random_seed: 42

Ces bornes servent à faire des tests rapides. Mettre null pour traiter tout le corpus.

raw_waypoints

raw_waypoints:
  delimiter: ";"
  user_col: user_id
  time_col: tracked_at
  lat_col: latitude
  lon_col: longitude
  speed_col: speed
  accuracy_col: accuracy
  speed_unit: mps

Ce bloc définit le contrat du CSV source. Il doit être modifié si le fournisseur change les noms de colonnes ou l'unité de vitesse.

cleaning

cleaning:
  max_accuracy_m: 75
  max_speed_kmh: 180
  unknown_speed_values: [-1]
  drop_duplicate_points: true

Ces paramètres déterminent les points conservés et les valeurs imputées ou plafonnées.

leg_matching

leg_matching:
  source: declic_legs_parquet
  user_col: user_id
  type_col: type
  track_value: Track
  start_col: started_at
  finish_col: finished_at
  leg_id_col: leg_id
  storyline_id_col: storyline_id
  trip_id_col: trip_id
  mode_col: mode
  detected_mode_col: detected_mode
  mode_niv1_col: mode_niv1
  mode_niv2_col: mode_niv2
  mode_mrmt_col: mode_mrmt
  write_assignment_table: true
  car_modes: ["Mode::Car", "Mode::Ecar"]

Ce bloc définit la table de legs, ses bornes temporelles et les modes transmis au modèle. Par défaut, Mode::Car et Mode::Ecar sont retenus. Toute extension à Mode::CarPassenger, Mode::Carsharing ou Mode::Ridepooling doit être décidée explicitement. write_assignment_table contrôle l'écriture du fichier Parquet intermédiaire contenant également les waypoints non appariés.

segmentation

segmentation:
  gap_minutes: 15
  min_points: 20
  min_duration_minutes: 1
  max_duration_minutes: 180
  min_distance_m: 100
  max_points_per_segment: 10000
  trim_static_tail: true
  static_speed_kmh: 2
  static_tail_minutes: 5

Ce bloc est le plus sensible méthodologiquement. Il définit ce qui sera présenté au modèle comme une trajectoire.

relut_validation

relut_validation:
  max_file_size_mb: 10
  min_rows: 2
  max_rows: 10000
  max_duration_days: 30
  max_median_interval_seconds: 20
  max_timestamp_gap_seconds: 3600

Ces paramètres reprennent les contraintes de format documentées par ReLUT, avec un contrôle local par segment.

model

model:
  p_search: auto
  max_search_duration_minutes: 15

p_search: auto laisse ReLUT choisir le seuil selon la fréquence médiane du segment. La durée maximale est appliquée localement après inférence.

review

review:
  max_map_segments: 40
  max_plot_segments: 8

Ces paramètres bornent les figures et cartes de relecture pour éviter des documents trop lourds. max_plot_segments est volontairement plus bas que la carte HTML dans les configurations actuelles afin de produire une figure lisible dans un rapport A4.

impact_assumptions

impact_assumptions:
  co2_g_per_km: 111
  co2_factor_label: "Hypothèse WLTP voitures neuves Suisse 2026"
  co2_sensitivity_g_per_km: [102, 111, 113.9, 180]

Ce bloc transforme les distances détectées en émissions indicatives. Il ne constitue pas un facteur officiel propre au parc genevois. La valeur par défaut sert à produire une quantification exploitable dans le rapport ; elle doit être remplacée ou validée par l'OCT si l'indicateur devient opérationnel.

spatial_detection

spatial_detection:
  candidate_rule: broad
  crs_wgs84: EPSG:4326
  crs_metric: EPSG:2056
  map_legs_staypoints_file: Data/GPS/declic/cleaned-base/parquet/map_legs_staypoints.parquet
  staypoints_file: Data/GPS/declic/cleaned-base/parquet/staypoints.parquet
  trips_file: Data/GPS/declic/cleaned-base/parquet/trips.parquet
  car_modes: ["Mode::Car", "Mode::Ecar"]
  allowed_post_car_modes: ["Mode::Walk"]
  max_trip_duration_seconds: 18000
  min_leg_duration_seconds: 300
  min_leg_length_m: 500
  min_speed_kmh: 1
  max_speed_kmh: 150
  min_origin_destination_distance_m: 75
  max_parking_activity_distance_m: 2000
  destination_buffer_m: 1000
  exclusion_end_segment_m: 150
  activity_location_radius_m: 25
  h3_resolution: 8
  excluded_destination_h3_cells:
    - "881f91ad29fffff"
    - "881f91ad07fffff"
    - "881f91af19fffff"
    - "881f91af25fffff"
    - "881f91a893fffff"
    - "881f91ad2bfffff"
    - "881f91ad01fffff"
    - "881f91ad03fffff"
    - "881f91ad67fffff"
    - "881f91af2dfffff"
    - "881f91af11fffff"
  suspicious_dist_buffer_m: 2500
  tortuosity_min: 2.0
  comparison_sample_legs: 40
  random_seed: 42

Ce bloc pilote l'adaptation spatiale Déclic. Les distances sont calculées en EPSG:2056.

Point ouvert : contrairement à la reprise PL23 sur layer_GE, ce bloc ne contient pas encore de filtre géographique canton Genève explicite. Les résultats Déclic spatiaux portent donc sur les legs présentes dans legs.parquet après filtres de modes, qualité, destination-activité, H3 tunnels et seuils géométriques. Si le périmètre analytique doit être strictement genevois, il faut ajouter un spatial join avec une couche de référence validée et exposer les compteurs avant/après filtre.

allowed_post_car_modes garde la logique historique voiture puis marche : après la dernière leg voiture du trip, les modes restants doivent appartenir à cette liste. Avec la configuration actuelle, seuls les trips terminés par de la marche restent éligibles. La distance de marche post-voiture est exportée dans subsequent_walk_distance_m.

excluded_destination_h3_cells réactive l'exclusion historique des destinations situées dans des cellules H3 associées à des entrées ou sorties de tunnels. Ces zones peuvent provoquer des pertes de signal GPS et donc de fausses fins de leg. Le pipeline ne supprime pas les observations silencieusement : il exporte h3_index_destination, spatial_excluded_tunnel_zone, spatial_exclusion_reason et spatial_eligible_before_exclusions, puis exclut ces lignes de spatial_eligible.

candidate_rule choisit la règle spatiale principale exportée dans spatial_candidate :

  • broad, valeur par défaut, reprend l'hypothèse large de repérage spatial : une leg éligible est candidate si elle présente une grande longueur de trace dans le rayon final, un passage près de l'activité avant la fin, une boucle géométrique ou une forte tortuosité terminale ;
  • conservative limite la détection aux deux signaux les plus spécifiques : longueur de trace dans le rayon final supérieure à suspicious_dist_buffer_m ou passage près de l'activité avant la fin.

Les deux variantes sont toujours exportées : spatial_candidate_broad et spatial_candidate_conservative. Cela permet de comparer les résultats sans figer prématurément un niveau de sensibilité.

Pour les portions spatiales, les marqueurs temporels sont reconstruits par interpolation linéaire entre started_at et finished_at. La fraction temporelle utilisée est la fraction de longueur de la portion finale dans la longueur totale de la leg. Cette hypothèse revient à supposer une vitesse constante le long de la leg ; elle sert à obtenir des timestamps comparables au modèle temporel, pas à observer directement les vitesses réelles dans le buffer.

Point de méthode : geometry.is_simple == False ne prouve pas à lui seul une recherche de stationnement. Ce signal peut aussi venir d'un giratoire, d'un échangeur, d'un croisement de trajectoire, d'un demi-tour ordinaire, d'un bruit GPS ou d'une segmentation imparfaite. Il reste néanmoins cohérent de l'utiliser dans une règle large de repérage, car toute leg voiture se termine normalement par un arrêt ou un stationnement, et l'objectif est d'abord d'identifier des portions suspectes à comparer au modèle temporel et à relire sur carte.

Sur le run Déclic disponible après exclusion des cellules H3 tunnel, la règle conservatrice détecte 2 820 legs éligibles, tandis que la règle large en détecte 16 618 sur 28 034. Cet écart doit être interprété comme un intervalle de sensibilité, pas comme une preuve que la règle large est erronée.

spatial_eda

spatial_eda:
  write_diagnostic_maps: false

Les CSV et figures d'EDA spatiale sont toujours produits. Les cartes EDA (spatial_eda_grid_candidates.html, spatial_eda_examples.html) sont désactivées par défaut afin de garder Output/maps lisible. Les activer ponctuellement si une relecture cartographique détaillée des seuils est nécessaire.

pl23_spatial

pl23_spatial:
  legs_gpkg: Data/GPS/pl23/20241120_dump_situee/241120_legs.gpkg
  layers: ["layer_GE"]
  max_rows: null
  trips_file: Data/GPS/pl23/20241120_dump_situee/241120_trips.csv
  map_track_trip_file: Data/GPS/pl23/20241120_dump_situee/241120_map_track_trip_journey.csv
  staypoints_file: Data/GPS/pl23/20241120_dump_situee/241120_staypoints.geojson
  survey_file: Data/GPS/pl23/EPFL_vague1_v4.csv
  destination_kt: GE
  crs_metric: EPSG:2056
  car_modes: ["Mode::Car", "Mode::Ecar"]
  allowed_trip_modes: ["Mode::Walk", "Mode::Car", "Mode::Ecar"]
  allowed_post_car_modes: ["Mode::Walk"]
  h3_resolution: 8
  excluded_destination_h3_cells:
    - "881f91ad29fffff"
    - "881f91ad07fffff"
    - "881f91af19fffff"
    - "881f91af25fffff"
    - "881f91a893fffff"
    - "881f91ad2bfffff"
    - "881f91ad01fffff"
    - "881f91ad03fffff"
    - "881f91ad67fffff"
    - "881f91af2dfffff"
    - "881f91af11fffff"
  example_legs: 40
  random_seed: 42

Ce bloc pilote l'étape 23_spatial_detection_pl23. Par défaut, seule la couche genevoise layer_GE est lue afin de garder un périmètre cohérent avec la recherche de stationnement à Genève et de limiter le coût de lecture du GPKG. Le filtre H3 tunnel utilise la même liste que l'étape Déclic et reste auditable via les mêmes colonnes d'exclusion.

max_rows peut être fixé temporairement pour tester la chaîne sans lire toute la couche. Il doit rester null pour un résultat livrable.

L'étape PL23 n'appelle ni Google Maps ni OSRM. Les sorties pl23_base2_proxy et pl23_base3_proxy_without_routing documentent donc un proxy géométrique reproductible, pas encore une distance additionnelle stricte fondée sur dist_excess.

Le routage aval est configuré dans le bloc routing.

routing

routing:
  provider: xyt_routing
  candidate_scope: affected_geometry
  route_strategy: destination_buffer_entry_to_leg_end
  crs_metric: EPSG:2056
  mode: car_ch_extended_200km
  weighting: distance
  suspicious_dist_excess_m: 200
  xyt_endpoint: http://127.0.0.1:8010/routes
  batch_size: 500
  timeout_seconds: 120
  sleep_between_batches_seconds: 0
  include_geometry: true
  reuse_existing_results: true
  max_routes: null
  allow_partial_results: false
  geometry_comparison_examples: 60
  geometry_comparison_random_seed: 42
  candidate_files:
    - source: declic
      path: Output/data/spatial_declic_candidates.parquet
    - source: pl23
      path: Output/data/pl23_spatial_candidates.parquet

Ce bloc pilote les étapes optionnelles 25 à 27 :

  • préparation des paires à router ;
  • appel à une API locale xyt_routing ;
  • calcul de dist_excess_m et fusion avec les tables candidates spatiales.

candidate_scope: affected_geometry signifie que toutes les legs disposant d'une portion finale dans le buffer sont préparées pour le routage, pas seulement les candidates déjà flaggées. Ce choix est nécessaire pour que dist_excess_m > suspicious_dist_excess_m puisse fonctionner comme critère autonome.

route_strategy: destination_buffer_entry_to_leg_end rappelle que l'origine du routage est spatial_entry_point_wkb_2056 et que la destination est destination_wkb_2056. On ne route pas la leg complète.

mode: car_ch_extended_200km demande explicitement le graphe régional transfrontalier osm-ch_extended_200km-1418d8a09b76af1b côté xyt_routing. Ce choix évite de réutiliser par erreur des route_id produits avec un ancien graphe DACH ou France partitionné.

weighting: distance demande, côté xyt_routing, le moteur voiture configuré pour le plus court chemin en distance lorsque ce moteur est disponible.

reuse_existing_results: true recharge Output/data/routing_results.parquet lorsque le cache existe déjà et couvre tous les route_id, au lieu de relancer le routeur local. Le script 26 accepte --force pour recalculer explicitement.

max_routes est réservé aux smoke tests de l'étape 26. allow_partial_results: false empêche l'étape 27 de fusionner par erreur un cache de routage incomplet. Le passer à true doit rester limité à un diagnostic manuel.

geometry_comparison_examples règle le nombre d'exemples affichés dans la carte Output/maps/routing_geometry_comparison.html.

network_relut

network_relut:
  source_dataset: declic
  routing_geometry_correspondence_file: Output/data/routing_geometry_correspondence.parquet
  relut_predictions_file: Output/data/relut_predictions.parquet
  crs_metric: EPSG:2056
  probability_column: y_hat_p
  temporal_distance_column: distToParkingSpot
  edge_coordinate_precision: 6
  min_probability_points_per_leg: 2
  include_unweighted_segments: false
  map_max_segments: 5000
  map_min_routes_per_segment: 1
  map_min_probability: null
  full_leg_observed_geometry_file: Output/data/spatial_declic_candidates_routed.parquet
  full_leg_simplify_tolerance_m: 50
  full_leg_map_max_segments: 5000
  full_leg_map_min_routes_per_segment: 1
  full_leg_map_min_probability: null
  full_leg_sample_map_legs: 20
  full_leg_sample_random_seed: 42
  map_tiles: cartodbpositron

Ce bloc pilote l'étape 43. Elle croise les géométries routées issues de l'étape 27 avec les probabilités ReLUT produites en étape 32.

source_dataset: declic reflète l'état actuel : seules les legs Déclic peuvent être pondérées par ReLUT, car PL23 ne dispose pas encore des waypoints correspondants.

temporal_distance_column: distToParkingSpot indique la distance restante à la destination utilisée pour projeter les probabilités y_hat_p sur la géométrie routée. L'affectation se fait par interpolation linéaire.

edge_coordinate_precision contrôle l'agrégation des segments OSRM. Une valeur trop faible fusionne des rues proches ; une valeur trop élevée limite l'agrégation.

include_unweighted_segments: false exclut les routes qui n'ont pas de profil ReLUT. Les activer serait utile pour visualiser la couverture du routage, mais pas pour cartographier la probabilité de cruising.

L'étape 43 produit une carte par défaut :

  • relut_full_leg_probability_sample.html : échantillon de legs complètes originales, non agrégées, colorées segment par segment selon la probabilité ReLUT.

Par défaut, write_diagnostic_network_maps: false évite de produire les cartes réseau agrégées intermédiaires, car elles sont redondantes pour la relecture courante. Si ce paramètre est activé, deux cartes de diagnostic supplémentaires peuvent être générées :

  • routed_network_relut_search_portions.html : segments routés entre l'entrée du rayon final et la fin de leg, soit la portion finale utilisée pour dist_excess ;
  • observed_network_relut_full_legs.html : legs complètes observées, non routées OD, simplifiées avec full_leg_simplify_tolerance_m.

full_leg_sample_map_legs règle le nombre de legs affichées dans la carte d'échantillon. La valeur par défaut est volontairement limitée à 20 afin de garder un fichier HTML ouvrable rapidement.

geometric_complements

geometric_complements:
  crs_metric: EPSG:2056
  candidate_files:
    - source: declic
      path: Output/data/spatial_declic_candidates.parquet
    - source: pl23
      path: Output/data/pl23_spatial_candidates.parquet
  commune_boundaries_file: null
  commune_name_col: name

Ce bloc pilote l'étape 24_geometric_complements. L'étape est aval : elle lit les tables candidates déjà produites par les étapes 22 et 23 et ne modifie aucun flag de détection.

Sorties produites :

  • courbes cumulées des indicateurs géométriques ;
  • carte H3 thématique et table H3 ;
  • graphiques simples sur les variables de stationnement déclaré ;
  • analyse communale si commune_boundaries_file pointe vers une couche de communes et si commune_name_col identifie la colonne de nom.

Si aucune couche communale n'est configurée, le CSV communal contient une ligne de statut explicite et la carte communale reste vide.

territorial_indicators

territorial_indicators:
  local_timezone: Europe/Zurich
  walk_far_threshold_m: 150
  parking_activity_far_threshold_m: 150
  h3_min_eligible_legs: 3
  network_min_route_count: 2
  network_hotspot_limit: 200

Ce bloc pilote l'étape 44_territorial_indicators. Elle ne recalcule pas les détections ; elle transforme les sorties existantes en indicateurs de restitution territoriale.

Les scénarios exportés sont :

  • borne basse : règle spatiale conservatrice ;
  • scénario central routé : règle spatiale enrichie par dist_excess_m ;
  • borne haute : règle large ou dist_excess_m, lorsque le routage existe ;
  • profil temporel ReLUT : qualification fine sur les waypoints disponibles.

walk_far_threshold_m et parking_activity_far_threshold_m servent à décrire les cas de stationnement éloigné dans la typologie. Ils ne sont pas utilisés pour entraîner le modèle ou pour produire les flags de détection principaux.

h3_min_eligible_legs évite de classer comme hotspot des cellules H3 reposant sur trop peu d'observations. network_min_route_count et network_hotspot_limit contrôlent la table des segments réseau les plus marqués par les probabilités ReLUT agrégées.