Skip to content

Commit

Permalink
[tg] Ajout détail données utilisées + rayon carto top déchets
Browse files Browse the repository at this point in the history
  • Loading branch information
tgazagnes committed Jun 18, 2024
1 parent 858bb7a commit 0c42b3b
Showing 1 changed file with 60 additions and 32 deletions.
92 changes: 60 additions & 32 deletions dashboards/app/pages/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,6 +142,9 @@ def french_format(x: int) -> str:

# variables à décroiser de la base de données correspondant aux Volume global de chaque matériau
cols_volume = [k for k in df_other.columns if "GLOBAL_VOLUME_" in k]
volume_total_categorise_avant_exclusions = (
df_other[cols_volume].sum().sum() / 1000
)

# Copie des données pour transfo
df_volume = df_other.copy()
Expand All @@ -153,8 +156,12 @@ def french_format(x: int) -> str:
# Volume en litres dans la base, converti en m3
volume_total_m3 = df_volume["VOLUME_TOTAL"].sum() / 1000
poids_total = df_volume["POIDS_TOTAL"].sum()
volume_total_categorise_m3 = df_volume_cleaned[cols_volume].sum().sum() / 1000
pct_volume_categorise = volume_total_categorise_m3 / volume_total_m3
volume_total_categorise_apres_exclusions_m3 = (
df_volume_cleaned[cols_volume].sum().sum() / 1000
)
pct_volume_categorise = (
volume_total_categorise_apres_exclusions_m3 / volume_total_m3
)
# Nb total de collecte incluant les 100% autres et les relevés de niveau 0
nb_collectes_int = df_volume["ID_RELEVE"].nunique()
# Nb de collectes excluant les 100% autres et les relevés de niveau 0
Expand Down Expand Up @@ -235,17 +242,32 @@ def french_format(x: int) -> str:
cell3.metric("Nombre de ramassages", nb_collectes_int)

# Note méthodo pour expliquer les données retenues pour l'analyse
# Périmètre des données
volume_total_avant_exclusions_m3 = df_other["VOLUME_TOTAL"].sum() / 1000
volume_exclu = (
volume_total_categorise_avant_exclusions
- volume_total_categorise_apres_exclusions_m3
)
volume_global_percentage_nul = (
df_other[df_other["GLOBAL_POURCENTAGE_TOTAL"] == 0]["VOLUME_TOTAL"].sum()
/ 1000
)

with st.expander("Note sur les données utilisées dans cet onglet"):
st.markdown(
f"""
- Il n’y a pas de correspondance entre le poids et le volume global\
de déchets indiqués car certaines organisations \
ne renseignent que le volume sans mention de poids \
(protocole de niveau 1) ou inversement.
- Les chiffres ci-dessous sont calculés sur **{nb_collectes_carac}** ramassages \
ayant fait l’objet d’une estimation des volumes \
par matériau, soit un volume total de {french_format(volume_total_categorise_m3)} m³.\
Les relevés de niveau 0 et les relevés comptabilisant 100% de déchets 'AUTRES' ont été exclus.
- Certaines collectes n'ont pas fait l'objet d'un comptage par matériau. Par conséquent, le volume utilisé pour l'analyse est de **{french_format(volume_total_categorise_apres_exclusions_m3)} m³**, calculé sur **{nb_collectes_carac} ramassages** \
- Détails :
- Volume total enregistré dans la base de données : {french_format(volume_total_avant_exclusions_m3)}
- Volume correspondant aux collectes qui n'ont pas fait l'objet d'un comptage par matériau : {french_format(volume_global_percentage_nul)}
- Relevés de niveau 0 et relevés comptabilisant 100% de déchets 'AUTRES', exclus de l'analyse : {french_format(volume_exclu)}
- Volume final utilisé pour l'analyse par matériaux : {french_format(volume_total_categorise_apres_exclusions_m3)}
"""
)
# Afficher le nombre de relevés inclus ou exclus
Expand All @@ -255,7 +277,6 @@ def french_format(x: int) -> str:
.sort_values(ascending=False)
)
df_note_methodo.rename("Nombre de relevés", inplace=True)
st.dataframe(df_note_methodo)

# Ligne 2 : 2 graphiques en ligne : donut et bar chart matériaux

Expand Down Expand Up @@ -344,7 +365,16 @@ def french_format(x: int) -> str:

### GRAPHIQUE PAR MILIEU DE COLLECTE

