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¶
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¶
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¶
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 ;conservativelimite la détection aux deux signaux les plus spécifiques : longueur de trace dans le rayon final supérieure àsuspicious_dist_buffer_mou 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¶
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_met 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 pourdist_excess;observed_network_relut_full_legs.html: legs complètes observées, non routées OD, simplifiées avecfull_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_filepointe vers une couche de communes et sicommune_name_colidentifie 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.