LewisBabong commited on
Commit
aa18a5d
·
verified ·
1 Parent(s): 7380478

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +182 -138
app.py CHANGED
@@ -1,147 +1,191 @@
1
  import streamlit as st
2
- import matplotlib.pyplot as plt
3
- import numpy as np
 
 
4
 
5
- # Configuration de la page
6
- st.set_page_config(
7
- page_title="Calculateur de santé",
8
- layout="wide",
9
- initial_sidebar_state="expanded",
10
- )
11
 
12
- # Titre principal
13
- st.title("💪 Calculateur de Santé Complet")
 
 
14
  st.markdown(
15
- """
16
- Cette application vous aide à :
17
- - Calculer votre **BMI** (Body Mass Index).
18
- - Déterminer vos **besoins caloriques** quotidiens.
19
- - Obtenir des **recommandations personnalisées** pour votre santé.
20
- """
21
- )
22
-
23
- # Mise en page en colonnes
24
- col1, col2, col3 = st.columns([1, 2, 1])
25
-
26
- with col1:
27
- st.header("Entrez vos données")
28
- genre = st.radio("Genre", options=["Homme", "Femme"], horizontal=True)
29
- age = st.number_input("Âge (en années)", min_value=1, max_value=120, value=25)
30
- poids = st.number_input("Poids (en kg)", min_value=1.0, max_value=300.0, value=70.0)
31
- taille = st.number_input("Taille (en cm)", min_value=50.0, max_value=250.0, value=170.0)
32
-
33
- niveau_activite = st.selectbox(
34
- "Niveau d'activité physique",
35
- options=[
36
- "Sédentaire (peu ou pas d'activité physique)",
37
- "Légèrement actif (1-3 jours/semaine)",
38
- "Modérément actif (3-5 jours/semaine)",
39
- "Très actif (6-7 jours/semaine)",
40
- "Extrêmement actif (travail physique intense ou sport professionnel)",
41
- ],
42
- )
43
-
44
- # Calcul du BMI
45
- with col2:
46
- st.header("Résultats")
47
- bmi = round(poids / ((taille / 100) ** 2), 2)
48
-
49
- # Card du BMI
50
- with st.container():
51
- st.markdown("<h3 style='text-align:center;'>📊 Votre BMI</h3>", unsafe_allow_html=True)
52
- st.markdown(f"<div style='border:1px solid #ccc; padding:20px; border-radius:10px; text-align:center;'>"
53
- f"**Votre BMI est : {bmi}**</div>", unsafe_allow_html=True)
54
-
55
- # Analyse du BMI
56
- if bmi < 18.5:
57
- categorie = "Insuffisance pondérale"
58
- couleur = "blue"
59
- elif 18.5 <= bmi < 24.9:
60
- categorie = "Poids normal"
61
- couleur = "green"
62
- elif 25 <= bmi < 29.9:
63
- categorie = "Surpoids"
64
- couleur = "orange"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
65
  else:
66
- categorie = "Obésité"
67
- couleur = "red"
68
 
69
- st.markdown(f"<h3 style='color:{couleur};'>Catégorie : {categorie}</h3>", unsafe_allow_html=True)
70
 
71
- # Card des besoins caloriques
72
- if genre == "Homme":
73
- bmr = 10 * poids + 6.25 * taille - 5 * age + 5
 
 
 
 
 
 
 
 
 
 
74
  else:
