Code/app/analyse/interface.py
Fabrication du Numérique 120f5a7af8 Modifications mineures
2025-05-11 22:48:13 +02:00

175 lines
7.2 KiB
Python
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import streamlit as st
from .sankey import afficher_sankey
niveau_labels = {
0: "Produit final",
1: "Composant",
2: "Minerai",
10: "Opération",
11: "Pays d'opération",
12: "Acteur d'opération",
99: "Pays géographique"
}
inverse_niveau_labels = {v: k for k, v in niveau_labels.items()}
def preparer_graphe(G):
"""Nettoie et prépare le graphe pour l'analyse."""
niveaux_temp = {
node: int(str(attrs.get("niveau")).strip('"'))
for node, attrs in G.nodes(data=True)
if attrs.get("niveau") and str(attrs.get("niveau")).strip('"').isdigit()
}
G.remove_nodes_from([n for n in G.nodes() if n not in niveaux_temp])
G.remove_nodes_from(
[n for n in G.nodes() if niveaux_temp.get(n) == 10 and 'Reserves' in n])
return G, niveaux_temp
def selectionner_niveaux():
"""Interface pour sélectionner les niveaux de départ et d'arrivée."""
st.markdown("## Sélection des nœuds de départ et d'arrivée")
valeur_defaut = "-- Sélectionner un niveau --"
niveau_choix = [valeur_defaut] + list(niveau_labels.values())
niveau_depart = st.selectbox("Niveau de départ", niveau_choix, key="analyse_niveau_depart")
if niveau_depart == valeur_defaut:
return None, None
niveau_depart_int = inverse_niveau_labels[niveau_depart]
niveaux_arrivee_possibles = [v for k, v in niveau_labels.items() if k > niveau_depart_int]
niveaux_arrivee_choix = [valeur_defaut] + niveaux_arrivee_possibles
analyse_niveau_arrivee = st.selectbox("Niveau d'arrivée", niveaux_arrivee_choix, key="analyse_niveau_arrivee")
if analyse_niveau_arrivee == valeur_defaut:
return niveau_depart_int, None
niveau_arrivee_int = inverse_niveau_labels[analyse_niveau_arrivee]
return niveau_depart_int, niveau_arrivee_int
def selectionner_minerais(G, niveau_depart, niveau_arrivee):
"""Interface pour sélectionner les minerais si nécessaire."""
minerais_selection = None
if niveau_depart < 2 < niveau_arrivee:
st.markdown("### Sélectionner un ou plusieurs minerais")
# Tous les nœuds de niveau 2 (minerai)
minerais_nodes = sorted([
n for n, d in G.nodes(data=True)
if d.get("niveau") and int(str(d.get("niveau")).strip('"')) == 2
])
minerais_selection = st.multiselect(
"Filtrer par minerais (optionnel)",
minerais_nodes,
key="analyse_minerais"
)
return minerais_selection
def selectionner_noeuds(G, niveaux_temp, niveau_depart, niveau_arrivee):
"""Interface pour sélectionner les nœuds spécifiques de départ et d'arrivée."""
st.markdown("---")
st.markdown("## Sélection fine des items")
depart_nodes = [n for n in G.nodes() if niveaux_temp.get(n) == niveau_depart]
arrivee_nodes = [n for n in G.nodes() if niveaux_temp.get(n) == niveau_arrivee]
noeuds_depart = st.multiselect("Filtrer par noeuds de départ (optionnel)",
sorted(depart_nodes),
key="analyse_noeuds_depart")
noeuds_arrivee = st.multiselect("Filtrer par noeuds d'arrivée (optionnel)",
sorted(arrivee_nodes),
key="analyse_noeuds_arrivee")
noeuds_depart = noeuds_depart if noeuds_depart else None
noeuds_arrivee = noeuds_arrivee if noeuds_arrivee else None
return noeuds_depart, noeuds_arrivee
def configurer_filtres_vulnerabilite():
"""Interface pour configurer les filtres de vulnérabilité."""
st.markdown("---")
st.markdown("## Sélection des filtres pour identifier les vulnérabilités")
filtrer_ics = st.checkbox("Filtrer les chemins contenant au moins minerai critique pour un composant (ICS > 66 %)",
key="analyse_filtrer_ics")
filtrer_ivc = st.checkbox("Filtrer les chemins contenant au moins un minerai critique par rapport à la concurrence sectorielle (IVC > 30)",
key="analyse_filtrer_ivc")
filtrer_ihh = st.checkbox("Filtrer les chemins contenant au moins une opération critique par rapport à la concentration géographique ou industrielle (IHH pays ou acteurs > 25)",
key="analyse_filtrer_ihh")
ihh_type = "Pays"
if filtrer_ihh:
ihh_type = st.radio("Appliquer le filtre IHH sur :",
["Pays", "Acteurs"],
horizontal=True,
key="analyse_ihh_type")
filtrer_isg = st.checkbox("Filtrer les chemins contenant un pays instable (ISG ≥ 60)",
key="analyse_filtrer_isg")
logique_filtrage = st.radio("Logique de filtrage",
["OU", "ET"],
horizontal=True,
key="analyse_logique_filtrage")
return filtrer_ics, filtrer_ivc, filtrer_ihh, ihh_type, filtrer_isg, logique_filtrage
def interface_analyse(G_temp):
st.markdown("# Analyse du graphe")
with st.expander("Comment utiliser cet onglet ?", expanded=False):
st.markdown("""
1. Sélectionnez le niveau de départ (produit final, composant ou minerai)
2. Choisissez le niveau d'arrivée souhaité
3. Affinez votre sélection en spécifiant soit un ou des minerais à cibler spécifiquement ou des items précis à chaque niveau (optionnel)
4. Définissez les critères d'analyse en sélectionnant les indices de vulnérabilité pertinents
5. Choisissez le mode de combinaison des indices (ET/OU) selon votre besoin d'analyse
6. Explorez le graphique généré en utilisant les contrôles de zoom et de déplacement ; vous pouvez basculer en mode plein écran pour le graphe
""")
st.markdown("---")
try:
# Préparation du graphe
G_temp, niveaux_temp = preparer_graphe(G_temp)
# Sélection des niveaux
niveau_depart, niveau_arrivee = selectionner_niveaux()
if niveau_depart is None or niveau_arrivee is None:
return
# Sélection des minerais si nécessaire
minerais_selection = selectionner_minerais(G_temp, niveau_depart, niveau_arrivee)
# Sélection fine des noeuds
noeuds_depart, noeuds_arrivee = selectionner_noeuds(G_temp, niveaux_temp, niveau_depart, niveau_arrivee)
# Configuration des filtres de vulnérabilité
filtrer_ics, filtrer_ivc, filtrer_ihh, ihh_type, filtrer_isg, logique_filtrage = configurer_filtres_vulnerabilite()
# Lancement de l'analyse
st.markdown("---")
if st.button("Lancer l'analyse", type="primary", key="analyse_lancer"):
afficher_sankey(
G_temp,
niveau_depart=niveau_depart,
niveau_arrivee=niveau_arrivee,
noeuds_depart=noeuds_depart,
noeuds_arrivee=noeuds_arrivee,
minerais=minerais_selection,
filtrer_ics=filtrer_ics,
filtrer_ivc=filtrer_ivc,
filtrer_ihh=filtrer_ihh,
ihh_type=ihh_type,
filtrer_isg=filtrer_isg,
logique_filtrage=logique_filtrage
)
except Exception as e:
st.error(f"Erreur de prévisualisation du graphe : {e}")