"""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", ]