1

Exploration des relations binaires

This commit is contained in:
2025-11-22 01:46:57 +01:00
parent 2ff719107b
commit 1932938fd6
135 changed files with 778 additions and 136 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 KiB

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 57 KiB

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 528 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 486 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 431 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 403 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 609 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 554 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 624 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 578 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 415 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 387 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 500 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 415 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 400 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 383 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 309 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 395 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 380 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 502 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 482 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 498 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 455 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 360 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 351 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 134 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 119 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 116 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 555 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 456 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 456 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 445 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 404 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 346 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 102 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 510 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 507 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 376 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 348 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 599 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 444 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 432 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 KiB

View File

@@ -64,7 +64,7 @@ python "docs/05 - Corrélations binaires avancées/scripts/plot_lagged_correlati
### Interprétation
Ces graphiques sont désormais en corrélation signée (par défaut) et tracent des zones colorées symétriques pour les relations négatives/positives. Ils mettent en évidence la force, le sens et le décalage temporel entre deux variables.
Ces graphiques montrent la corrélation signée et tracent des zones colorées symétriques pour les relations négatives/positives. Ils mettent en évidence la force, le sens et le décalage temporel entre deux variables.
Ainsi, il est clair qu'il existe une corrélation forte et immédiate entre la température et l'humidité relative.
La corrélation entre température et luminance est également forte, mais elle est décalée : le pic de luminance précède le pic de température de près de deux heures.
@@ -72,22 +72,176 @@ La corrélation entre température et luminance est également forte, mais elle
Comme ces deux corrélations sont fortes, on en déduit que l'on devrait logiquement observer une corrélation forte et décalée entre la luminance et l'humidité relative (et c'est bien le cas, comme en témoigne le graphique correspondant).
Un rapport similaire, quoique moins prononcé, existe entre la température, l'humidité relative et l'élévation solaire, puisque la luminance en dépend directement.
### Matrices de corrélation avec lag optimal par paire (depuis les CSV)
Ces relations pourraient être mieux mises en évidence à travers une matrice de corrélations par coefficient de Pearson.
### Matrices de corrélation avec lag optimal par paire
```shell
python "docs/05 - Corrélations binaires avancées/scripts/plot_lagged_correlation_heatmap_from_data.py"
```
Cette heatmap est construite à partir des CSV `data/lagged_correlations`, en prenant pour chaque paire ordonnée (X → Y) le r maximal en |r| et le lag associé. Les lags (en minutes, signe conservé, y compris 0) sont annotés uniquement pour les corrélations d'intensité au moins « Modérée » (|r| ≥ 0,3) ; les PNG sont écrits dans `figures/` et les matrices correspondantes (`correlation_matrix_lagged.csv`, `lag_matrix_minutes.csv`) dans `data/`.
Cette heatmap est construite à partir des CSV `data/lagged_correlations`, en prenant pour chaque paire ordonnée (X → Y) le r maximal en |r| et le lag associé. Les lags (en minutes, signe conservé, y compris 0) sont annotés uniquement pour les corrélations d'intensité au moins « Modérée » (|r| ≥ 0,3).
![](figures/correlation_heatmap_lagged.png)
Cette matrice met en évidence les plus fortes corrélations et leur décalage optimal.
Cette matrice met en évidence les plus fortes corrélations et leur décalage optimal (exprimé en minutes).
## Corrélations glissantes
Il est important de souligner que ces décalages ne sont pas transitifs.
Chaque case correspond au décalage qui maximise la corrélation X→Y calculée directement sur les deux signaux ; on nobtient pas un « décalage absolu » que lon pourrait soustraire ou additionner via une troisième variable.
Deux couples peuvent avoir des pics de corrélation à des lags voisins ou différents selon la forme du signal, le bruit, linertie physique ou la résolution (pas de 10 minutes).
Pour connaître le décalage entre deux variables, il faut donc regarder leur case spécifique dans la matrice : on ne peut pas l'inférer des relations entre trois variables.
### Nuages de points
```shell
python "docs/05 - Corrélations binaires avancées/scripts/plot_rolling_correlation_heatmap.py"
python "docs/05 - Corrélations binaires avancées/scripts/plot_all_pairwise_scatter.py"
```
![](figures/rolling_correlations/rolling_correlation_heatmap.png)
On affiche les nuages bruts pour toutes les paires. Si le lag optimal est strictement positif et que |r| ≥ 0,3 (daprès `data/lag_matrix_minutes.csv` et `data/correlation_matrix_lagged.csv`), on ajoute une version décalée Y(t+lag). Les paires qui franchissent ce seuil actuellement :
#### Luminance → Température (lag +130 min)
![](figures/pairwise_scatter/scatter_temperature_vs_illuminance.png)
Sans lag, la luminance croît globalement avec la température (r ~ 0,51), mais le nuage reste étalé avec un gros paquet nocturne à luminance nulle sur une large plage de températures ; la coloration temporelle montre aussi que les points récents (été) concentrent les températures les plus élevées pour une même luminance.
![](figures/pairwise_scatter/scatter_temperature_vs_illuminance_lagged.png)
Décalage +130 min : le nuage se resserre (r ~ 0,59) et la pente croissante devient plus homogène, signe que le réalignement temporel renforce le signal plutôt qu'il ne le déforme.
#### Élévation solaire → Température (lag +150 min)
![](figures/pairwise_scatter/scatter_temperature_vs_sun_elevation.png)
Sans décalage, lélévation solaire et la température montent ensemble (r ~ 0,47), mais le nuage dessine un « 8 » : pour une même élévation modérée, la branche du matin est nettement plus froide que celle du soir, et la coloration temporelle montre que les périodes récentes (été) maintiennent des températures élevées jusquà des élévations plus faibles.
![](figures/pairwise_scatter/scatter_temperature_vs_sun_elevation_lagged.png)
Avec +150 min, la boucle se referme (r ~ 0,56) : les deux branches se rapprochent et la pente positive devient plus lisible, tout en conservant la trace du double trajet matin/soir (forme de « 8 ») et du maintien de températures élevées sur une plage plus large en été.
#### Luminance → Humidité relative (lag +140 min)
![](figures/pairwise_scatter/scatter_humidity_vs_illuminance.png)
L'humidité est élevée dès que la luminance est faible puis baisse quand la lumière augmente (r ~ -0,52), avec beaucoup de points autour de 80100 % pour des luminances proches de zéro.
![](figures/pairwise_scatter/scatter_humidity_vs_illuminance_lagged.png)
Le décalage de +140 min renforce nettement cette anti-corrélation (r ~ -0,63) et fait ressortir deux poches distinctes : luminance < 40 k lux associée à une humidité élevée (médiane ~82 %) et luminance 60100 k lux associée à une humidité nettement plus basse (médiane ~46 %).
#### Élévation solaire → Humidité relative (lag +170 min)
![](figures/pairwise_scatter/scatter_humidity_vs_sun_elevation.png)
L'humidité diminue quand l'élévation solaire augmente (r ~ -0,37), mais la dispersion reste forte, surtout aux basses élévations.
![](figures/pairwise_scatter/scatter_humidity_vs_sun_elevation_lagged.png)
Décaler de +170 min resserre le nuage (r ~ -0,50) et aplatit les courbes arrondies visibles sans lag : la diminution d'humidité se cale plus directement sur la montée de l'élévation, ce qui réduit lasymétrie matin/soir sans inverser le sens de la relation.
#### Élévation solaire → Luminance (lag +10 min)
![](figures/pairwise_scatter/scatter_illuminance_vs_sun_elevation.png)
Luminance et élévation solaire sont presque alignées (r ~ 0,76) : plus le soleil est haut, plus la luminance est forte, avec peu de dispersion hors des périodes nocturnes.
![](figures/pairwise_scatter/scatter_illuminance_vs_sun_elevation_lagged.png)
Le décalage de +10 min ne change quasiment rien (r stable), la synchronisation initiale étant déjà suffisante.
La comparaison de ces graphiques met en évidence l'intérêt de prendre en compte le décalage temporel, au moins dans certains cas.
En réalignant temporellement les points de mesure, on renforce les corrélations précédemment calculées (les nuages de points se resserrent).
#### Autres relations
![](figures/pairwise_scatter/scatter_temperature_vs_humidity.png)
Relation inverse marquée (r ~ -0,60) : le nuage suit presque une diagonale descendante, avec peu de points sécartant fortement, ce qui suggère une structure quasi linéaire malgré le bruit résiduel.
![](figures/pairwise_scatter/scatter_temperature_vs_pressure.png)
Léger biais positif (r ~ 0,16) : la pression reste cantonnée entre 1005 et 1025 hPa tandis que la température oscille largement autour, formant des bandes verticales qui sélargissent dans le temps (couleurs plus récentes), signe que la montée saisonnière des températures se superpose à une pression quasi stable.
![](figures/pairwise_scatter/scatter_temperature_vs_rain_rate.png)
96 % des mesures sont sans pluie ; les 1242 averses recensées se situent entre 0,7 °C et 24,3 °C, aucune au-delà de 25 °C ni sous 0 °C. Les données couvrant mars→novembre, il manque encore un hiver complet pour conclure sur les très basses températures.
![](figures/pairwise_scatter/scatter_temperature_vs_wind_speed.png)
Pas de tendance discernable entre température et vitesse du vent ; la plupart des vitesses restent faibles (médiane ~2,4 km/h) quel que soit le niveau thermique.
![](figures/pairwise_scatter/scatter_temperature_vs_wind_direction.png)
Les températures les plus hautes apparaissent surtout avec des vents de Nord à Ouest, tandis que les flux Sud/Est s'accompagnent de valeurs plus fraîches ; le motif reste toutefois très dispersé.
![](figures/pairwise_scatter/scatter_humidity_vs_pressure.png)
Humidité légèrement plus élevée quand la pression est basse (r ~ -0,13), mais la dispersion domine : on observe aussi des humidités fortes au-dessus de 1020 hPa (médiane ~83 % entre 10201030 hPa), montrant quune haute pression nimplique pas forcément un air sec.
![](figures/pairwise_scatter/scatter_humidity_vs_rain_rate.png)
Nuage très asymétrique : la plupart des observations sans pluie, et les averses (rares) surviennent quand l'humidité est déjà élevée, d'où une faible corrélation positive (r ~ 0,15).
![](figures/pairwise_scatter/scatter_humidity_vs_wind_speed.png)
Pas de relation lisible entre humidité et vitesse du vent ; les points restent éparpillés sur toute la gamme.
![](figures/pairwise_scatter/scatter_humidity_vs_wind_direction.png)
Air plus humide sous vents de Sud et Sud-Ouest (moyenne ~7981 %), plus sec sous flux de Nord-Est à Est (~6870 %), même si chaque secteur reste très dispersé.
![](figures/pairwise_scatter/scatter_pressure_vs_rain_rate.png)
Pression légèrement plus basse lors des épisodes pluvieux (r ~ -0,09), mais les 1242 occurrences de pluie sétendent de 977 à 1027 hPa : la plupart entre 990 et 1020 hPa, quelques cas rares au-dessus de 1020 hPa, et très peu sous 980 hPa, ce qui limite linterprétation.
![](figures/pairwise_scatter/scatter_pressure_vs_illuminance.png)
Faible tendance (r ~ 0,14) à associer les hautes pressions aux périodes lumineuses ; la variance reste importante, y compris de nuit. Seul un point atteint ~40 k lux sous ~981 hPa, isolé et insuffisant pour inférer un motif.
![](figures/pairwise_scatter/scatter_pressure_vs_wind_speed.png)
Vents plus rapides quand la pression baisse (r ~ -0,23), avec des vitesses élevées surtout sous 1010 hPa. Les calmes (0 km/h) apparaissent néanmoins à tous les niveaux de pression et même plus souvent au-delà de 1020 hPa, signe quune basse pression ne saccompagne pas systématiquement de vent.
![](figures/pairwise_scatter/scatter_pressure_vs_wind_direction.png)
Pression plus élevée sous vents d'Est/NE (médiane ~10121014 hPa) et plus basse quand le flux vient du Sud-Ouest (médiane ~1009 hPa). La densité de points sous SO reflète surtout un effectif plus grand, pas une pression plus haute.
![](figures/pairwise_scatter/scatter_pressure_vs_sun_elevation.png)
Cycle quotidien faible (r ~ 0,10) : la pression monte légèrement quand le soleil est haut mais reste globalement stable. Sur la période mars→novembre, les médianes mensuelles montrent des pressions plus élevées en septembre (~1018 hPa) quen juillet (~1006 hPa), ce que suggère aussi le gradient temporel de la figure.
![](figures/pairwise_scatter/scatter_rain_rate_vs_illuminance.png)
Comme 96 % des valeurs sont nulles, aucune tendance nette ; les rares précipitations surviennent surtout lorsque la luminance est faible.
![](figures/pairwise_scatter/scatter_rain_rate_vs_wind_speed.png)
Les averses (rares) coïncident avec des vents un peu plus rapides (médiane ~3,2 km/h sous pluie contre ~2,4 km/h), mais la majorité des vitesses reste faible et sans pluie.
![](figures/pairwise_scatter/scatter_rain_rate_vs_wind_direction.png)
Précipitations plus présentes avec des vents d'Ouest à Nord-Ouest (~0,2 mm/h en moyenne sur ces secteurs) que sous flux d'Est/NE, mais le signal reste faible car la plupart des pas de temps sont secs.
![](figures/pairwise_scatter/scatter_rain_rate_vs_sun_elevation.png)
Pas de corrélation avec l'élévation solaire (r ~ 0) : les épisodes pluvieux, rares, sont répartis sur le jour et la nuit. Les fréquences de pluie varient peu selon lélévation (≈34,5 % des points), avec un léger surplus aux basses élévations mais sans tendance nette matin/après-midi.
![](figures/pairwise_scatter/scatter_illuminance_vs_wind_speed.png)
Luminance élevée coïncide légèrement avec des vents un peu plus rapides (r ~ 0,13), mais la plupart des observations restent proches du calme quelle que soit la lumière.
![](figures/pairwise_scatter/scatter_illuminance_vs_wind_direction.png)
Luminance plus forte lorsque le vent vient du Nord/Nord-Ouest (~2829 klx en moyenne), nettement plus faible sous vents de Sud (~5 klx), malgré une dispersion importante.
![](figures/pairwise_scatter/scatter_wind_speed_vs_wind_direction.png)
Vitesse du vent très dépendante du secteur : vents d'Ouest et Sud-Ouest nettement plus rapides (~4,7 km/h en moyenne) alors que les autres directions tournent autour de 12 km/h.
![](figures/pairwise_scatter/scatter_wind_speed_vs_sun_elevation.png)
Légère hausse des vitesses quand le soleil est plus haut (r ~ 0,12), mais une proportion importante de calmes persiste à toutes les élévations.
![](figures/pairwise_scatter/scatter_wind_direction_vs_sun_elevation.png)
Élévation solaire maximale observée surtout avec des vents de Nord/Nord-Ouest, tandis que les flux de Sud coïncident fréquemment avec des élévations négatives (nuit), signe d'une dépendance au cycle journalier plus qu'au secteur lui-même.

View File

@@ -0,0 +1,177 @@
# scripts/plot_all_pairwise_scatter.py
from __future__ import annotations
from pathlib import Path
import sys
import pandas as pd
PROJECT_ROOT = Path(__file__).resolve().parents[3]
if str(PROJECT_ROOT) not in sys.path:
sys.path.insert(0, str(PROJECT_ROOT))
from meteo.dataset import load_raw_csv
from meteo.variables import iter_variable_pairs
from meteo.plots import plot_scatter_pair
CSV_PATH = Path("data/weather_minutely.csv")
DOC_DIR = Path(__file__).resolve().parent.parent
OUTPUT_DIR = DOC_DIR / "figures" / "pairwise_scatter"
LAG_MATRIX_PATH = DOC_DIR / "data" / "lag_matrix_minutes.csv"
CORR_MATRIX_PATH = DOC_DIR / "data" / "correlation_matrix_lagged.csv"
MIN_ABS_CORR_FOR_LAGGED = 0.3
def _load_lag_matrix(path: Path) -> pd.DataFrame | None:
if not path.exists():
print(f"⚠ Aucun lag appliqué : fichier absent ({path}).")
return None
lag_df = pd.read_csv(path, index_col=0)
if lag_df.empty:
print(f"⚠ Matrice de lags vide : {path}")
return None
return lag_df
def _load_corr_matrix(path: Path) -> pd.DataFrame | None:
if not path.exists():
print(f"⚠ Matrice de corrélation laggée absente ({path}) : les versions décalées seront ignorées.")
return None
corr_df = pd.read_csv(path, index_col=0)
if corr_df.empty:
print(f"⚠ Matrice de corrélation laggée vide : {path}")
return None
return corr_df
def _get_optimal_lag(lag_df: pd.DataFrame, var_x, var_y) -> int | None:
try:
value = lag_df.loc[var_x.column, var_y.column]
except KeyError:
return None
if pd.isna(value):
return None
return int(round(float(value)))
def _should_generate_lagged(
lag_df: pd.DataFrame | None,
corr_df: pd.DataFrame | None,
var_x,
var_y,
) -> tuple[bool, int | None, float | None, str | None]:
"""
Retourne (do_generate, applied_lag_minutes, corr_value, source) où :
- applied_lag_minutes s'applique au couple (var_x, var_y) dans cet ordre
(lag > 0 : var_x précède var_y ; lag < 0 : var_y précède var_x).
- source précise l'orientation retenue dans les matrices (ex: "x->y" ou "y->x").
Règles :
- lag strictement positif
- |corr| >= MIN_ABS_CORR_FOR_LAGGED
On teste les deux orientations (x->y et y->x) pour détecter le cas où le
lag positif n'est disponible que dans l'ordre inverse ; on rétablit ensuite
l'ordre original (var_x, var_y) pour la génération du scatter.
"""
if lag_df is None or corr_df is None:
return False, None, None, None
candidates: list[tuple[float, int, float, str]] = []
for lead, follow in ((var_x, var_y), (var_y, var_x)):
try:
lag_value = lag_df.loc[lead.column, follow.column]
corr_value = corr_df.loc[lead.column, follow.column]
except KeyError:
continue
if pd.isna(lag_value) or pd.isna(corr_value):
continue
lag_minutes = int(round(float(lag_value)))
corr_float = float(corr_value)
if lag_minutes <= 0:
continue
if abs(corr_float) < MIN_ABS_CORR_FOR_LAGGED:
continue
orientation = "x->y" if lead is var_x and follow is var_y else "y->x"
candidates.append((abs(corr_float), lag_minutes, corr_float, orientation))
if not candidates:
return False, None, None, None
# Priorise la plus forte corrélation absolue ; à défaut, la première trouvée
candidates.sort(key=lambda tup: tup[0], reverse=True)
_, lag_minutes, corr_float, orientation = candidates[0]
if orientation == "x->y":
applied_lag = lag_minutes # var_x précède var_y
else:
applied_lag = -lag_minutes # var_y précède var_x, on conserve l'ordre (x, y)
return True, applied_lag, corr_float, orientation
def main() -> None:
if not CSV_PATH.exists():
print(f"⚠ Fichier introuvable : {CSV_PATH}")
return
df = load_raw_csv(CSV_PATH)
print(f"Dataset minuté chargé : {CSV_PATH}")
print(f" Lignes : {len(df)}")
print(f" Colonnes : {list(df.columns)}")
lag_matrix = _load_lag_matrix(LAG_MATRIX_PATH)
if lag_matrix is not None:
print(f"Matrice de lags optimale chargée depuis : {LAG_MATRIX_PATH}")
corr_matrix = _load_corr_matrix(CORR_MATRIX_PATH)
if corr_matrix is not None:
print(f"Matrice de corrélations (lag optimal) chargée depuis : {CORR_MATRIX_PATH}")
pairs = iter_variable_pairs()
print(f"Nombre de paires de variables : {len(pairs)}")
for var_x, var_y in pairs:
filename = f"scatter_{var_x.key}_vs_{var_y.key}.png"
output_path = OUTPUT_DIR / filename
print(f"→ Trace {var_y.key} en fonction de {var_x.key}{output_path}")
plot_scatter_pair(
df=df,
var_x=var_x,
var_y=var_y,
output_path=output_path,
sample_step=10, # un point sur 10 : ≈ 32k points au lieu de 320k
)
do_lagged, lag_minutes, corr_value, orientation = _should_generate_lagged(lag_matrix, corr_matrix, var_x, var_y)
if not do_lagged or lag_minutes is None or orientation is None:
print(" (pas de version décalée : lag <= 0 ou |r| insuffisant)")
continue
lagged_filename = f"scatter_{var_x.key}_vs_{var_y.key}_lagged.png"
lagged_output = OUTPUT_DIR / lagged_filename
print(
f" + Version décalée ({lag_minutes:+d} min appliqué sur {var_x.key} vs {var_y.key}, "
f"|r|={abs(corr_value):.3f}, source {orientation}) → {lagged_output}"
)
plot_scatter_pair(
df=df,
var_x=var_x,
var_y=var_y,
output_path=lagged_output,
sample_step=10,
lag_minutes=lag_minutes,
)
print("✔ Tous les graphiques de nuages de points ont été générés.")
if __name__ == "__main__":
main()