ColinceTatsa commited on
Commit
8d14b42
·
verified ·
1 Parent(s): d63ef72

Update src/streamlit_app.py

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +143 -38
src/streamlit_app.py CHANGED
@@ -1,40 +1,145 @@
1
- import altair as alt
2
- import numpy as np
3
- import pandas as pd
4
  import streamlit as st
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
 
6
- """
7
- # Welcome to Streamlit!
8
-
9
- Edit `/streamlit_app.py` to customize this app to your heart's desire :heart:.
10
- If you have any questions, checkout our [documentation](https://docs.streamlit.io) and [community
11
- forums](https://discuss.streamlit.io).
12
-
13
- In the meantime, below is an example of what you can do with just a few lines of code:
14
- """
15
-
16
- num_points = st.slider("Number of points in spiral", 1, 10000, 1100)
17
- num_turns = st.slider("Number of turns in spiral", 1, 300, 31)
18
-
19
- indices = np.linspace(0, 1, num_points)
20
- theta = 2 * np.pi * num_turns * indices
21
- radius = indices
22
-
23
- x = radius * np.cos(theta)
24
- y = radius * np.sin(theta)
25
-
26
- df = pd.DataFrame({
27
- "x": x,
28
- "y": y,
29
- "idx": indices,
30
- "rand": np.random.randn(num_points),
31
- })
32
-
33
- st.altair_chart(alt.Chart(df, height=700, width=700)
34
- .mark_point(filled=True)
35
- .encode(
36
- x=alt.X("x", axis=None),
37
- y=alt.Y("y", axis=None),
38
- color=alt.Color("idx", legend=None, scale=alt.Scale()),
39
- size=alt.Size("rand", legend=None, scale=alt.Scale(range=[1, 150])),
40
- ))
 
 
 
 
1
  import streamlit as st
