Skip to content

Commit

Permalink
[tg] - ajout des filtres sur top10 déchets
Browse files Browse the repository at this point in the history
  • Loading branch information
tgazagnes committed May 29, 2024
1 parent 0835d03 commit 9225aea
Showing 1 changed file with 136 additions and 46 deletions.
182 changes: 136 additions & 46 deletions dashboards/app/pages/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ def carac_exclusions(df):
)

# Copier le df pour la partie filtrée par milieu/lieu/année
df_other_metrics_raw = df_other.copy()
# df_other_metrics_raw = df_other.copy()

# Fonction pour améliorer l'affichage des nombres (milliers, millions, milliards)
def french_format(x: int) -> str:
Expand Down Expand Up @@ -466,8 +466,8 @@ def french_format(x: int) -> str:

# Étape 1: Création des filtres

df_other_metrics = df_other_metrics_raw.copy()
df_other_metrics = df_other_metrics.fillna(0)
# df_other_metrics = df_other_metrics_raw.copy()
# df_other_metrics = df_other_metrics.fillna(0)

with st.expander("Filtrer par année, type milieu ou type de lieu"):

Expand All @@ -483,12 +483,12 @@ def french_format(x: int) -> str:
filtered_data_milieu = df_other[
df_other["ANNEE"] == selected_annee
].copy()
filtered_metrics_milieu = df_other_metrics[
df_other_metrics["ANNEE"] == selected_annee
].copy()
# filtered_metrics_milieu = df_other_metrics[
# df_other_metrics["ANNEE"] == selected_annee
# ].copy()
else:
filtered_data_milieu = df_other.copy()
filtered_metrics_milieu = df_other_metrics.copy()
# filtered_metrics_milieu = df_other_metrics.copy()

## Filtre par milieu
# Initialiser le champ déroulant avec une valeur par défaut
Expand All @@ -506,12 +506,12 @@ def french_format(x: int) -> str:
filtered_data_lieu = filtered_data_milieu[
filtered_data_milieu["TYPE_MILIEU"] == selected_type_milieu
]
filtered_metrics_milieu = filtered_metrics_milieu[
filtered_metrics_milieu["TYPE_MILIEU"] == selected_type_milieu
]
# filtered_metrics_milieu = filtered_metrics_milieu[
# filtered_metrics_milieu["TYPE_MILIEU"] == selected_type_milieu
# ]
else:
filtered_data_lieu = filtered_data_milieu.copy()
filtered_metrics_milieu = df_other_metrics.copy()
# filtered_metrics_milieu = df_other_metrics.copy()

# Filtre par type de lieu

