Listlamap / app.py
sohfossted's picture
Upload 2 files
abf0f81 verified
import pandas as pd
import streamlit as st
import io
from datetime import datetime
import os
import warnings
# Configuration pour Hugging Face Spaces
os.environ['STREAMLIT_SERVER_ADDRESS'] = '0.0.0.0'
os.environ['STREAMLIT_SERVER_PORT'] = '7860'
os.environ['STREAMLIT_BROWSER_GATHER_USAGE_STATS'] = 'false'
# Supprimer les warnings
warnings.filterwarnings('ignore')
# Configuration pour éviter les erreurs de contexte
st.set_option('client.showErrorDetails', False)
st.set_option('client.toolbarMode', 'minimal')
# Configuration de la page
st.set_page_config(
page_title="Extraction Laboratoires",
page_icon="🔬",
layout="wide",
initial_sidebar_state="expanded"
)
def filtrer_laboratoires(df, niveau, variable, modalite):
"""
Filtre les laboratoires selon les critères spécifiés
"""
try:
# Filtrer par niveau
df_filtre = df[df['Sélectionnez le niveau de complexité du laboratoire'] == niveau]
# Filtrer par variable et modalité
if variable in df_filtre.columns:
df_filtre = df_filtre[df_filtre[variable] == modalite]
else:
st.error(f"❌ La variable '{variable}' n'existe pas dans la base de données")
return None
return df_filtre
except Exception as e:
st.error(f"❌ Erreur lors du filtrage: {str(e)}")
return None
def generer_excel(df_filtre, niveau, variable, modalite):
"""
Génère un fichier Excel en mémoire
"""
if df_filtre.empty:
return None
try:
# Sélectionner les colonnes à exporter
colonnes_base = [
'Nom du Laboratoire',
'Pays',
'Ville /District (Département)',
'Adresse de la structure sanitaire',
'Sélectionnez le niveau de complexité du laboratoire',
variable
]
# Colonnes supplémentaires optionnelles
colonnes_optionnelles = [
'Coordonnées GPS',
'Numéro de téléphone personnel du répondant',
'Adresse électronique du répondant',
'Fonction du répondant'
]
# Garder seulement les colonnes disponibles
colonnes_finales = [col for col in colonnes_base if col in df_filtre.columns]
for col in colonnes_optionnelles:
if col in df_filtre.columns:
colonnes_finales.append(col)
# Créer le fichier Excel en mémoire
output = io.BytesIO()
with pd.ExcelWriter(output, engine='xlsxwriter') as writer:
df_filtre[colonnes_finales].to_excel(writer, sheet_name='Laboratoires', index=False)
# Formater le fichier Excel
workbook = writer.book
worksheet = writer.sheets['Laboratoires']
# Ajouter un en-tête
header_format = workbook.add_format({
'bold': True,
'text_wrap': True,
'valign': 'top',
'fg_color': '#D7E4BC',
'border': 1
})
# Appliquer le format aux en-têtes
for col_num, value in enumerate(df_filtre[colonnes_finales].columns.values):
worksheet.write(0, col_num, value, header_format)
# Ajuster la largeur des colonnes
for i, col in enumerate(df_filtre[colonnes_finales].columns):
max_len = max(df_filtre[col].astype(str).str.len().max(), len(col)) + 2
worksheet.set_column(i, i, min(max_len, 50))
output.seek(0)
return output
except Exception as e:
st.error(f"❌ Erreur lors de la génération du fichier Excel: {str(e)}")
return None
def main():
st.title("🔬 Extraction des Laboratoires par Critères")
st.markdown("Sélectionnez les critères pour extraire la liste des laboratoires")
# Sidebar pour les paramètres
st.sidebar.header("📊 Paramètres de sélection")
# Charger les données via upload
st.sidebar.markdown("---")
st.sidebar.subheader("📁 Charger vos données")
fichier_upload = st.sidebar.file_uploader(
"Téléchargez votre fichier Excel",
type=['xlsx', 'xls'],
help="Chargez votre base de données des laboratoires"
)
if fichier_upload is not None:
try:
df = pd.read_excel(fichier_upload)
st.sidebar.success("✅ Fichier chargé avec succès!")
# Afficher les informations de base
st.sidebar.write(f"**Total laboratoires:** {len(df)}")
# Vérifier que la colonne de niveau existe
if 'Sélectionnez le niveau de complexité du laboratoire' not in df.columns:
st.error("❌ Colonne 'Sélectionnez le niveau de complexité du laboratoire' non trouvée")
st.info("""
Votre fichier doit contenir la colonne: **'Sélectionnez le niveau de complexité du laboratoire'**
Assurez-vous que le nom de la colonne correspond exactement.
""")
return
# Sélection du niveau
niveaux = sorted(df['Sélectionnez le niveau de complexité du laboratoire'].dropna().unique())
niveau_selectionne = st.sidebar.selectbox(
"🎯 Sélectionnez le niveau:",
options=niveaux,
index=0 if niveaux else None,
help="Choisissez le niveau de complexité du laboratoire"
)
# Sélection de la variable
variables = sorted(df.columns.tolist())
variable_selectionnee = st.sidebar.selectbox(
"📋 Sélectionnez la variable:",
options=variables,
index=variables.index("Tests rapides d'anticorps contre le VIH") if "Tests rapides d'anticorps contre le VIH" in variables else 0,
help="Choisissez la variable à filtrer"
)
# Sélection de la modalité
if variable_selectionnee:
modalites = sorted(df[variable_selectionnee].dropna().unique())
if modalites:
modalite_selectionnee = st.sidebar.selectbox(
"🔍 Sélectionnez la modalité:",
options=modalites,
index=0,
help="Choisissez la valeur de la variable"
)
else:
st.sidebar.warning("⚠️ Aucune modalité disponible pour cette variable")
modalite_selectionnee = None
# Bouton pour générer l'extraction
if st.sidebar.button("🚀 Générer l'extraction", type="primary", use_container_width=True):
if modalite_selectionnee is not None:
with st.spinner("🔍 Extraction en cours..."):
# Filtrer les données
df_filtre = filtrer_laboratoires(df, niveau_selectionne, variable_selectionnee, modalite_selectionnee)
if df_filtre is not None and not df_filtre.empty:
# Afficher les statistiques
st.success(f"✅ **{len(df_filtre)}** laboratoire(s) trouvé(s)")
# Aperçu des données
st.subheader("👀 Aperçu des données")
# Colonnes pour l'aperçu
colonnes_apercu = ['Nom du Laboratoire', 'Pays', 'Ville /District (Département)']
colonnes_disponibles = [col for col in colonnes_apercu if col in df_filtre.columns]
st.dataframe(
df_filtre[colonnes_disponibles],
use_container_width=True,
height=200
)
# Générer le fichier Excel
excel_file = generer_excel(df_filtre, niveau_selectionne, variable_selectionnee, modalite_selectionnee)
if excel_file:
# Nom du fichier
nom_fichier = f"Laboratoires_{niveau_selectionne.replace(' ', '_')}_{variable_selectionnee[:20]}_{modalite_selectionnee}_{datetime.now().strftime('%Y%m%d_%H%M')}.xlsx"
# Bouton de téléchargement
st.download_button(
label="📥 Télécharger le fichier Excel",
data=excel_file,
file_name=nom_fichier,
mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
type="primary",
use_container_width=True
)
# Informations supplémentaires
with st.expander("📊 Détails de l'extraction"):
st.write(f"""
**Résumé de l'extraction:**
- **Niveau:** {niveau_selectionne}
- **Variable:** {variable_selectionnee}
- **Modalité:** {modalite_selectionnee}
- **Total laboratoires:** {len(df_filtre)}
- **Date:** {datetime.now().strftime('%d/%m/%Y %H:%M')}
""")
else:
st.error("❌ Aucun laboratoire trouvé avec ces critères")
else:
st.sidebar.error("⚠️ Veuillez sélectionner une modalité valide")
# Informations supplémentaires
st.sidebar.markdown("---")
st.sidebar.subheader("ℹ️ Informations")
st.sidebar.write(f"**Niveaux disponibles:** {', '.join(niveaux)}")
st.sidebar.write(f"**Colonnes totales:** {len(df.columns)}")
except Exception as e:
st.sidebar.error(f"❌ Erreur lors du chargement: {str(e)}")
st.error("Impossible de charger le fichier. Vérifiez le format et réessayez.")
else:
# Message d'accueil quand aucun fichier n'est chargé
st.info("""
## 🚀 Bienvenue dans l'outil d'extraction des laboratoires
**Pour commencer:**
1. **Téléchargez** votre fichier Excel dans le menu de gauche
2. **Sélectionnez** le niveau de complexité désiré
3. **Choisissez** la variable et la modalité à filtrer
4. **Générez** et **téléchargez** votre extraction
**Format de fichier attendu:**
- Fichier Excel (.xlsx ou .xls)
- Doit contenir la colonne: **'Sélectionnez le niveau de complexité du laboratoire'**
- Les autres colonnes seront détectées automatiquement
""")
# Exemple de structure
with st.expander("📋 Exemple de structure de fichier attendue"):
st.write("""
| Nom du Laboratoire | Pays | Ville /District | Niveau | Tests VIH | ... |
|-------------------|------|----------------|--------|-----------|-----|
| Lab Central | Pays A | Ville 1 | Level I | yes | ... |
| Lab Régional | Pays A | Ville 2 | Level II | no | ... |
""")
if __name__ == "__main__":
main()