# Calcul du nombre de collectes par milieu
# Calcul du dataframe groupé par milieu et matériau pour le graphique
df_typemilieu = df_volume_cleaned.groupby(
["TYPE_MILIEU", "Matériau"], as_index=False
).agg({"Volume_m3": "sum", "ID_RELEVE": "count"})

df_typemilieu = df_typemilieu.sort_values(
["TYPE_MILIEU", "Volume_m3"], ascending=True
)

# Calcul du nombre de collectes par milieu pour exclure les milieux à moins de 3 collectes
df_nb_par_milieu = (
df_other.groupby("TYPE_MILIEU", as_index=True)
.agg(
Expand All @@ -354,22 +384,12 @@ def french_format(x: int) -> str:
)
.sort_values("TYPE_MILIEU", ascending=True)
)

# Exclure les milieux avec moins de 3 collectes
milieux_a_exclure = df_nb_par_milieu[
df_nb_par_milieu["ID_RELEVE"] <= 3
].index.to_list()
df_nb_par_milieu = df_nb_par_milieu.drop(milieux_a_exclure, axis=0)

# Calcul du dataframe groupé par milieu et matériau pour le graphique
df_typemilieu = df_volume_cleaned.groupby(
["TYPE_MILIEU", "Matériau"], as_index=False
).agg({"Volume_m3": "sum", "ID_RELEVE": "count"})

df_typemilieu = df_typemilieu.sort_values(
["TYPE_MILIEU", "Volume_m3"], ascending=True
)

# Retirer milieux avec moins de 3 collectes
df_typemilieu = df_typemilieu[
~df_typemilieu["TYPE_MILIEU"].isin(milieux_a_exclure)
]
Expand All @@ -378,6 +398,14 @@ def french_format(x: int) -> str:
lignes_multi = df_typemilieu.loc[df_typemilieu["TYPE_MILIEU"] == "Multi-lieux"]
df_typemilieu.drop(lignes_multi.index, axis=0, inplace=True)

# Fusionner les dataframe pour obtenir le nb de collectes et le volume par milieu
df_nb_par_milieu = pd.merge(
df_nb_par_milieu,
df_typemilieu.groupby("TYPE_MILIEU")["Volume_m3"].sum(),
on="TYPE_MILIEU",
how="left",
)

# Graphique à barre empilées du pourcentage de volume collecté par an et type de matériau
fig3 = px.histogram(
df_typemilieu,
Expand Down Expand Up @@ -450,18 +478,17 @@ def french_format(x: int) -> str:
# Affichage du tableau
st.write("**Nombre de ramassages par milieu**")
st.table(df_nb_par_milieu.T)
st.caption(
f"Les ramassages catégorisés en 'Multi-lieux' "
+ f"ont été retirés de l'analyse. "
+ f"Les milieux représentant moins de 3 ramassages ne sont pas affichés."
)

else:
st.warning(
"⚠️ Aucune donnée à afficher par type de milieu (nombre de ramassages trop faible)"
)

st.caption(
f"Les ramassages catégorisés en 'Multi-lieux' "
+ f"ont été retirés de l'analyse. "
+ f"Les milieux représentant moins de 3 ramassages ne sont pas affichés."
)

# Ligne 3 : Graphe par milieu , lieu et année
st.write("**Détail par année, type de milieu ou de lieu**")

Expand Down Expand Up @@ -831,9 +858,10 @@ def french_format(x: int) -> str:

for index, row in df_map_data.iterrows():

# Calcul du rayon du marqueur en log base 2 pour réduire les écarts
# Calcul du rayon du marqueur en log base 2 pour réduire les écarts
if row["nb_dechet"] > 1:
radius = math.log2(row["nb_dechet"])
radius = math.log2(row["nb_dechet"] / 10) * 2

else:
radius = 0.001

Expand All @@ -847,11 +875,11 @@ def french_format(x: int) -> str:
radius=radius, # Utilisation du rayon ajusté
popup=folium.Popup(
html=f"""
Commune : <b>{row['LIEU_VILLE']}</b><br>
Zone : <b>{row['NOM_ZONE']}</b><br>
Quantité : <b>{formatted_nb_dechet} {selected_dechet}</b><br>
Date : <b>{row['DATE']}</b>
""",
Quantité : <b>{formatted_nb_dechet} </b><br>
Date : <b>{row['DATE']}</b><br>
Commune : <b>{row['LIEU_VILLE']}</b><br>
Zone : <b>{row['NOM_ZONE']}</b><br>
""",
max_width=150,
),
color="#3186cc",
Expand Down

0 comments on commit 0c42b3b

Please sign in to comment.