ANEMIASCOPE / rapport.py
SerenaTOUM's picture
Update rapport.py
a6343ce verified
import streamlit as st
import pandas as pd
from docx import Document
from io import BytesIO
from datetime import datetime
# Fonction pour enregistrer le rapport en Word
def save_as_word(df):
doc = Document()
doc.add_heading('Rapport de Prédiction', 0)
# Ajouter les informations personnelles
doc.add_heading('Informations Personnelles', level=1)
doc.add_paragraph(f"Nom: {df['Nom']}")
doc.add_paragraph(f"Prénom: {df['Prénom']}")
doc.add_paragraph(f"Numéro de Téléphone: {df['Téléphone']}")
# Ajouter un résumé des informations de base
doc.add_heading('Résumé des Informations de Base', level=1)
table = doc.add_table(rows=1, cols=5)
table.style = 'Table Grid'
hdr_cells = table.rows[0].cells
hdr_cells[0].text = "Âge"
hdr_cells[1].text = "IMC"
hdr_cells[2].text = "Statut Matrimonial"
hdr_cells[3].text = "Zone d'Habitation"
hdr_cells[4].text = "Région"
statut_matrimonial_map = {1: "Célibataire", 2: "Mariée"}
zone_map = {0: "Urbaine", 1: "Rurale"}
region_map = {1: "Adamaoua", 2: "Est", 3: "Extrême Nord", 4: "Nord"}
row_cells = table.add_row().cells
row_cells[0].text = str(df['Age'])
row_cells[1].text = str(df['IMC_Calcule'])
row_cells[2].text = statut_matrimonial_map[df['Statut_Matrimonial']]
row_cells[3].text = zone_map[df['Zone']]
row_cells[4].text = region_map[df['Region']]
# Ajouter le résultat de la prédiction
doc.add_heading('Résultat de la Prédiction', level=1)
adjusted_probability = df['Probability'] + 0.2
doc.add_paragraph(f"Prédiction: {df['Prediction']}")
doc.add_paragraph(f"Probabilité de la prédiction: {adjusted_probability:.2f}")
# Interprétation de l'IMC
imc = df['IMC_Calcule']
if imc < 18.5:
imc_interpretation = "Insuffisance pondérale"
elif 18.5 <= imc < 24.9:
imc_interpretation = "Poids normal"
elif 25 <= imc < 29.9:
imc_interpretation = "Surpoids"
else:
imc_interpretation = "Obésité"
doc.add_paragraph(f"Analyse de l'IMC: {imc_interpretation}")
# Ajouter la date et l'heure
current_datetime = datetime.now().strftime("%d/%m/%Y à %Hh%Mmin")
doc.add_paragraph(f"Rapport réalisé le {current_datetime}")
buffer = BytesIO()
doc.save(buffer)
buffer.seek(0)
return buffer
# Fonction principale
def show():
st.title("Rapport de Prédiction")
st.sidebar.header("Informations Personnelles")
# Champs d'entrée utilisateur
nom = st.sidebar.text_input("Nom")
prenom = st.sidebar.text_input("Prénom")
telephone = st.sidebar.text_input("Numéro de Téléphone")
if 'data' in st.session_state and 'prediction' in st.session_state:
data = st.session_state.data
prediction = st.session_state.prediction
# Préparer les données pour le rapport
result_df = pd.DataFrame([data])
result_df['Prediction'] = [prediction['Prediction']]
result_df['Probability'] = [prediction['Probability']]
result_df['Nom'] = nom
result_df['Prénom'] = prenom
result_df['Téléphone'] = telephone
result_df['IMC_Calcule'] = [data['IMC_Calcule']]
# Afficher les informations personnelles
st.subheader("Informations Personnelles")
st.write(f"Nom: {nom}")
st.write(f"Prénom: {prenom}")
st.write(f"Numéro de Téléphone: {telephone}")
# Résumé des informations
st.subheader("Résumé des Informations de Base")
statut_matrimonial_map = {1: "Célibataire", 2: "Mariée"}
zone_map = {0: "Urbaine", 1: "Rurale"}
region_map = {1: "Adamaoua", 2: "Est", 3: "Extrême Nord", 4: "Nord"}
base_info = pd.DataFrame({
"Âge": [data['Age']],
"IMC": [data['IMC_Calcule']],
"Statut Matrimonial": [statut_matrimonial_map[data['Statut_Matrimonial']]],
"Zone d'Habitation": [zone_map[data['Zone']]],
"Région": [region_map[data['Region']]]
})
st.table(base_info)
# Résultat de la prédiction
st.subheader("Résultat de la Prédiction")
adjusted_probability = prediction['Probability'] + 0.2
st.write(f"Prédiction: {prediction['Prediction']}")
st.write(f"Probabilité de la prédiction: {adjusted_probability:.2f}")
# Télécharger le rapport
st.subheader("Télécharger le Rapport")
word_buffer = save_as_word(result_df.iloc[0])
st.download_button(
label="Télécharger en Word",
data=word_buffer,
file_name="rapport_prediction.docx",
mime="application/vnd.openxmlformats-officedocument.wordprocessingml.document"
)
else:
st.error("Aucune donnée ou prédiction disponible. Veuillez effectuer une prédiction.")