75
- bmr = 10 * poids + 6.25 * taille - 5 * age - 161
76
-
77
- facteur_activite = {
78
- "Sédentaire (peu ou pas d'activité physique)": 1.2,
79
- "L��gèrement actif (1-3 jours/semaine)": 1.375,
80
- "Modérément actif (3-5 jours/semaine)": 1.55,
81
- "Très actif (6-7 jours/semaine)": 1.725,
82
- "Extrêmement actif (travail physique intense ou sport professionnel)": 1.9,
83
- }
84
- calories = round(bmr * facteur_activite[niveau_activite])
85
-
86
- with st.container():
87
- st.markdown("<h3 style='text-align:center;'>🍽️ Vos Besoins Caloriques</h3>", unsafe_allow_html=True)
88
- st.markdown(f"<div style='border:1px solid #ccc; padding:20px; border-radius:10px; text-align:center;'>"
89
- f"**Besoin calorique journalier estimé : {calories} kcal**</div>", unsafe_allow_html=True)
90
-
91
- # Suggestions personnalisées
92
- with col3:
93
- st.header("Recommandations")
94
- if categorie == "Insuffisance pondérale":
95
- with st.container():
96
- st.markdown("<h3 style='text-align:center;'>🥗 Recommandations</h3>", unsafe_allow_html=True)
97
- st.markdown("<div style='border:1px solid #ccc; padding:20px; border-radius:10px; background-color:lightblue;'>"
98
- "Augmentez votre apport calorique avec des aliments riches en nutriments comme les fruits secs et les protéines animales.</div>", unsafe_allow_html=True)
99
- elif categorie == "Poids normal":
100
- with st.container():
101
- st.markdown("<h3 style='text-align:center;'>🥗 Recommandations</h3>", unsafe_allow_html=True)
102
- st.markdown("<div style='border:1px solid #ccc; padding:20px; border-radius:10px; background-color:lightgreen;'>"
103
- "Continuez à maintenir votre mode de vie sain en équilibrant votre alimentation et votre activité physique.</div>", unsafe_allow_html=True)
104
- elif categorie == "Surpoids":
105
- with st.container():
106
- st.markdown("<h3 style='text-align:center;'>🥗 Recommandations</h3>", unsafe_allow_html=True)
107
- st.markdown("<div style='border:1px solid #ccc; padding:20px; border-radius:10px; background-color:lightcoral;'>"
108
- "Essayez de réduire légèrement votre apport calorique et augmentez votre activité physique pour perdre du poids de manière saine.</div>", unsafe_allow_html=True)
109
  else:
110
- with st.container():
111
- st.markdown("<h3 style='text-align:center;'>🥗 Recommandations</h3>", unsafe_allow_html=True)
112
- st.markdown("<div style='border:1px solid #ccc; padding:20px; border-radius:10px; background-color:lightcoral;'>"
113
- "Consultez un professionnel de santé pour obtenir des recommandations adaptées à votre situation.</div>", unsafe_allow_html=True)
114
-
115
- st.info("Buvez au moins 1.5L à 2L d'eau par jour pour rester hydraté.")
116
-
117
- # Graphique pour visualiser le BMI
118
- st.header("Visualisation de votre BMI")
119
- fig, ax = plt.subplots(figsize=(6, 4))
120
- categories = ["Insuffisance pondérale", "Poids normal", "Surpoids", "Obésité"]
121
- valeurs = [18.5, 24.9, 29.9, 40]
122
- couleurs = ["blue", "green", "orange", "red"]
123
-
124
- ax.barh(categories, valeurs, color=couleurs, alpha=0.7)
125
- ax.axvline(bmi, color="black", linestyle="--", label=f"Votre BMI ({bmi})")
126
- ax.set_xlabel("Valeur du BMI")
127
- ax.set_title("Interprétation des catégories du BMI")
128
- ax.legend()
129
-
130
- st.pyplot(fig)
131
-
132
- # Sidebar
133
- st.sidebar.header("Informations supplémentaires")
134
- st.sidebar.markdown(
135
- """
136
- ### Qu'est-ce que le BMI ?
137
- Le BMI est une mesure standard utilisée pour évaluer si une personne est en sous-poids, en poids normal, en surpoids ou obèse.
138
-
139
- ### Limites du BMI
140
- - Ne prend pas en compte la masse musculaire.
141
- - Peut ne pas être représentatif pour certains groupes ethniques.
142
-
143
- ### Liens utiles :
144
- - [Organisation mondiale de la santé (OMS)](https://www.who.int)
145
- - [Calculateur d'apports caloriques](https://www.calculator.net/calorie-calculator.html)
146
- """
147
- )
 
1
  import streamlit as st
2
+ import pandas as pd
3
+ import plotly.express as px
4
+ # from streamlit_extras.colored_header import colored_header
5
+ # from streamlit_option_menu import option_menu
6
 
7
+ # Charger les données
8
+ data_path = "bank.csv" # Chemin vers le fichier
9
+ bank_data = pd.read_csv(data_path)
 
 
 
10
 
