@@ -55,48 +55,118 @@ def load_data():
5555ville_col , org_col , annee_col , equipe_col , centre_col , pays_col = "Ville" , "Organisme_copubliant" , "Année" , "Equipe" , "Centre" , "Pays"
5656
5757# -------------------
58- # Sidebar filtres
58+ # Sidebar filtres (version simplifiée & réactive)
5959# -------------------
6060with st .sidebar :
6161 try :
6262 st .image ("logo.png" , use_container_width = True )
6363 except :
6464 st .caption ("Logo manquant" )
65-
66- st .markdown ("<br>" , unsafe_allow_html = True ) #espace
65+
66+ st .markdown ("<br>" , unsafe_allow_html = True )
6767 st .markdown ("### DATALAKE" )
6868 st .markdown ("<br>" , unsafe_allow_html = True )
69- centres = st .multiselect ("Centre" , sorted (df [centre_col ].dropna ().unique ()))
70- pays = st .multiselect ("Pays" , sorted (df [pays_col ].dropna ().unique ()))
71- villes = st .selectbox ("Ville" , ["Toutes" ] + sorted (df [ville_col ].dropna ().unique ()))
72- organismes = st .multiselect ("Organismes copubliants" , sorted (df [org_col ].dropna ().unique ()))
73- annees = st .multiselect ("Années" , sorted (df [annee_col ].dropna ().unique ()))
74- equipes = st .multiselect ("Équipes" , sorted (df [equipe_col ].dropna ().unique ()))
69+
70+ # --- Initialisation des clés ---
71+ for key in ["centres" , "pays" , "villes" , "organismes" , "annees" , "equipes" ]:
72+ if key not in st .session_state :
73+ if key == "villes" :
74+ st .session_state [key ] = "Toutes"
75+ else :
76+ st .session_state [key ] = []
77+
78+ # --- Calcul des options selon sélection en cours ---
79+ # 1. Centres (global)
80+ centres_opts = sorted (df [centre_col ].dropna ().unique ())
81+ st .session_state .centres = st .multiselect (
82+ "Centre" ,
83+ centres_opts ,
84+ default = st .session_state .centres
85+ )
86+
87+ tmp = df .copy ()
88+ if st .session_state .centres :
89+ tmp = tmp [tmp [centre_col ].isin (st .session_state .centres )]
90+
91+ # 2. Pays
92+ pays_opts = sorted (tmp [pays_col ].dropna ().unique ())
93+ st .session_state .pays = st .multiselect (
94+ "Pays" ,
95+ pays_opts ,
96+ default = [x for x in st .session_state .pays if x in pays_opts ]
97+ )
98+
99+ if st .session_state .pays :
100+ tmp = tmp [tmp [pays_col ].isin (st .session_state .pays )]
101+
102+ # 3. Villes
103+ villes_opts = ["Toutes" ] + sorted (tmp [ville_col ].dropna ().unique ())
104+ st .session_state .villes = st .selectbox (
105+ "Ville" ,
106+ villes_opts ,
107+ index = villes_opts .index (st .session_state .villes )
108+ if st .session_state .villes in villes_opts else 0
109+ )
110+
111+ if st .session_state .villes != "Toutes" :
112+ tmp = tmp [tmp [ville_col ] == st .session_state .villes ]
113+
114+ # 4. Organismes
115+ orgs_opts = sorted (tmp [org_col ].dropna ().unique ())
116+ st .session_state .organismes = st .multiselect (
117+ "Organismes copubliants" ,
118+ orgs_opts ,
119+ default = [x for x in st .session_state .organismes if x in orgs_opts ]
120+ )
121+
122+ if st .session_state .organismes :
123+ tmp = tmp [tmp [org_col ].isin (st .session_state .organismes )]
124+
125+ # 5. Années
126+ annees_opts = sorted (tmp [annee_col ].dropna ().unique ())
127+ st .session_state .annees = st .multiselect (
128+ "Années" ,
129+ annees_opts ,
130+ default = [x for x in st .session_state .annees if x in annees_opts ]
131+ )
132+
133+ if st .session_state .annees :
134+ tmp = tmp [tmp [annee_col ].isin (st .session_state .annees )]
135+
136+ # 6. Équipes
137+ equipes_opts = sorted (tmp [equipe_col ].dropna ().unique ())
138+ st .session_state .equipes = st .multiselect (
139+ "Équipes" ,
140+ equipes_opts ,
141+ default = [x for x in st .session_state .equipes if x in equipes_opts ]
142+ )
75143
76144 st .markdown ("<br>" , unsafe_allow_html = True )
77-
78- # Texte en bas du contenu des filtres
79145 st .caption (
80146 "Proposé par le groupe **DATALAKE** : Kumar Guha, Daniel Da Silva et Andréa Nebot \n "
81147 "à la demande de Luigi Liquori et Maria Kazolea"
82148 )
83-
149+
84150# -------------------
85- # Filtrage
151+ # Filtrage final
86152# -------------------
87- df_filtered = df .copy ()
88- if centres :
89- df_filtered = df_filtered [df_filtered [centre_col ].isin (centres )]
90- if pays :
91- df_filtered = df_filtered [df_filtered [pays_col ].isin (pays )]
92- if villes != "Toutes" :
93- df_filtered = df_filtered [df_filtered [ville_col ] == villes ]
94- if organismes :
95- df_filtered = df_filtered [df_filtered [org_col ].isin (organismes )]
96- if annees :
97- df_filtered = df_filtered [df_filtered [annee_col ].isin (annees )]
98- if equipes :
99- df_filtered = df_filtered [df_filtered [equipe_col ].isin (equipes )]
153+ def get_filtered_df ():
154+ tmp = df .copy ()
155+ if st .session_state .centres :
156+ tmp = tmp [tmp [centre_col ].isin (st .session_state .centres )]
157+ if st .session_state .pays :
158+ tmp = tmp [tmp [pays_col ].isin (st .session_state .pays )]
159+ if st .session_state .villes != "Toutes" :
160+ tmp = tmp [tmp [ville_col ] == st .session_state .villes ]
161+ if st .session_state .organismes :
162+ tmp = tmp [tmp [org_col ].isin (st .session_state .organismes )]
163+ if st .session_state .annees :
164+ tmp = tmp [tmp [annee_col ].isin (st .session_state .annees )]
165+ if st .session_state .equipes :
166+ tmp = tmp [tmp [equipe_col ].isin (st .session_state .equipes )]
167+ return tmp
168+
169+ df_filtered = get_filtered_df ()
100170
101171# -------------------
102172# Fonctions utiles
0 commit comments