2
+ import pandas as pd
3
+ import joblib
4
+ from PIL import Image
5
+ import requests
6
+ from pathlib import Path
7
+
8
+ # --- CONFIGURATION DE LA PAGE ---
9
+ st.set_page_config(
10
+ page_title="Prédiction des Dépenses",
11
+ page_icon="💳",
12
+ layout="wide"
13
+ )
14
+
15
+ script = Path(__file__)
16
+ script_dir = script.parent
17
+
18
+ # --- CHARGEMENT DES RESSOURCES ---
19
+
20
+ # Utiliser le cache de Streamlit pour ne charger le modèle et les images qu'une seule fois
21
+ @st.cache_resource
22
+ def load_model():
23
+ """Charge le modèle de prédiction depuis le fichier joblib."""
24
+ try:
25
+ model = joblib.load('xgboost_expenditure_predictor.joblib')
26
+ return model
27
+ except FileNotFoundError:
28
+ return None
29
+
30
+ # Charger le modèle et les images
31
+ model = load_model()
32
+
33
+ # --- BARRE LATÉRALE DE NAVIGATION ---
34
+ logo_school_url = script_dir/"Keyce_Logo.jpg"
35
+ st.sidebar.image(logo_school_url, width=200, caption="Etablissement")
36
+ st.sidebar.header("Navigation")
37
+ pages = ["Accueil", "Prédiction"]
38
+ choice = st.sidebar.selectbox("Choisissez une page", pages)
39
+
40
+ # --- PAGE D'ACCUEIL ---
41
+ if choice == "Accueil":
42
+ st.title("Projet de Machine Learning : Prédiction des Dépenses par Carte de Crédit")
43
+
44
+ logo_theme_url = script_dir/"Credit-Card.png" # Un logo générique de carte de crédit
45
+ if logo_theme_url:
46
+ col1, col2 = st.columns(2)
47
+ with col1:
48
+ st.image(logo_theme_url, width=200, caption="Carte de credit")
49
+ st.markdown("---")
50
+ st.header("Présentation")
51
+ st.markdown("""
52
+ Cette application web est le résultat d'un projet de fin de module visant à appliquer une procédure complète de Data Science.
53
+
54
+ - **Objectif :** Prédire le montant des dépenses mensuelles d'un client détenteur d'une carte de crédit.
55
+ - **Modèle utilisé :** `XGBoost Regressor`, un algorithme de type "gradient boosting" réputé pour sa performance.
56
+ - **Démarche :** Le projet a suivi les étapes rigoureuses de la science des données, incluant le chargement, l'exploration, le nettoyage, le prétraitement, la modélisation et l'optimisation d'hyperparamètres.
57
+ """)
58
+
59
+ st.markdown("---")
60
+ st.subheader("Informations")
61
+ st.info("""
62
+ - **Étudiant :** TATSA TCHINDA Colince
63
+ - **Établissement :** KEYCE INFORMATIQUE & IA
64
+ - **Module :** Machine Learning dans le Cloud
65
+ """)
66
+
67
+ # --- PAGE DE PRÉDICTION ---
68
+ elif choice == "Prédiction":
69
+ st.header("Prédiction des Dépenses Mensuelles 💳")
70
+ st.markdown("Veuillez renseigner les informations du client pour obtenir une estimation de ses dépenses.")
71
+
72
+ if model is None:
73
+ st.error("ERREUR : Le fichier du modèle `xgboost_expenditure_predictor.joblib` n'a pas été trouvé. Assurez-vous qu'il se trouve dans le même dossier que l'application.")
74
+ else:
75
+ # Création des volets pour les inputs
76
+ col1, col2 = st.columns(2)
77
+
78
+ with col1:
79
+ st.subheader("Informations Personnelles")
80
+ age = st.slider("Âge", 18, 85, 35)
81
+ income = st.number_input("Revenu annuel (en dizaines de milliers de $)", min_value=0.5, max_value=20.0, value=4.5, step=0.1, format="%.2f")
82
+ dependents = st.slider("Nombre de dépendants", 0, 10, 2)
83
+ owner = st.radio("Propriétaire de son logement ?", ('Oui', 'Non'), horizontal=True)
84
+ selfemp = st.radio("Travailleur indépendant (auto-entrepreneur) ?", ('Oui', 'Non'), horizontal=True)
85
+
86
+ with col2:
87
+ st.subheader("Informations Bancaires")
88
+ reports = st.slider("Nombre de rapports de crédit négatifs", 0, 20, 0)
89
+ months = st.number_input("Ancienneté à la banque (en mois)", min_value=0, max_value=600, value=54)
90
+ majorcards = st.radio("Possède une carte de crédit majeure ?", ('Oui', 'Non'), horizontal=True)
91
+ active = st.slider("Nombre d'autres cartes de crédit actives", 0, 50, 12)
92
+
93
+ st.markdown("---")
94
+ if st.button("Lancer la Prédiction", type="primary"):
95
+
96
+ # --- Prétraitement des données d'entrée ---
97
+ st.write("#### 1. Préparation des données pour le modèle...")
98
+
99
+ # Mapper les réponses textuelles en valeurs attendues par le modèle
100
+ owner_mapped = 'yes' if owner == 'Oui' else 'no'
101
+ selfemp_mapped = 'yes' if selfemp == 'Oui' else 'no'
102
+ majorcards_mapped = 1 if majorcards == 'Oui' else 0
103
+
104
+ input_data = pd.DataFrame({
105
+ # Colonnes fournies par l'utilisateur
106
+ 'reports': [reports],
107
+ 'age': [age],
108
+ 'income': [income],
109
+ 'owner': [owner_mapped],
110
+ 'selfemp': [selfemp_mapped],
111
+ 'dependents': [dependents],
112
+ 'months': [months],
113
+ 'majorcards': [majorcards_mapped],
114
+ 'active': [active],
115
+ # Colonnes manquantes ajout��es avec des valeurs factices
116
+ 'card': ['yes'],
117
+ 'share': [0.0]
118
+ })
119
+
120
+ st.write("Données formatées (avec colonnes factices pour le modèle) :")
121
+ st.dataframe(input_data)
122
+
123
+ # --- Exécution de la prédiction ---
124
+ st.write("#### 2. Exécution du modèle XGBoost...")
125
+ prediction = model.predict(input_data)
126
+ predicted_value = prediction[0]
127
+
128
+ # Assurer que la dépense prédite ne soit pas négative
129
+ if predicted_value < 0:
130
+ predicted_value = 0
131
+
132
+ # --- Affichage du résultat ---
133
+ st.write("#### 3. Résultat de la Prédiction")
134
+ st.metric(
135
+ label="Dépense Mensuelle Estimée",
136
+ value=f"${predicted_value:,.2f} USD",
137
+ help="Cette prédiction est basée sur le modèle XGBoost entraîné."
138
+ )
139
 
140
+ if predicted_value > 750:
141
+ st.success("Le profil de ce client suggère une **dépense élevée**. C'est un client à fort potentiel.")
142
+ elif predicted_value > 200:
143
+ st.info("Le profil de ce client suggère une **dépense moyenne**.")
144
+ else:
145
+ st.warning("Le profil de ce client suggère une **dépense faible**.")