Spaces:
Running
Running
LaurentTRIPIED
commited on
Commit
•
98691d1
1
Parent(s):
c8c3cc4
V2 avec Data bziiit
Browse files- ActionsRSE.py +5 -2
- AnalyseActionsRSE.py +160 -6
- DATA_bziiit/__init__.py +0 -0
- ISO26000.py +48 -0
- app.py +20 -17
- data_manager.py +1 -1
- data_manager_bziiit.py +29 -0
- impactscore.py +57 -0
- labelRSE.py +61 -0
- localisation.py +1 -1
- marquesengagees.py +7 -0
- organisations_engagees.py +1 -1
- projetRSE.py +48 -0
- statistiques.py +1 -1
ActionsRSE.py
CHANGED
@@ -1,4 +1,3 @@
|
|
1 |
-
|
2 |
import streamlit as st
|
3 |
import data_manager
|
4 |
|
@@ -8,7 +7,7 @@ def display_actions_rse():
|
|
8 |
|
9 |
if total_hits > 0:
|
10 |
# Ajout des titres en haut de l'écran, similaires à organisations_engagees.py mais avec un texte personnalisé
|
11 |
-
st.markdown("## OPEN DATA RSE")
|
12 |
st.markdown("### Découvrer les actions RSE des organisations engagées de Bordeaux Métropole")
|
13 |
|
14 |
secteurs = sorted({record.get("libelle_section_naf") for record in data if record.get("libelle_section_naf")})
|
@@ -27,5 +26,9 @@ def display_actions_rse():
|
|
27 |
st.markdown(f":green_heart: **Entreprise**: {action.get('nom_courant_denomination')}\n\n**Action**: {action.get('action_rse')}", unsafe_allow_html=True)
|
28 |
else:
|
29 |
st.write("Aucune action RSE correspondante trouvée.")
|
|
|
|
|
|
|
|
|
30 |
else:
|
31 |
st.write("Erreur lors de la récupération des données.")
|
|
|
|
|
1 |
import streamlit as st
|
2 |
import data_manager
|
3 |
|
|
|
7 |
|
8 |
if total_hits > 0:
|
9 |
# Ajout des titres en haut de l'écran, similaires à organisations_engagees.py mais avec un texte personnalisé
|
10 |
+
st.markdown("## OPEN DATA Bordeaux Métropole RSE")
|
11 |
st.markdown("### Découvrer les actions RSE des organisations engagées de Bordeaux Métropole")
|
12 |
|
13 |
secteurs = sorted({record.get("libelle_section_naf") for record in data if record.get("libelle_section_naf")})
|
|
|
26 |
st.markdown(f":green_heart: **Entreprise**: {action.get('nom_courant_denomination')}\n\n**Action**: {action.get('action_rse')}", unsafe_allow_html=True)
|
27 |
else:
|
28 |
st.write("Aucune action RSE correspondante trouvée.")
|
29 |
+
|
30 |
+
# Afficher le total des actions RSE
|
31 |
+
st.markdown(f"**Total des actions RSE :** {len(actions_filtrees)}")
|
32 |
+
|
33 |
else:
|
34 |
st.write("Erreur lors de la récupération des données.")
|
AnalyseActionsRSE.py
CHANGED
@@ -1,10 +1,164 @@
|
|
1 |
-
# IA_RSE/AnalyseActionsRSE.py
|
2 |
import streamlit as st
|
3 |
-
import
|
|
|
4 |
from data_manager import get_data
|
5 |
|
6 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
7 |
def display_analyse_actions_rse():
|
8 |
-
st.markdown("## IA RSE")
|
9 |
-
st.markdown("### Classification des actions RSE selon
|
10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
import streamlit as st
|
2 |
+
from ISO26000 import classify_actions_rse_ISO26000 as classify_iso26000
|
3 |
+
from impactscore import classify_actions_rse_IMPACTSCORE as classify_impactscore
|
4 |
from data_manager import get_data
|
5 |
|
6 |
+
criteria = {}
|
7 |
+
if "Autres" not in criteria:
|
8 |
+
criteria["Autres"] = []
|
9 |
+
|
10 |
+
company_info = "Some company info"
|
11 |
+
|
12 |
+
criteria["Autres"].append(company_info)
|
13 |
+
|
14 |
def display_analyse_actions_rse():
|
15 |
+
st.markdown("## IA RSE :mag_right:")
|
16 |
+
st.markdown("### Classification des actions RSE selon 3 approches :")
|
17 |
+
|
18 |
+
approach = st.radio(
|
19 |
+
"Choisissez l'approche de classification :point_down:",
|
20 |
+
|
21 |
+
["Norme ISO 26000", "ODD Objectifs de Développement Durable (en cours de développement)","Impact Score (en cours de développement)"],
|
22 |
+
index=0,
|
23 |
+
format_func=lambda x: x.split(" :")[0]
|
24 |
+
)
|
25 |
+
|
26 |
+
if approach == "Norme ISO 26000":
|
27 |
+
# Récupérer les données depuis data_manager.py
|
28 |
+
data, total_hits = get_data()
|
29 |
+
|
30 |
+
st.markdown("""<hr style='border-color: darkgrey;'>""", unsafe_allow_html=True)
|
31 |
+
|
32 |
+
st.markdown("""
|
33 |
+
:earth_africa: **QU'EST-CE QUE LA NORME ISO 26000 ?**
|
34 |
+
|
35 |
+
La norme ISO 26000 propose une grille de lecture de la thématique développement durable ultra-pratique pour déployer une politique RSE d'entreprise bien structurée, qui ne laisse rien de côté. Publiée en 2010, cette norme volontaire a été élaborée en concertation avec près de 90 pays à travers le monde, dont la France.
|
36 |
+
|
37 |
+
**COMMENT EST-ELLE STRUCTURÉE ?**
|
38 |
+
|
39 |
+
ISO 26000 : Une grille de lecture à 7 entrées
|
40 |
+
|
41 |
+
- 🏢 La gouvernance de la structure
|
42 |
+
- 👨👩👧👦 Les droits humains
|
43 |
+
- 🤝 Les conditions et relations de travail
|
44 |
+
- 🌱 La responsabilité environnementale
|
45 |
+
- ⚖️ La loyauté des pratiques
|
46 |
+
- 🛍️ Les questions relatives au consommateur et à la protection du consommateur
|
47 |
+
- 🌍 Les communautés et le développement local.
|
48 |
+
""")
|
49 |
+
st.markdown("""<small>Source AFNOR : <a href="https://www.afnor.org/developpement-durable/demarche-iso-26000/" target="_blank">www.afnor.org/developpement-durable/demarche-iso-26000/</a></small>""", unsafe_allow_html=True)
|
50 |
+
|
51 |
+
st.markdown("""<hr style='border-color: darkgrey;'>""", unsafe_allow_html=True)
|
52 |
+
st.markdown("### Classification des actions RSE selon ISO 26000")
|
53 |
+
|
54 |
+
pictograms = {
|
55 |
+
"Gouvernance de la structure": "🏢",
|
56 |
+
"Droits humains": "👨👩👧👦",
|
57 |
+
"Conditions et relations de travail": "🤝",
|
58 |
+
"Responsabilité environnementale": "🌱",
|
59 |
+
"Loyauté des pratiques": "⚖️",
|
60 |
+
"Questions relatives au consommateur": "🛍️",
|
61 |
+
"Communautés et développement local": "🌍",
|
62 |
+
"Autres": "❓"
|
63 |
+
}
|
64 |
+
|
65 |
+
criteria_counts = classify_iso26000(data)
|
66 |
+
|
67 |
+
total_actions = 0
|
68 |
+
|
69 |
+
for category, actions in criteria_counts.items():
|
70 |
+
if category in pictograms:
|
71 |
+
st.subheader(f"{pictograms[category]} {category}")
|
72 |
+
else:
|
73 |
+
st.subheader(f"{pictograms['Autres']} Autres")
|
74 |
+
total_actions += len(actions)
|
75 |
+
for action in actions:
|
76 |
+
nom_entreprise = action.get('nom_courant_denomination', 'Information non disponible')
|
77 |
+
st.write(f"Entreprise : {action.get('name','N/A')}, Action RSE : {action.get('action_rse', 'N/A')}, Activité : {action.get('activity', 'N/A')}, Ville : {action.get('city', 'N/A')}")
|
78 |
+
|
79 |
+
st.markdown("""<hr style='border-color: darkgrey;'>""", unsafe_allow_html=True)
|
80 |
+
st.markdown(f"**Total des actions RSE :** {total_actions}")
|
81 |
+
|
82 |
+
elif approach == "Impact Score (en cours de développement)":
|
83 |
+
# Récupérer les données depuis data_manager.py
|
84 |
+
data, total_hits = get_data()
|
85 |
+
|
86 |
+
st.markdown("""<hr style='border-color: darkgrey;'>""", unsafe_allow_html=True)
|
87 |
+
|
88 |
+
st.markdown("""
|
89 |
+
🌳 **QU'EST-CE QUE L'IMPACT SCORE ?**
|
90 |
+
|
91 |
+
Ce référentiel commun et unique a été co-construit par 30 réseaux d’entreprises afin de publier en transparence leurs données d’impact, exigence européenne depuis 2024.
|
92 |
+
|
93 |
+
**COMMENT EST-IL STRUCTURÉE ?**
|
94 |
+
|
95 |
+
IMPACT SCORE repose sur 3 piliers essentiels :
|
96 |
+
|
97 |
+
- 🚫 LIMITATION DES EXTERNALITÉS NÉGATIVES
|
98 |
+
- 💡 PARTAGE DU POUVOIR ET DE LA VALEUR
|
99 |
+
- 🎯 STRATÉGIE À IMPACT
|
100 |
+
""")
|
101 |
+
|
102 |
+
|
103 |
+
st.markdown("""<small>Source MOUVEMENT IMPACT FRANCE : <a href="https://impactscore.fr/comprendre-limpact-score/" target="_blank">https://impactscore.fr/comprendre-limpact-score/</a></small>""", unsafe_allow_html=True)
|
104 |
+
|
105 |
+
st.markdown("""<hr style='border-color: darkgrey;'>""", unsafe_allow_html=True)
|
106 |
+
|
107 |
+
criteria_counts = classify_impactscore(data)
|
108 |
+
|
109 |
+
total_actions = sum([len(actions) for actions in criteria_counts.values()])
|
110 |
+
st.markdown(f"**Total des actions RSE :** {total_actions}")
|
111 |
+
|
112 |
+
### OBJECTIF DE DEVELOPPEMENT DURABLE ###
|
113 |
+
elif approach == "ODD Objectifs de Développement Durable (en cours de développement)":
|
114 |
+
# Récupérer les données depuis data_manager.py
|
115 |
+
data, total_hits = get_data()
|
116 |
+
|
117 |
+
st.markdown("""<hr style='border-color: darkgrey;'>""", unsafe_allow_html=True)
|
118 |
+
|
119 |
+
st.markdown("""
|
120 |
+
🌳 **QU'EST-CE QUE LES 17 ODD ?**
|
121 |
+
|
122 |
+
Au cœur de l’Agenda 2030, 17 Objectifs de développement durable (ODD) ont été fixés. Ils couvrent l’intégralité des enjeux de développement dans tous les pays tels que le climat, la biodiversité, l’énergie, l’eau, la pauvreté, l’égalité des genres, la prospérité économique ou encore la paix, l’agriculture, l’éducation, etc.
|
123 |
+
|
124 |
+
**COMMENT SONT-ILS STRUCTURÉS ?**
|
125 |
+
|
126 |
+
- ODD n°1 - Pas de pauvreté
|
127 |
+
- ODD n°2 - Faim « Zéro »
|
128 |
+
- ODD n°3 - Bonne santé et bien-être
|
129 |
+
- ODD n°4 - Éducation de qualité
|
130 |
+
- ODD n°5 - Égalité entre les sexes
|
131 |
+
- ODD n°6 - Eau propre et assainissement
|
132 |
+
- ODD n°7 - Énergie propre et d'un coût abordable
|
133 |
+
- ODD n°8 - Travail décent et croissance économique
|
134 |
+
- ODD n°9 - Industrie, innovation et infrastructure
|
135 |
+
- ODD n°10 - Inégalités réduites
|
136 |
+
- ODD n°11 - Villes et communautés durable
|
137 |
+
- ODD n°12 - Consommation et production responsables
|
138 |
+
- ODD n°13 - Lutte contre les changements climatiques
|
139 |
+
- ODD n°14 - Vie aquatique
|
140 |
+
- ODD n°15 - Vie terrestre
|
141 |
+
- ODD n°16 - Paix, justice et institutions efficaces
|
142 |
+
- ODD n°17 - Partenariats pour la réalisation des objectifs
|
143 |
+
|
144 |
+
""")
|
145 |
+
|
146 |
+
|
147 |
+
st.markdown("""<small>Source AGENDA 2030 EN FRANCE : <a href="https://www.agenda-2030.fr/17-objectifs-de-developpement-durable/?" target="_blank">https://impactscore.fr/comprendre-limpact-score/</a></small>""", unsafe_allow_html=True)
|
148 |
+
|
149 |
+
st.markdown("""<hr style='border-color: darkgrey;'>""", unsafe_allow_html=True)
|
150 |
+
|
151 |
+
criteria_counts = classify_impactscore(data)
|
152 |
+
|
153 |
+
total_actions = sum([len(actions) for actions in criteria_counts.values()])
|
154 |
+
st.markdown(f"**Total des actions RSE :** {total_actions}")
|
155 |
+
|
156 |
+
if approach == "Norme ISO 26000":
|
157 |
+
st.subheader("Synthèse par catégorie ISO 26000")
|
158 |
+
synthesis = {category: len(actions) for category, actions in criteria_counts.items()}
|
159 |
+
synthesis_sorted = dict(sorted(synthesis.items(), key=lambda item: item[1], reverse=True))
|
160 |
+
for category, count in synthesis_sorted.items():
|
161 |
+
st.write(f"{category}: {count} action(s) RSE")
|
162 |
+
|
163 |
+
if __name__ == "__main__":
|
164 |
+
display_analyse_actions_rse()
|
DATA_bziiit/__init__.py
ADDED
File without changes
|
ISO26000.py
ADDED
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
from data_manager import get_data
|
2 |
+
|
3 |
+
def classify_actions_rse_ISO26000(data):
|
4 |
+
data, _ = get_data() # Récupérer les données depuis data_manager.py
|
5 |
+
|
6 |
+
criteria = {
|
7 |
+
"Gouvernance de la structure": [],
|
8 |
+
"Droits humains": [],
|
9 |
+
"Conditions et relations de travail": [],
|
10 |
+
"Responsabilité environnementale": [],
|
11 |
+
"Loyauté des pratiques": [],
|
12 |
+
"Questions relatives au consommateur": [],
|
13 |
+
"Communautés et développement local": [],
|
14 |
+
"Autres": []
|
15 |
+
}
|
16 |
+
|
17 |
+
# Keywords for each ISO 26000 category to help in classifying the actions
|
18 |
+
keywords = {
|
19 |
+
"Gouvernance de la structure": ["gouvernance", "structure", "organisation","leadership", "processus décisionnel", "responsabilité", "transparence", "éthique","entreprise à mission", "éthique d'entreprise", "transparence", "gouvernance responsable", "statuts", "loi pacte", "charte éthique","politique RSE dans la durée", "sens à la mission","fresque du climat"],
|
20 |
+
"Droits humains": ["droits humains", "droit", "humains","non-discrimination", "libertés fondamentales", "droits civils et politiques", "droits économiques, sociaux et culturels", "groupes vulnérables","humain au centre","lutter contre les discriminations"],
|
21 |
+
"Conditions et relations de travail": ["conditions de travail", "relations de travail", "emploi", "emploi et relations employeur-employé", "conditions de travail et protection sociale", "dialogue social", "santé et sécurité au travail", "développement des ressources humaines","télétravail", "semaine de 4 jours", "bien-être", "formation RSE", "sensibilisation RSE", "inclusion sociale", "diversité", "équilibre vie professionnelle", "qualité de vie au travail","inclusion des femmes","centrer sur l'humain","engagement des équipes"],
|
22 |
+
"Responsabilité environnementale": ["environnement", "écologie", "durable","prévention de la pollution", "utilisation durable des ressources", "atténuation et adaptation au changement climatique", "protection de l'environnement, de la biodiversité et restauration des habitats naturels","carbone", "véhicules électriques", "plantation d'arbres", "réduction plastique", "compost", "gestion de l'eau", "énergies renouvelables", "réduction émissions", "déchets", "recyclage", "mobilité durable", "transport en commun", "réutilisation", "reconditionné", "panneaux solaires","véhicules électriques","vélo électrique", "mobilité durable","décarbonation","réduction consommation d'eau","véhicules hybrides","véhicules hydrides","consommation d'eau"],
|
23 |
+
"Loyauté des pratiques": ["loyauté", "éthique", "pratiques","lutte contre la coruption", "comportement éthique", "concurrence loyale", "promotion de la responsabilité sociale dans la chaîne de valeur", "respect des droits de propriété","pratiques loyales en matière de marketing, d'information et de contrats", "protection de la santé et de la sécurité des consommateurs", "consommation durable", "service et assistance après-vente", "protection et confidentialité des données des consommateurs","commerce équitable", "marketing éthique", "droits des consommateurs", "transparence des informations", "pratiques loyales", "fournisseurs locaux","partenaires de proximité"],
|
24 |
+
"Questions relatives au consommateur": ["consommateur", "client", "service","service client", "protection du consommateur", "consommation responsable", "satisfaction client", "qualité des produits et services", "sécurité des produits et services", "information et éducation des consommateurs", "santé et sécurité des consommateurs", "service après-vente", "garantie", "retour produit", "éthique des affaires", "commerce équitable", "marketing éthique", "droits des consommateurs", "transparence des informations", "pratiques loyales"],
|
25 |
+
"Communautés et développement local": ["communauté", "développement local", "société","implication de la communauté", "éducation et culture", "création d'emplois et développement des compétences", "développement des technologies", "création de richesse et de revenus","engagement communautaire", "développement local", "actions caritatives", "événements sportifs", "soutien aux associations", "inclusion sociale", "lutte contre les discriminations", "coopération locale", "soutien à l'économie locale","écosystèmes sportifs", "touristiques", "culturels", "1% for the planet","préservation site", "dynamisation communauté","commun sportif", "transmission", "formations"],
|
26 |
+
|
27 |
+
}
|
28 |
+
|
29 |
+
for record in data:
|
30 |
+
action_rse = record.get("action_rse", "").lower()
|
31 |
+
company_info = {
|
32 |
+
"name": record.get("nom_courant_denomination", "N/A"),
|
33 |
+
"action_rse": action_rse,
|
34 |
+
"activity": record.get("libelle_section_naf", "N/A"),
|
35 |
+
"city": record.get("commune", "N/A")
|
36 |
+
}
|
37 |
+
found_category = False
|
38 |
+
for criterion, key_phrases in keywords.items():
|
39 |
+
if any(key_phrase in action_rse for key_phrase in key_phrases):
|
40 |
+
criteria[criterion].append(company_info)
|
41 |
+
found_category = True
|
42 |
+
break # Assuming each action belongs to one category only
|
43 |
+
|
44 |
+
# Si l'action n'a pas été classifiée dans une catégorie existante, la placer dans "Autres"
|
45 |
+
if not found_category:
|
46 |
+
criteria["Autres"].append(company_info)
|
47 |
+
|
48 |
+
return criteria
|
app.py
CHANGED
@@ -8,40 +8,43 @@ from statistiques import main as display_statistics
|
|
8 |
from ActionsRSE import display_actions_rse
|
9 |
from AnalyseActionsRSE import display_analyse_actions_rse
|
10 |
|
|
|
|
|
|
|
|
|
|
|
11 |
def main():
|
12 |
st.sidebar.title("OPEN DATA & IA au service de la RSE")
|
13 |
section_principale = st.sidebar.radio(
|
14 |
"Choisissez votre section",
|
15 |
-
["Data Bordeaux métropole", "Data bziiit"
|
16 |
)
|
17 |
|
18 |
if section_principale == "Data Bordeaux métropole":
|
19 |
app_mode = st.sidebar.radio(
|
20 |
-
"Choisissez votre
|
21 |
-
["Organisations engagées", "
|
22 |
)
|
23 |
-
if app_mode == "
|
24 |
-
display_organisations_engagees()
|
25 |
-
elif app_mode == "Localisations":
|
26 |
display_map()
|
|
|
|
|
27 |
elif app_mode == "Statistiques":
|
28 |
display_statistics()
|
29 |
elif app_mode == "Actions RSE":
|
30 |
display_actions_rse()
|
|
|
|
|
31 |
|
32 |
elif section_principale == "Data bziiit":
|
33 |
ia_mode = st.sidebar.radio(
|
34 |
-
"Choisissez votre
|
35 |
-
["
|
36 |
)
|
37 |
-
|
38 |
-
|
39 |
-
ia_mode
|
40 |
-
|
41 |
-
["Analyse actions RSE"]
|
42 |
-
)
|
43 |
-
if ia_mode == "Analyse actions RSE":
|
44 |
-
display_analyse_actions_rse()
|
45 |
|
46 |
# Instructions communes à toutes les sections
|
47 |
st.sidebar.markdown("---")
|
@@ -51,4 +54,4 @@ def main():
|
|
51 |
st.sidebar.markdown("---")
|
52 |
|
53 |
if __name__ == "__main__":
|
54 |
-
main()
|
|
|
8 |
from ActionsRSE import display_actions_rse
|
9 |
from AnalyseActionsRSE import display_analyse_actions_rse
|
10 |
|
11 |
+
# Import modifiédes fonctions liées aux scripts
|
12 |
+
from projetRSE import display_rse_projects
|
13 |
+
from labelRSE import display_rse_labels
|
14 |
+
from marquesengagees import display_engaged_brands
|
15 |
+
|
16 |
def main():
|
17 |
st.sidebar.title("OPEN DATA & IA au service de la RSE")
|
18 |
section_principale = st.sidebar.radio(
|
19 |
"Choisissez votre section",
|
20 |
+
["Data Bordeaux métropole", "Data bziiit"]
|
21 |
)
|
22 |
|
23 |
if section_principale == "Data Bordeaux métropole":
|
24 |
app_mode = st.sidebar.radio(
|
25 |
+
"Choisissez votre sous-section",
|
26 |
+
["Localisations", "Organisations engagées", "Statistiques", "Actions RSE", "Analyse actions RSE"]
|
27 |
)
|
28 |
+
if app_mode == "Localisations":
|
|
|
|
|
29 |
display_map()
|
30 |
+
elif app_mode == "Organisations engagées":
|
31 |
+
display_organisations_engagees()
|
32 |
elif app_mode == "Statistiques":
|
33 |
display_statistics()
|
34 |
elif app_mode == "Actions RSE":
|
35 |
display_actions_rse()
|
36 |
+
elif app_mode == "Analyse actions RSE":
|
37 |
+
display_analyse_actions_rse()
|
38 |
|
39 |
elif section_principale == "Data bziiit":
|
40 |
ia_mode = st.sidebar.radio(
|
41 |
+
"Choisissez votre sous-section",
|
42 |
+
["Labels RSE", "Projets RSE"]
|
43 |
)
|
44 |
+
if ia_mode == "Labels RSE":
|
45 |
+
display_rse_labels()
|
46 |
+
elif ia_mode == "Projets RSE":
|
47 |
+
display_rse_projects()
|
|
|
|
|
|
|
|
|
48 |
|
49 |
# Instructions communes à toutes les sections
|
50 |
st.sidebar.markdown("---")
|
|
|
54 |
st.sidebar.markdown("---")
|
55 |
|
56 |
if __name__ == "__main__":
|
57 |
+
main()
|
data_manager.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
|
2 |
import requests
|
3 |
|
4 |
def get_data():
|
|
|
1 |
+
|
2 |
import requests
|
3 |
|
4 |
def get_data():
|
data_manager_bziiit.py
ADDED
@@ -0,0 +1,29 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
import requests
|
3 |
+
|
4 |
+
# URL de base de l'API bziiit
|
5 |
+
BASE_URL = "https://bziiitapi-api.azurewebsites.net"
|
6 |
+
|
7 |
+
def get_labels():
|
8 |
+
# Récupère les labels RSE depuis l'API bziiit
|
9 |
+
response = requests.get(f"{BASE_URL}/opendata/labels")
|
10 |
+
if response.status_code == 200:
|
11 |
+
return response.json()["response"]
|
12 |
+
else:
|
13 |
+
return []
|
14 |
+
|
15 |
+
def get_rse_projects():
|
16 |
+
# Récupère les projets RSE depuis l'API bziiit
|
17 |
+
response = requests.get(f"{BASE_URL}/opendata/bordeaux-rse/projects")
|
18 |
+
if response.status_code == 200:
|
19 |
+
return response.json()["response"]
|
20 |
+
else:
|
21 |
+
return []
|
22 |
+
|
23 |
+
def get_engaged_brands():
|
24 |
+
# Récupère les marques engagées depuis l'API bziiit
|
25 |
+
response = requests.get(f"{BASE_URL}/opendata/bordeaux-rse/brands")
|
26 |
+
if response.status_code == 200:
|
27 |
+
return response.json()["response"]
|
28 |
+
else:
|
29 |
+
return []
|
impactscore.py
ADDED
@@ -0,0 +1,57 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
print("""
|
2 |
+
🌍 QU'EST-CE QUE LA NORME ISO 26000 ?
|
3 |
+
|
4 |
+
La norme ISO 26000 propose une grille de lecture de la thématique développement durable ultra-pratique pour déployer une politique RSE d'entreprise bien structurée, qui ne laisse rien de côté. Publiée en 2010, cette norme volontaire a été élaborée en concertation avec près de 90 pays à travers le monde, dont la France.
|
5 |
+
|
6 |
+
COMMENT EST-ELLE STRUCTURÉE ?
|
7 |
+
|
8 |
+
ISO 26000 : Une grille de lecture à 7 entrées
|
9 |
+
|
10 |
+
🏢 La gouvernance de la structure
|
11 |
+
👨👩👧👦 Les droits humains
|
12 |
+
🤝 Les conditions et relations de travail
|
13 |
+
🌱 La responsabilité environnementale
|
14 |
+
⚖️ La loyauté des pratiques
|
15 |
+
🛍️ Les questions relatives au consommateur et à la protection du consommateur
|
16 |
+
🌍 Les communautés et le développement local.
|
17 |
+
Source AFNOR : www.afnor.org/developpement-durable/demarche-iso-26000/
|
18 |
+
""")
|
19 |
+
|
20 |
+
from data_manager import get_data
|
21 |
+
|
22 |
+
def classify_actions_rse_IMPACTSCORE(data):
|
23 |
+
data, _ = get_data() # Récupérer les données depuis data_manager.py
|
24 |
+
|
25 |
+
criteria = {
|
26 |
+
"Initiatives pour réduire l'empreinte carbone": [],
|
27 |
+
"Amélioration des conditions de travail": [],
|
28 |
+
"Promotion du recyclage": [],
|
29 |
+
"Autres": []
|
30 |
+
}
|
31 |
+
|
32 |
+
keywords = {
|
33 |
+
"Initiatives pour réduire l'empreinte carbone": ["empreinte carbone", "réduction des émissions", "transition énergétique"],
|
34 |
+
"Amélioration des conditions de travail": ["conditions de travail", "santé et sécurité au travail", "équilibre vie professionnelle"],
|
35 |
+
"Promotion du recyclage": ["recyclage", "gestion des déchets", "économie circulaire"],
|
36 |
+
}
|
37 |
+
|
38 |
+
for record in data:
|
39 |
+
action_rse = record.get("action_rse", "").lower()
|
40 |
+
company_info = {
|
41 |
+
"name": record.get("nom_courant_denomination", "N/A"),
|
42 |
+
"action_rse": action_rse,
|
43 |
+
"activity": record.get("libelle_section_naf", "N/A"),
|
44 |
+
"city": record.get("commune", "N/A")
|
45 |
+
}
|
46 |
+
found_category = False
|
47 |
+
for criterion, key_phrases in keywords.items():
|
48 |
+
if any(key_phrase in action_rse for key_phrase in key_phrases):
|
49 |
+
criteria[criterion].append(company_info)
|
50 |
+
found_category = True
|
51 |
+
break # Assuming each action belongs to one category only
|
52 |
+
|
53 |
+
# Si l'action n'a pas été classifiée dans une catégorie existante, la placer dans "Autres"
|
54 |
+
if not found_category:
|
55 |
+
criteria["Autres"].append(company_info)
|
56 |
+
|
57 |
+
return criteria
|
labelRSE.py
ADDED
@@ -0,0 +1,61 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
from collections import Counter
|
3 |
+
|
4 |
+
from data_manager import get_data
|
5 |
+
from data_manager_bziiit import get_labels, get_engaged_brands
|
6 |
+
|
7 |
+
def display_rse_labels():
|
8 |
+
st.markdown("## OPEN DATA bziiit Labels RSE")
|
9 |
+
st.markdown("### Découvrez les labels et certifications (RSE, Qualité...)")
|
10 |
+
|
11 |
+
labels_option = st.radio(
|
12 |
+
"Choisissez les labels à afficher :",
|
13 |
+
("Tous les labels / Certifications DATA bziiit", "Labels / Certifications des organisations engagées Bdx Métropole")
|
14 |
+
)
|
15 |
+
|
16 |
+
st.markdown("""<hr style='border-color: darkgrey;'>""", unsafe_allow_html=True)
|
17 |
+
|
18 |
+
labels = get_labels()
|
19 |
+
if labels_option == "Tous les labels / Certifications DATA bziiit":
|
20 |
+
labels.sort(key=lambda x: x['name'])
|
21 |
+
else:
|
22 |
+
# Get the data from Bordeaux Metropole API
|
23 |
+
data, _ = get_data()
|
24 |
+
|
25 |
+
# Get the engaged brands
|
26 |
+
engaged_brands = get_engaged_brands()
|
27 |
+
|
28 |
+
# Get the names of the organizations from Bordeaux Metropole API
|
29 |
+
org_names = set(org['nom_courant_denomination'] for org in data if 'nom_courant_denomination' in org)
|
30 |
+
|
31 |
+
# Filter the engaged brands to include only the organizations in Bordeaux Metropole
|
32 |
+
engaged_brands = [brand for brand in engaged_brands if brand['name'] in org_names]
|
33 |
+
|
34 |
+
# Get the labels used by the organizations
|
35 |
+
org_labels = [label['name'] for brand in engaged_brands if 'labels' in brand and brand['labels'] for label in brand['labels']]
|
36 |
+
|
37 |
+
# Count the labels
|
38 |
+
label_counts = Counter(org_labels)
|
39 |
+
|
40 |
+
# Filter the labels and add the count
|
41 |
+
labels = [{'name': label['name'], 'logo_url': label['logo_url'], 'count': label_counts[label['name']]} for label in labels if label['name'] in label_counts]
|
42 |
+
|
43 |
+
# Sort the labels by count in descending order
|
44 |
+
labels.sort(key=lambda x: x['count'], reverse=True)
|
45 |
+
|
46 |
+
# Display the total number of unique labels
|
47 |
+
unique_labels = set(label['name'] for label in labels)
|
48 |
+
st.markdown(f"**Nombre de labels / certifications :** {len(unique_labels)}")
|
49 |
+
|
50 |
+
# Display the labels
|
51 |
+
for i in range(0, len(labels), 5):
|
52 |
+
cols = st.columns(5)
|
53 |
+
for j in range(5):
|
54 |
+
if i + j < len(labels):
|
55 |
+
label = labels[i + j]
|
56 |
+
with cols[j]:
|
57 |
+
st.image(label['logo_url'])
|
58 |
+
if labels_option == "Tous les labels / Certifications DATA bziiit":
|
59 |
+
st.markdown(f'<p style="text-align: center; font-size: 10px;"><a href="{label["website"]}" style="color: darkgray;">Site web</a></p>', unsafe_allow_html=True)
|
60 |
+
else:
|
61 |
+
st.markdown(f'<p style="text-align: center; font-size: 10px; color: darkgray;">Nb marques certifiées : {label["count"]}</p>', unsafe_allow_html=True)
|
localisation.py
CHANGED
@@ -8,7 +8,7 @@ def display_map():
|
|
8 |
data, total_hits = get_data()
|
9 |
if data:
|
10 |
# Ajout des titres en haut de l'écran
|
11 |
-
st.markdown("## OPEN DATA RSE")
|
12 |
st.markdown("### Localiser les organisations engagées RSE de Bordeaux Métropole")
|
13 |
|
14 |
secteurs = sorted({record.get("libelle_section_naf") for record in data if record.get("libelle_section_naf")})
|
|
|
8 |
data, total_hits = get_data()
|
9 |
if data:
|
10 |
# Ajout des titres en haut de l'écran
|
11 |
+
st.markdown("## OPEN DATA Bordeaux Métropole RSE")
|
12 |
st.markdown("### Localiser les organisations engagées RSE de Bordeaux Métropole")
|
13 |
|
14 |
secteurs = sorted({record.get("libelle_section_naf") for record in data if record.get("libelle_section_naf")})
|
marquesengagees.py
ADDED
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
|
2 |
+
# Dans marquesengagees.py
|
3 |
+
import streamlit as st
|
4 |
+
|
5 |
+
def display_engaged_brands():
|
6 |
+
# Exemple de code pour afficher des marques engagées
|
7 |
+
st.write("Liste des marques engagées")
|
organisations_engagees.py
CHANGED
@@ -4,7 +4,7 @@ from data_manager import get_data
|
|
4 |
|
5 |
# Fonction pour l'onglet "Organisations engagées"
|
6 |
def display_organisations_engagees():
|
7 |
-
st.markdown("## OPEN DATA RSE")
|
8 |
st.markdown("### Découvrez les organisations engagées RSE de Bordeaux Métropole")
|
9 |
|
10 |
data, total_hits = get_data()
|
|
|
4 |
|
5 |
# Fonction pour l'onglet "Organisations engagées"
|
6 |
def display_organisations_engagees():
|
7 |
+
st.markdown("## OPEN DATA Bordeaux Métropole RSE")
|
8 |
st.markdown("### Découvrez les organisations engagées RSE de Bordeaux Métropole")
|
9 |
|
10 |
data, total_hits = get_data()
|
projetRSE.py
ADDED
@@ -0,0 +1,48 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
import re # Importer la bibliothèque pour les expressions régulières
|
3 |
+
from data_manager_bziiit import get_rse_projects
|
4 |
+
|
5 |
+
def remove_html_tags(text):
|
6 |
+
"""Supprimer les balises HTML d'une chaîne de caractères."""
|
7 |
+
clean_text = re.sub('<.*?>', '', text) # Remplacer toute balise HTML par une chaîne vide
|
8 |
+
return clean_text
|
9 |
+
|
10 |
+
def display_rse_projects():
|
11 |
+
st.markdown("""
|
12 |
+
<style>
|
13 |
+
table {
|
14 |
+
background-color: inherit !important;
|
15 |
+
}
|
16 |
+
</style>
|
17 |
+
""", unsafe_allow_html=True)
|
18 |
+
|
19 |
+
st.markdown("## OPEN DATA bziiit Projet RSE")
|
20 |
+
st.markdown("### Découvrez tous les projets RSE des marques référencées")
|
21 |
+
|
22 |
+
projects = get_rse_projects()
|
23 |
+
if projects:
|
24 |
+
categories = list({project["rse_category"] if project["rse_category"] is not None else "Non catégorisé" for project in projects})
|
25 |
+
categories.sort()
|
26 |
+
categories.insert(0, 'Toutes')
|
27 |
+
selected_category = st.selectbox("Filtre par catégorie RSE", categories, index=0)
|
28 |
+
|
29 |
+
if selected_category != 'Toutes':
|
30 |
+
filtered_projects = [project for project in projects if project["rse_category"] == selected_category or (selected_category == "Non catégorisé" and project["rse_category"] is None)]
|
31 |
+
else:
|
32 |
+
filtered_projects = projects
|
33 |
+
|
34 |
+
st.markdown(f"**Nombre de projets :** {len(filtered_projects)}")
|
35 |
+
|
36 |
+
# Display the projects as thumbnails
|
37 |
+
for i in range(0, len(filtered_projects), 5):
|
38 |
+
cols = st.columns(5)
|
39 |
+
for j in range(5):
|
40 |
+
if i + j < len(filtered_projects):
|
41 |
+
project = filtered_projects[i + j]
|
42 |
+
with cols[j]:
|
43 |
+
if project['logo_url']: # Ajouter cette vérification ici
|
44 |
+
st.image(project['logo_url'])
|
45 |
+
st.markdown(f'<p style="text-align: center;"><b>{project["brand"]["name"]}</b></p>', unsafe_allow_html=True)
|
46 |
+
st.markdown(f'<p style="text-align: center;"><b>"{project["name"]}"</b></p>', unsafe_allow_html=True) # Ajouter cette ligne
|
47 |
+
st.markdown(f'<p style="text-align: center; font-size: 10px; color: darkgray;">{project["rse_category"] if project["rse_category"] is not None else "Non catégorisé"}</p>', unsafe_allow_html=True)
|
48 |
+
st.markdown('<hr style="border-top: 1px dotted lightgray; width:100%;">', unsafe_allow_html=True) # Modifier cette ligne
|
statistiques.py
CHANGED
@@ -50,7 +50,7 @@ def main():
|
|
50 |
df = pd.DataFrame(data)
|
51 |
|
52 |
if not df.empty:
|
53 |
-
st.markdown("## OPEN DATA RSE")
|
54 |
st.markdown("### Statistiques sur les entreprises engagées RSE")
|
55 |
|
56 |
st.header("Répartition des entreprises par secteur d'activité")
|
|
|
50 |
df = pd.DataFrame(data)
|
51 |
|
52 |
if not df.empty:
|
53 |
+
st.markdown("## OPEN DATA Bordeaux Métropole RSE")
|
54 |
st.markdown("### Statistiques sur les entreprises engagées RSE")
|
55 |
|
56 |
st.header("Répartition des entreprises par secteur d'activité")
|