129 lines
3.9 KiB
Python
129 lines
3.9 KiB
Python
# scripts/plot_sun_elevation_relationships.py
|
||
from __future__ import annotations
|
||
|
||
from pathlib import Path
|
||
|
||
import numpy as np
|
||
|
||
from meteo.dataset import load_raw_csv
|
||
from meteo.variables import VARIABLES_BY_KEY
|
||
from meteo.analysis import compute_binned_statistics
|
||
from meteo.plots import plot_binned_profiles, plot_hexbin_with_third_variable
|
||
from meteo.config import StationLocation
|
||
from meteo.solar import add_solar_elevation_column
|
||
|
||
|
||
CSV_PATH = Path("data/weather_minutely.csv")
|
||
OUTPUT_DIR = Path("figures/sun")
|
||
|
||
|
||
def ensure_sun_elevation(df):
|
||
if "sun_elevation" in df.columns:
|
||
return df
|
||
|
||
print("ℹ La colonne 'sun_elevation' est absente, tentative de calcul à la volée.")
|
||
location = StationLocation.from_env(optional=True)
|
||
if location is None:
|
||
print(
|
||
"⚠ Impossible de calculer l'élévation solaire : définissez STATION_LATITUDE et STATION_LONGITUDE "
|
||
"puis regénérez le dataset (scripts/make_minutely_dataset)."
|
||
)
|
||
return None
|
||
|
||
print(
|
||
f"→ Calcul d'élévation solaire avec lat={location.latitude}, lon={location.longitude}, "
|
||
f"alt={location.elevation_m} m."
|
||
)
|
||
add_solar_elevation_column(
|
||
df,
|
||
latitude=location.latitude,
|
||
longitude=location.longitude,
|
||
elevation_m=location.elevation_m,
|
||
)
|
||
return df
|
||
|
||
|
||
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)}")
|
||
print()
|
||
|
||
df = ensure_sun_elevation(df)
|
||
if df is None or "sun_elevation" not in df.columns:
|
||
return
|
||
|
||
OUTPUT_DIR.mkdir(parents=True, exist_ok=True)
|
||
|
||
profile_keys = ["temperature", "humidity", "illuminance"]
|
||
profile_vars = [VARIABLES_BY_KEY[key] for key in profile_keys]
|
||
bins = np.arange(-90, 95, 5) # bins de 5°
|
||
|
||
stats = compute_binned_statistics(
|
||
df=df,
|
||
bin_source_column="sun_elevation",
|
||
target_columns=[v.column for v in profile_vars],
|
||
bins=bins,
|
||
min_count=100,
|
||
quantiles=(0.2, 0.8),
|
||
)
|
||
|
||
profile_output = OUTPUT_DIR / "sun_elevation_profiles.png"
|
||
plot_binned_profiles(
|
||
stats=stats,
|
||
variables=profile_vars,
|
||
output_path=profile_output,
|
||
xlabel="Élévation solaire (°)",
|
||
title="Profils moyens en fonction de l'élévation solaire",
|
||
show_counts=True,
|
||
)
|
||
print(f"✔ Profils sun vs variables : {profile_output}")
|
||
|
||
hexbin_scenarios = [
|
||
{
|
||
"x": "sun_elevation",
|
||
"y": "illuminance",
|
||
"color": "temperature",
|
||
"filename": "hexbin_sun_elevation_vs_illuminance.png",
|
||
"description": "Illuminance en fonction de l'élévation du soleil, couleur = température.",
|
||
},
|
||
{
|
||
"x": "sun_elevation",
|
||
"y": "temperature",
|
||
"color": "humidity",
|
||
"filename": "hexbin_sun_elevation_vs_temperature.png",
|
||
"description": "Température en fonction de l'élévation, couleur = humidité relative.",
|
||
},
|
||
]
|
||
|
||
for scenario in hexbin_scenarios:
|
||
var_x = VARIABLES_BY_KEY[scenario["x"]]
|
||
var_y = VARIABLES_BY_KEY[scenario["y"]]
|
||
var_color = VARIABLES_BY_KEY[scenario["color"]]
|
||
output_path = OUTPUT_DIR / scenario["filename"]
|
||
|
||
print(f"→ {scenario['description']}")
|
||
plot_hexbin_with_third_variable(
|
||
df=df,
|
||
var_x=var_x,
|
||
var_y=var_y,
|
||
var_color=var_color,
|
||
output_path=output_path,
|
||
gridsize=60,
|
||
mincnt=10,
|
||
reduce_func_label="moyenne",
|
||
cmap="cividis",
|
||
)
|
||
print(f" ✔ Hexbin enregistré : {output_path}")
|
||
|
||
print("✔ Tous les graphiques liés à l'élévation solaire ont été produits.")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|