1
donnees_meteo/meteo/correlation_presets.py
2025-11-19 17:01:45 +01:00

120 lines
3.1 KiB
Python

"""Jeux de paires et scénarios standardisés pour explorer les corrélations."""
from __future__ import annotations
from dataclasses import dataclass
from typing import Callable, Sequence
import numpy as np
HexbinReducer = Callable[[np.ndarray], float]
HEXBIN_REDUCE_FUNCTIONS: dict[str, HexbinReducer] = {
"mean": np.mean,
"median": np.median,
"max": np.max,
}
HEXBIN_REDUCE_LABELS: dict[str, str] = {
"mean": "moyenne",
"median": "médiane",
"max": "maximum",
}
@dataclass(frozen=True)
class HexbinScenario:
"""Décrit un cas d'usage pour un nuage hexbin coloré par une 3ᵉ variable."""
key_x: str
key_y: str
key_color: str
filename: str
description: str
reduce: str = "mean"
gridsize: int = 60
mincnt: int = 5
def get_reduce_func(self) -> HexbinReducer:
"""Retourne la fonction de réduction associée (moyenne, médiane, ...)."""
return HEXBIN_REDUCE_FUNCTIONS.get(self.reduce, np.mean)
def get_reduce_label(self) -> str:
"""Libellé français de la fonction de réduction utilisée."""
return HEXBIN_REDUCE_LABELS.get(self.reduce, self.reduce)
DEFAULT_LAGGED_PAIRS: Sequence[tuple[str, str]] = (
("temperature", "humidity"),
("temperature", "rain_rate"),
("pressure", "rain_rate"),
("pressure", "wind_speed"),
("pressure", "illuminance"),
("illuminance", "temperature"),
("humidity", "rain_rate"),
)
DEFAULT_ROLLING_PAIRS: Sequence[tuple[str, str]] = (
("temperature", "humidity"),
("pressure", "rain_rate"),
("pressure", "wind_speed"),
("illuminance", "temperature"),
("humidity", "rain_rate"),
)
DEFAULT_HEXBIN_SCENARIOS: Sequence[HexbinScenario] = (
HexbinScenario(
key_x="temperature",
key_y="humidity",
key_color="rain_rate",
filename="hexbin_temp_humidity_color_rain.png",
description=(
"Mettre en évidence comment l'humidité relative plafonne lorsque la température chute "
"et comment les épisodes de pluie se situent dans une bande restreinte."
),
reduce="max",
gridsize=50,
mincnt=8,
),
HexbinScenario(
key_x="pressure",
key_y="rain_rate",
key_color="wind_speed",
filename="hexbin_pressure_rain_color_wind.png",
description=(
"Vérifier si des rafales accompagnent vraiment les chutes de pression. "
"On s'attend à voir beaucoup de cases vides : la corrélation est loin d'être systématique."
),
reduce="median",
gridsize=45,
mincnt=5,
),
HexbinScenario(
key_x="illuminance",
key_y="humidity",
key_color="temperature",
filename="hexbin_lux_humidity_color_temp.png",
description=(
"Explorer le cycle jour/nuit : l'humidité monte quand l'illuminance chute, "
"mais cela n'implique pas toujours une baisse rapide de température."
),
reduce="mean",
gridsize=55,
mincnt=6,
),
)
__all__ = [
"HexbinScenario",
"DEFAULT_LAGGED_PAIRS",
"DEFAULT_ROLLING_PAIRS",
"DEFAULT_HEXBIN_SCENARIOS",
]