11
+ # Configuration de l'application
12
+ st.set_page_config(page_title="Lewis Bank", layout="wide", page_icon="\U0001F4B3")
13
+
14
+ # Personnalisation du style
15
  st.markdown(
16
+ "<style>body {background-color: #f5f5f5;} .metric-card { border: 2px solid #c62828; border-radius: 10px; padding: 10px; }</style>",
17
+ unsafe_allow_html=True)
18
+
19
+ # Titre principal
20
+ st.markdown(f"# Lewis Bank")
21
+
22
+
23
+ def color_menu(label, color_name):
24
+ st.markdown(f"""
25
+ <h1 style="color: {color_name}; font-size: 30px; text-align: center;">{label}</h1>
26
+ """, unsafe_allow_html=True)
27
+
28
+
29
+ # Menu de navigation
30
+ menu = st.sidebar.radio("Menu", ["Accueil", "Analyse des Clients", "Analyse Financière", "Campagnes Marketing",
31
+ "Cartes Bancaires", "Analyse des Transactions", "Suivi des Clients",
32
+ "Assistance Client"])
33
+
34
+ if menu == "Accueil":
35
+ color_menu(label="Vue d'ensemble des données", color_name="red-70")
36
+
37
+ # Statistiques clés
38
+ col1, col2, col3 = st.columns(3)
39
+ with col1:
40
+ st.metric("Nombre total de clients", len(bank_data))
41
+ with col2:
42
+ st.metric("Solde moyen", f"{bank_data['balance'].mean():.2f} €")
43
+ with col3:
44
+ taux_pret = (bank_data['loan'].value_counts(normalize=True).get('yes', 0) * 100)
45
+ st.metric("Taux de prêt personnel", f"{taux_pret:.2f}%")
46
+
47
+ # Graphique des soldes avec Plotly
48
+ st.subheader("Distribution des soldes")
49
+ fig = px.histogram(bank_data, x="balance", nbins=30, title="Distribution des soldes",
50
+ color_discrete_sequence=["#c62828"], template="plotly_white")
51
+ st.plotly_chart(fig)
52
+
53
+ elif menu == "Analyse des Clients":
54
+ color_menu(label="Analyse des Clients", color_name="red-70")
55
+
56
+ # Filtrer les clients
57
+ st.subheader("Filtres")
58
+ professions = st.multiselect("Sélectionnez une ou plusieurs professions :", bank_data['job'].unique())
59
+ etat_matrimonial = st.selectbox("État matrimonial :", ["Tous"] + list(bank_data['marital'].unique()))
60
+
61
+ # Appliquer les filtres
62
+ filtered_data = bank_data
63
+ if professions:
64
+ filtered_data = filtered_data[filtered_data['job'].isin(professions)]
65
+ if etat_matrimonial != "Tous":
66
+ filtered_data = filtered_data[filtered_data['marital'] == etat_matrimonial]
67
+
68
+ st.write(f"Nombre de clients filtrés : {len(filtered_data)}")
69
+ st.dataframe(filtered_data, use_container_width=True)
70
+
71
+ # Visualisation interactive des clients filtrés
72
+ if not filtered_data.empty:
73
+ st.subheader("Visualisation des clients filtrés")
74
+ fig = px.scatter(filtered_data, x="balance", y="age", color="job", title="Relation entre l'âge et le solde",
75
+ labels={"balance": "Solde (€)", "age": "Âge"}, hover_data=["marital", "education"],
76
+ template="plotly_white")
77
+ st.plotly_chart(fig)
78
+
79
+ elif menu == "Analyse Financière":
80
+ color_menu(label="Analyse Financière", color_name="red-70")
81
+
82
+ # Graphique des soldes moyens par profession avec Plotly
83
+ st.subheader("Soldes moyens par profession")
84
+ mean_balance_by_job = bank_data.groupby('job')['balance'].mean().reset_index().sort_values(by='balance',
85
+ ascending=False)
86
+ fig = px.bar(mean_balance_by_job, x="job", y="balance", title="Soldes moyens par profession", color="balance",
87
+ color_continuous_scale=px.colors.sequential.Reds, template="plotly_white")
88
+ st.plotly_chart(fig)
89
+
90
+ # Graphique des prêts avec Plotly
91
+ st.subheader("Répartition des prêts (logement et personnel)")
92
+ pret_data = bank_data[['housing', 'loan']].apply(pd.Series.value_counts).fillna(0).reset_index()
93
+ pret_data_melted = pret_data.melt(id_vars="index", value_vars=["housing", "loan"],
94
+ var_name="Type de prêt", value_name="Nombre")
95
+ fig = px.bar(pret_data_melted, x="index", y="Nombre", color="Type de prêt", barmode="group",
96
+ title="Répartition des prêts", template="plotly_white")
97
+ st.plotly_chart(fig)
98
+
99
+ elif menu == "Campagnes Marketing":
100
+ color_menu(label="Analyse des Campagnes Marketing", color_name="red-70")
101
+
102
+ # Résultats des campagnes avec Plotly
103
+ st.subheader("Résultats des campagnes précédentes")
104
+ outcome_counts = bank_data['poutcome'].value_counts().reset_index()
105
+ outcome_counts.columns = ["Résultat", "Nombre"]
106
+ fig = px.pie(outcome_counts, names="Résultat", values="Nombre", title="Résultats des campagnes",
107
+ color_discrete_sequence=px.colors.sequential.Reds, template="plotly_white")
108
+ st.plotly_chart(fig)
109
+
110
+ # Analyse des dépôts avec Plotly
111
+ st.subheader("Taux de réussite des campagnes")
112
+ depot_counts = bank_data['deposit'].value_counts().reset_index()
113
+ depot_counts.columns = ["Dépôt", "Nombre"]
114
+ fig = px.bar(depot_counts, x="Dépôt", y="Nombre", title="Taux de dépôt",
115
+ labels={"Dépôt": "Dépôt", "Nombre": "Nombre"}, color="Dépôt",
116
+ color_discrete_sequence=["#c62828", "#f77f77"], template="plotly_white")
117
+ st.plotly_chart(fig)
118
+
119
+ elif menu == "Cartes Bancaires":
120
+ color_menu(label="Cartes Bancaires", color_name="red-70")
121
+
122
+ # Visualisation des types de cartes
123
+ st.subheader("Répartition des types de cartes bancaires")
124
+ if 'card_type' in bank_data.columns:
125
+ card_counts = bank_data['card_type'].value_counts().reset_index()
126
+ card_counts.columns = ["Type de Carte", "Nombre"]
127
+ fig = px.pie(card_counts, names="Type de Carte", values="Nombre", title="Répartition des types de cartes",
128
+ color_discrete_sequence=px.colors.sequential.Reds, template="plotly_white")
129
+ st.plotly_chart(fig)
130
+ else:
131
+ st.warning("Aucune donnée sur les types de cartes bancaires disponible.")
132
+
133
+ # Analyse des limites de crédit
134
+ st.subheader("Limites de crédit par type de carte")
135
+ if 'card_type' in bank_data.columns and 'credit_limit' in bank_data.columns:
136
+ credit_limits = bank_data.groupby('card_type')['balance'].mean().reset_index()
137
+ fig = px.bar(credit_limits, x="card_type", y="credit_limit", title="Limites de crédit par type de carte",
138
+ color="credit_limit", color_continuous_scale=px.colors.sequential.Reds, template="plotly_white")
139
+ st.plotly_chart(fig)
140
  else:
