Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

22 onglet data améliorations #27

Closed
wants to merge 25 commits into from
Closed
Changes from 1 commit
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
fb186a5
[tg] - valeurs par défaut des filtres et optimisation du layout des f…
tgazagnes May 22, 2024
2ad8ba5
[tg] - convert liters to m3
tgazagnes May 22, 2024
47049af
[tg] - wording sous onglet matériaux
tgazagnes May 22, 2024
1c9d037
[tg] - classement par ordre alphabétique dans les filtres
tgazagnes May 22, 2024
b941905
[tg] - wording sous-onglet top déchets
tgazagnes May 22, 2024
c19f74b
[tg] - top déchets : passage rayon en log2
tgazagnes May 23, 2024
55e4894
[tg] - chart labels templates
tgazagnes May 23, 2024
5c17732
[tg] - amélioration format nombres utilisant locale.set_locale
tgazagnes May 24, 2024
042e133
[tg] - bug corrigé
tgazagnes May 24, 2024
f224645
[tg] - note méthodo et exclusion des 100%Autres
tgazagnes May 24, 2024
e1c7a80
[tg} - infobulles dans les graphiques en langage naturel
tgazagnes May 27, 2024
dc7a302
[tg] - onglet matériaux : tableau avec nb collectes par milieu
tgazagnes May 27, 2024
34b0996
[tg] - onglet matériaux - améliorations table nb déchets
tgazagnes May 27, 2024
9f1b0e4
[tg] - séparateurs décimaux et milliers dans les graphiques
tgazagnes May 29, 2024
0835d03
[tg] - sous-onglet matériaux : filtrer sur milieux avec plus de 3 col…
tgazagnes May 29, 2024
9225aea
[tg] - ajout des filtres sur top10 déchets
tgazagnes May 29, 2024
3f24729
[tg] inversion graphs marques et REP
tgazagnes May 29, 2024
5334ee7
[tg] - sous-onglet 3 : filtre sur niveaux 4 (secteurs/REP) et 2à4 (ma…
tgazagnes May 29, 2024
4c048eb
[tg] - retrait des VIDES et INDETERMINES dans les metrics de l'onglet 3
tgazagnes May 29, 2024
f7dc00c
[tg] - ajout %déchets dans graph par secteurs
tgazagnes May 29, 2024
fb43f53
[tg] - amélioration layout 3 onglets
tgazagnes Jun 6, 2024
a9ff5f1
[tg] - optimisation du code des filtres
tgazagnes Jun 6, 2024
858bb7a
[tg] Améliorations suite point Merterre
tgazagnes Jun 6, 2024
0c42b3b
[tg] Ajout détail données utilisées + rayon carto top déchets
tgazagnes Jun 18, 2024
9ddfbed
[tg] remove line from poetry.lock to solve precommit fail
tgazagnes Jun 19, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
[tg] Ajout détail données utilisées + rayon carto top déchets
  • Loading branch information
tgazagnes committed Jun 18, 2024
commit 0c42b3b00f88e1609eb76f5dd9a7a1963294104a
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)} m³
- Volume correspondant aux collectes qui n'ont pas fait l'objet d'un comptage par matériau : {french_format(volume_global_percentage_nul)} m³
- Relevés de niveau 0 et relevés comptabilisant 100% de déchets 'AUTRES', exclus de l'analyse : {french_format(volume_exclu)} m³
- Volume final utilisé pour l'analyse par matériaux : {french_format(volume_total_categorise_apres_exclusions_m3)} m³

"""
)
# 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
Loading