Expand All @@ -531,15 +531,15 @@ def french_format(x: int) -> str:
and selected_type_lieu == valeur_par_defaut_lieu
):
df_filtered = df_other.copy()
df_filtered_metrics = df_other_metrics_raw.copy()
# df_filtered_metrics = df_other_metrics_raw.copy()
elif (
selected_type_milieu == valeur_par_defaut_milieu
and selected_type_lieu == valeur_par_defaut_lieu
):
df_filtered = df_other[df_other["ANNEE"] == selected_annee].copy()
df_filtered_metrics = df_other_metrics_raw[
df_other_metrics["ANNEE"] == selected_annee
].copy()
# df_filtered_metrics = df_other_metrics_raw[
# df_other_metrics["ANNEE"] == selected_annee
# ].copy()
elif (
selected_annee == valeur_par_defaut_annee
and selected_type_lieu == valeur_par_defaut_lieu
Expand All @@ -548,19 +548,19 @@ def french_format(x: int) -> str:
df_filtered = df_other[
df_other["TYPE_MILIEU"] == selected_type_milieu
].copy()
df_filtered_metrics = df_other_metrics_raw[
df_other_metrics["TYPE_MILIEU"] == selected_type_milieu
].copy()
# df_filtered_metrics = df_other_metrics_raw[
# df_other_metrics["TYPE_MILIEU"] == selected_type_milieu
# ].copy()

elif (
selected_annee == valeur_par_defaut_annee
and selected_type_lieu != valeur_par_defaut_lieu
and selected_type_milieu == valeur_par_defaut_milieu
):
df_filtered = df_other[df_other["TYPE_LIEU"] == selected_type_lieu].copy()
df_filtered_metrics = df_other_metrics_raw[
df_other_metrics["TYPE_LIEU"] == selected_type_lieu
].copy()
# df_filtered_metrics = df_other_metrics_raw[
# df_other_metrics["TYPE_LIEU"] == selected_type_lieu
# ].copy()

elif (
selected_annee == valeur_par_defaut_annee
Expand All @@ -571,10 +571,10 @@ def french_format(x: int) -> str:
(df_other["TYPE_LIEU"] == selected_type_lieu)
& (df_other["TYPE_MILIEU"] == selected_type_milieu)
].copy()
df_filtered_metrics = df_other_metrics_raw[
(df_other_metrics["TYPE_LIEU"] == selected_type_lieu)
& (df_other_metrics["TYPE_MILIEU"] == selected_type_milieu)
]
# df_filtered_metrics = df_other_metrics_raw[
# (df_other_metrics["TYPE_LIEU"] == selected_type_lieu)
# & (df_other_metrics["TYPE_MILIEU"] == selected_type_milieu)
# ]
elif (
selected_annee != valeur_par_defaut_annee
and selected_type_lieu != valeur_par_defaut_lieu
Expand All @@ -584,10 +584,10 @@ def french_format(x: int) -> str:
(df_other["ANNEE"] == selected_annee)
& (df_other["TYPE_LIEU"] == selected_type_lieu)
].copy()
df_filtered_metrics = df_other_metrics_raw[
(df_other_metrics["ANNEE"] == selected_annee)
& (df_other_metrics["TYPE_LIEU"] == selected_type_lieu)
]
# df_filtered_metrics = df_other_metrics_raw[
# (df_other_metrics["ANNEE"] == selected_annee)
# & (df_other_metrics["TYPE_LIEU"] == selected_type_lieu)
# ]
elif (
selected_annee != valeur_par_defaut_annee
and selected_type_lieu == valeur_par_defaut_lieu
Expand All @@ -597,32 +597,32 @@ def french_format(x: int) -> str:
(df_other["ANNEE"] == selected_annee)
& (df_other["TYPE_MILIEU"] == selected_type_milieu)
].copy()
df_filtered_metrics = df_other_metrics_raw[
(df_other_metrics["ANNEE"] == selected_annee)
& (df_other_metrics["TYPE_MILIEU"] == selected_type_milieu)
]
# df_filtered_metrics = df_other_metrics_raw[
# (df_other_metrics["ANNEE"] == selected_annee)
# & (df_other_metrics["TYPE_MILIEU"] == selected_type_milieu)
# ]

else:
df_filtered = df_other[
(df_other["ANNEE"] == selected_annee)
& (df_other["TYPE_MILIEU"] == selected_type_milieu)
& (df_other["TYPE_LIEU"] == selected_type_lieu)
].copy()
df_filtered_metrics = df_other_metrics_raw[
(df_other_metrics["ANNEE"] == selected_annee)
& (df_other_metrics["TYPE_MILIEU"] == selected_type_milieu)
& (df_other_metrics["TYPE_LIEU"] == selected_type_lieu)
]
# df_filtered_metrics = df_other_metrics_raw[
# (df_other_metrics["ANNEE"] == selected_annee)
# & (df_other_metrics["TYPE_MILIEU"] == selected_type_milieu)
# & (df_other_metrics["TYPE_LIEU"] == selected_type_lieu)
# ]

# Ligne 5 : Metriques filtrés
l5_col1, l5_col2, l5_col3 = st.columns(3)
cell6 = l5_col1.container(border=True)
cell7 = l5_col2.container(border=True)
cell8 = l5_col3.container(border=True)

poids_total_filtered = df_filtered_metrics["POIDS_TOTAL"].sum()
poids_total_filtered = df_filtered["POIDS_TOTAL"].sum()
# Volume litres converti en m3
volume_total_filtered_m3 = df_filtered_metrics["VOLUME_TOTAL"].sum() / 1000
volume_total_filtered_m3 = df_filtered["VOLUME_TOTAL"].sum() / 1000

cell6.metric(
"Volume de déchets collectés",
Expand Down Expand Up @@ -720,11 +720,103 @@ def french_format(x: int) -> str:
df_top = df_nb_dechet.copy()
df_top_data_releves = df_other.copy()

filtered_df = df_other.copy() # Initialiser le df sans filtres

# Filtres
with st.expander("Filtrer par année, type milieu ou type de lieu"):

# Définir les options
annee_options = sorted(df_other["ANNEE"].unique().tolist(), reverse=True)
options_annee = [valeur_par_defaut_annee] + annee_options
options_milieux = [valeur_par_defaut_milieu] + sorted(
list(df_other["TYPE_MILIEU"].unique())
)
options_lieux = [valeur_par_defaut_lieu] + sorted(
list(df_other["TYPE_LIEU"].unique())
)

annee = st.selectbox(
"Choisir une année :",
options=options_annee,
index=options_annee.index(valeur_par_defaut_annee), # Définir l'index
key="topdechets_annee", # définir key pour éviter conflits
)

milieu = st.selectbox(
"Choisir un type de milieu :",
options=options_milieux,
index=options_milieux.index(
valeur_par_defaut_milieu
), # Définir l'index
key="topdechets_milieu", # définir key pour éviter conflits
)

# Mise à jour dynamique des filtres
if milieu != valeur_par_defaut_milieu:
options_lieux = [valeur_par_defaut_lieu] + list(
milieu_lieu_dict[milieu]
)

lieu = st.selectbox(
"Choisir un type de lieu :",
options=options_lieux,
index=options_lieux.index(valeur_par_defaut_lieu), # Définir l'index
key="topdechets_lieu", # définir key pour éviter conflits
)

# Conditions pour filtrer les valeurs et ne pas considérer la valeur par défaut dans le filtre
if annee == valeur_par_defaut_annee: # Aucun filtre annee
if milieu == valeur_par_defaut_milieu: # Aucun filtre milieu
if lieu == valeur_par_defaut_lieu: # Aucun filtre lieu
pass # Pas de filtre
else: # Si lieu choisi
filtered_df = filtered_df[(filtered_df["TYPE_LIEU"] == lieu)]
else: # Si milieu choisi
if lieu == valeur_par_defaut_lieu: # Aucun filtre lieu
filtered_df = filtered_df[(filtered_df["TYPE_MILIEU"] == milieu)]
else: # Si milieu ET lieu choisi
filtered_df = filtered_df[
(filtered_df["TYPE_MILIEU"] == milieu)
& (filtered_df["TYPE_LIEU"] == lieu)
]
else: # Si annee a été choisie
if milieu == valeur_par_defaut_milieu: # Aucun filtre milieu
if lieu == valeur_par_defaut_lieu: # Aucun filtre lieu
filtered_df = filtered_df[
(filtered_df["ANNEE"] == annee)
] # Filtre annee uniquement
else: # Si lieu choisi
filtered_df = filtered_df[
(filtered_df["ANNEE"] == annee)
& (filtered_df["TYPE_LIEU"] == lieu)
]
else: # Si milieu choisi
if lieu == valeur_par_defaut_lieu: # Aucun filtre lieu
filtered_df = filtered_df[
(filtered_df["ANNEE"] == annee)
& (filtered_df["TYPE_MILIEU"] == milieu)
]
else: # Si milieu ET lieu choisi : 3 filtres
filtered_df = filtered_df[
(filtered_df["ANNEE"] == annee)
& (filtered_df["TYPE_MILIEU"] == milieu)
& (filtered_df["TYPE_LIEU"] == lieu)
]

# Récupérer les index de collectes pour filtrer le dataframe nb_dechets
# Filtrer les données sur les ID_RELEVES
df_top10 = pd.merge(df_top, filtered_df, on="ID_RELEVE", how="inner")

# Retrait des lignes avec 100% de volume catégorisé en AUTRE
df_top10 = df_top10[df_top10["Exclusions"] == "Inclus"]

# Calcul du nombre total de déchets catégorisés sur le territoier
nb_total_dechets = df_top[(df_top["type_regroupement"] == "GROUPE")][
nb_total_dechets = df_top10[(df_top10["type_regroupement"] == "GROUPE")][
"nb_dechet"
].sum()

nb_collec_top = df_top10["ID_RELEVE"].nunique()

# Ligne 1 : 3 cellules avec les indicateurs clés en haut de page
l1_col1, l1_col2 = st.columns(2)
# Pour avoir 3 cellules avec bordure, il faut nester un st.container dans chaque colonne (pas d'option bordure dans st.column)
Expand All @@ -736,7 +828,7 @@ def french_format(x: int) -> str:

# 3ème métrique : nombre de relevés
cell2 = l1_col2.container(border=True)
cell2.metric("Nombre de ramassages", french_format(nb_collectes_int))
cell2.metric("Nombre de ramassages", french_format(nb_collec_top))

# Message d'avertissement nb de collectes en dessous de 5
if nb_collectes_int <= 5:
Expand All @@ -748,8 +840,6 @@ def french_format(x: int) -> str:

# Ligne 2 : graphique top déchets

# Filtration des données pour nb_dechets
df_top10 = pd.merge(df_top, df_top_data_releves, on="ID_RELEVE", how="inner")
# Filtration sur les type-regroupement selection dechets "GROUPE" uniquement
df_dechets_groupe = df_top10[df_top10["type_regroupement"].isin(["GROUPE"])]
# Group by 'categorie', sum 'nb_dechet', et top 10
Expand Down Expand Up @@ -824,9 +914,9 @@ def french_format(x: int) -> str:

st.write("")
st.caption(
f"Note : Les chiffres ci-dessous sont calculés sur XX ramassages \
f"Note : Les chiffres ci-dessous sont calculés sur {nb_collec_top} ramassages \
ayant fait l’objet d’une estimation des volumes \
par matériau, soit un volume total de {french_format(volume_total_categorise_m3)}."
par matériau."
)

with st.container(border=True):
Expand Down

0 comments on commit 9225aea

Please sign in to comment.