141
+ st.warning("Aucune donnée sur les limites de crédit disponible.")
142
+
143
 
144
+ elif menu == "Analyse des Transactions":
145
 
146
+ st.markdown(f"# Analyse des Transactions")
147
+ data_path = "bank.csv"
148
+ bank_data = pd.read_csv(data_path)
149
+
150
+ st.subheader("Transactions totales")
151
+ st.metric("Nombre de transactions", len(bank_data))
152
+
153
+ st.subheader("Montant total par type de transaction")
154
+ if 'transaction_type' in bank_data.columns and 'amount' in bank_data.columns:
155
+ transaction_data = bank_data.groupby('transaction_type')['amount'].sum().reset_index()
156
+ fig = px.bar(transaction_data, x="transaction_type", y="amount", color="amount",
157
+ title="Montant total par type de transaction", template="plotly_white")
158
+ st.plotly_chart(fig)
159
  else:
160
+ st.warning("Aucune donnée disponible pour les transactions.")
161
+
162
+ elif menu == "Suivi des Clients":
163
+
164
+ st.markdown(f"# Suivi des Clients")
165
+ data_path = "bank.csv"
166
+ bank_data = pd.read_csv(data_path)
167
+
168
+ st.subheader("Répartition des clients par éducation")
169
+ if 'education' in bank_data.columns:
170
+ education_counts = bank_data['education'].value_counts().reset_index()
171
+ education_counts.columns = ["Niveau d'éducation", "Nombre"]
172
+ fig = px.pie(education_counts, names="Niveau d'éducation", values="Nombre",
173
+ title="Répartition par éducation", color_discrete_sequence=px.colors.sequential.Reds)
174
+ st.plotly_chart(fig)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
175
  else:
176
+ st.warning("Aucune donnée sur l'éducation disponible.")
177
+
178
+ elif menu == "Assistance Client":
179
+
180
+ st.markdown(f"# Assistance Client")
181
+ st.subheader("Centre d'aide")
182
+ st.markdown("""
183
+ - **FAQ :** Consultez les questions fréquentes.
184
+ - **Support en direct :** Contactez un conseiller via le chat.
185
+ - **Numéro d'urgence :** Appelez le +33 123 456 789.
186
+ """)
187
+
188
+ st.subheader("Feedback")
189
+ feedback = st.text_area("Laissez vos suggestions ou remarques ici :", "")
190
+ if st.button("Envoyer"):
191
+ st.success("Merci pour votre feedback !")