ExtremePrecipit / app /utils /menus_utils.py
ncsdecoopman's picture
Déploiement Docker depuis workflow (structure corrigée)
0ab0788
import streamlit as st
from pathlib import Path
from app.utils.config_utils import reverse_param_label
def menu_statisticals(min_years: int, max_years: int, STATS, SEASON):
if "selected_point" not in st.session_state:
st.session_state["selected_point"] = None
if "run_analysis" not in st.session_state:
st.session_state["run_analysis"] = False
# Crée les colonnes
col0, col1, col2, col3, col4, col5, col6, col7 = st.columns([0.3, 0.3, 0.2, 0.25, 0.25, 0.25, 0.2, 0.2])
with col0:
st.selectbox("Statistique étudiée", list(STATS.keys()), key="stat_choice")
with col1:
st.slider(
"Staturation couleurs",
min_value=0.950,
max_value=1.00,
value=0.995,
step=0.001,
format="%.3f",
key="quantile_choice"
)
with col2:
st.selectbox("Saison", list(SEASON.keys()), key="season_choice")
with col3:
season = st.session_state["season_choice"]
if season in ["Année hydrologique", "Hiver"]:
st.slider(
"Période",
min_value=min_years+1,
max_value=max_years,
value=(min_years+1, max_years),
key="year_range"
)
else:
st.slider(
"Période",
min_value=min_years,
max_value=max_years,
value=(min_years, max_years),
key="year_range"
)
with col4:
if st.session_state["stat_choice"] in ["Cumul", "Jour de pluie"]:
st.selectbox("Echelle temporelle", ["Journalière"], key="scale_choice")
else:
st.selectbox("Echelle temporelle", ["Journalière", "Horaire"], key="scale_choice")
with col5:
st.slider(
"Données manquantes",
min_value=0.0,
max_value=1.0,
value=0.1,
step=0.01,
key="missing_rate"
)
with col6:
st.checkbox("Courbes de niveaux", value=False, key="show_relief") # Case à cocher
st.checkbox("Afficher les stations", value=False, key="show_stations") # Case à cocher
with col7:
if st.button("Lancer l’analyse"):
st.session_state["run_analysis"] = True
if st.session_state["run_analysis"]:
return (
st.session_state["stat_choice"],
st.session_state["quantile_choice"],
st.session_state["year_range"][0],
st.session_state["year_range"][1],
st.session_state["season_choice"],
st.session_state["scale_choice"],
st.session_state["missing_rate"],
st.session_state["show_relief"],
st.session_state["show_stations"]
)
else:
return None
def menu_gev(config: dict, model_options: dict, ns_param_map: dict, SEASON, show_param: bool):
if "run_analysis" not in st.session_state:
st.session_state["run_analysis"] = False
col0, col1, col2, col3, col4, col5, col6, col7 = st.columns([0.6, 0.9, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5])
# Échelle
with col0:
Echelle = st.selectbox("Echelle temporelle", ["Journalière", "Horaire"], key="scale_choice")
st.session_state["echelle"] = "quotidien" if Echelle.lower() == "journalière" else "horaire"
st.session_state["unit"] = "mm/j" if st.session_state["echelle"] == "quotidien" else "mm/h"
# Modèle
with col1:
selected_model = st.selectbox(
"Modèle GEV",
[None] + list(model_options.keys()),
format_func=lambda x: "— Choisir un modèle —" if x is None else x,
key="model_type"
)
if st.session_state["model_type"] is not None:
model_name = model_options[st.session_state["model_type"]]
st.session_state["model_name"] = model_name
# Quantile
with col2:
st.selectbox("Choix de la saison", list(SEASON.keys()), key="season_choice")
with col3:
st.slider(
"Percentile de retrait",
min_value=0.950,
max_value=1.000,
value=1.000,
step=0.001,
format="%.3f",
key="quantile_choice"
)
# Paramètre GEV
with col4:
if show_param:
param_map = ns_param_map[model_name]
available_params = list(param_map.values()) # labels unicode
selected_label = st.selectbox(
"Paramètre GEV à afficher",
available_params,
index=0,
key="gev_param_choice"
)
# Conversion propre
st.session_state["param_choice"] = reverse_param_label(
selected_label, model_name, ns_param_map
)
else:
# st.session_state["param_choice"] = "Δqᵀ"
# selected_label = "Δqᵀ"
selected_label = st.selectbox(
"Quantité à afficher",
["Δqᵀ", "ΔE", "ΔVar", "ΔCV"],
index=0,
key="delta_param_choice"
)
st.session_state["param_choice"] = selected_label
if selected_label in ["Δqᵀ"]:
with col5:
st.slider(
"Niveau de retour",
min_value=10,
max_value=100,
value=10,
step=10,
key="T_choice"
)
else:
st.session_state["T_choice"] = None
if selected_label in ["Δqᵀ", "ΔE", "ΔVar", "ΔCV"]:
with col6:
st.slider(
"Delta annees",
min_value=1,
max_value=60,
value=10,
step=1,
key="par_X_annees"
)
else:
st.session_state["par_X_annees"] = None
# Bouton d’analyse
with col7:
if st.button("Lancer l’analyse"):
st.session_state["run_analysis"] = True
if st.session_state["run_analysis"]:
# Valeurs par défaut
stat_choice_key = "max"
scale_choice_key = "mm_j" if st.session_state["echelle"] == "quotidien" else "mm_h"
season_choice_key = SEASON[st.session_state["season_choice"]]
min_year_choice = config["years"]["min"] + 1 if season_choice_key in ["hydro", "djf"] else config["years"]["min"]
max_year_choice = config["years"]["max"]
missing_rate = 0.15
# Répertoires
mod_dir = Path(config["gev"]["modelised"]) / st.session_state["echelle"] / season_choice_key
obs_dir = Path(config["gev"]["observed"]) / st.session_state["echelle"] / season_choice_key
return {
"echelle": st.session_state["echelle"],
"unit": st.session_state["unit"],
"model_name": st.session_state["model_name"],
"model_name_pres": selected_model,
"param_choice": st.session_state["param_choice"],
"param_choice_pres": selected_label,
"quantile_choice": st.session_state["quantile_choice"],
"stat_choice_key": stat_choice_key,
"scale_choice_key": scale_choice_key,
"season_choice_key": season_choice_key,
"season_choice": st.session_state["season_choice"],
"min_year_choice": min_year_choice,
"max_year_choice": max_year_choice,
"missing_rate": missing_rate,
"mod_dir": mod_dir,
"obs_dir": obs_dir,
"T_choice": st.session_state["T_choice"],
"par_X_annees": st.session_state["par_X_annees"]
}
return None