Eric2mangel commited on
Commit
96f6798
·
verified ·
1 Parent(s): 8fd0b19

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +25 -30
app.py CHANGED
@@ -1,6 +1,6 @@
1
  import streamlit as st
2
 
3
- # CSS pour compacter l'interface (inchangé)
4
  st.markdown("""
5
  <style>
6
  .block-container {padding-top: 1.2rem; padding-bottom: 1rem;}
@@ -14,19 +14,17 @@ st.markdown("""
14
 
15
  st.set_page_config(page_title="Bayes – Calcul rapide", layout="wide")
16
 
17
- # Titre compact (inchangé)
18
  st.title("🧠 Bayes – Calcul interactif")
19
  st.caption("P(A|B) = [P(B|A) × P(A)] / P(B)")
20
 
21
  with st.expander("Rappel formule", expanded=False):
22
  st.markdown("P(B) = P(B|A)×P(A) + P(B|¬A)×P(¬A)")
23
 
24
- # ─── Toggle mode + exemples ──────────────────────────────────────────────
25
  col_mode, col_ex = st.columns([40, 60])
26
  with col_mode:
27
  mode_ds = st.toggle("Mode Data Science (Recall/Precision)", value=False)
28
 
29
- # Labels selon mode (inchangé)
30
  if mode_ds:
31
  lbl = {
32
  "prev": "Prévalence (Classe +)",
@@ -50,19 +48,19 @@ with col_ex:
50
  "Grossesse ~4–5%",
51
  "ADN culpabilité ~0.001%"
52
  ]
53
- choix = st.selectbox("Exemple", exemples, index=0)
54
 
55
- # ─── Gestion du changement d'exemple ─────────────────────────────────────
56
- # On stocke le dernier choix dans la session pour détecter le changement
57
- if "last_choix" not in st.session_state:
58
- st.session_state.last_choix = None
59
 
60
- exemple_changed = choix != st.session_state.last_choix
 
61
 
62
- # Mettre à jour le dernier choix
63
- st.session_state.last_choix = choix
64
 
65
- # Valeurs par défaut
66
  defaults = {
67
  "Cancer dépistage ~0.8%": (0.8, 85.0, 92.0),
68
  "Fraude CB ~0.1%": (0.1, 92.0, 99.85),
@@ -70,7 +68,7 @@ defaults = {
70
  "ADN culpabilité ~0.001%": (0.001, 99.9, 99.99),
71
  }.get(choix, (5.0, 90.0, 95.0))
72
 
73
- # ─── Champs saisie ────────────────────────────────────────────────────────
74
  c1, c2, c3, c4 = st.columns(4, gap="small")
75
 
76
  with c1:
@@ -79,9 +77,9 @@ with c1:
79
  label = lbl['prev'],
80
  min_value = 0.0,
81
  max_value = 100.0,
82
- value = float(defaults[0]) if exemple_changed or choix == "Manuel" else st.session_state.get("prev", float(defaults[0])),
83
  step = 0.01,
84
- key = "prev",
85
  label_visibility = "collapsed"
86
  )
87
 
@@ -91,9 +89,9 @@ with c2:
91
  label = lbl['recall'],
92
  min_value = 0.0,
93
  max_value = 100.0,
94
- value = float(defaults[1]) if exemple_changed or choix == "Manuel" else st.session_state.get("rec", float(defaults[1])),
95
  step = 0.1,
96
- key = "rec",
97
  label_visibility = "collapsed"
98
  )
99
 
@@ -103,9 +101,9 @@ with c3:
103
  label = lbl['spe'],
104
  min_value = 0.0,
105
  max_value = 100.0,
106
- value = float(defaults[2]) if exemple_changed or choix == "Manuel" else st.session_state.get("spe", float(defaults[2])),
107
  step = 0.1,
108
- key = "spe",
109
  label_visibility = "collapsed"
110
  )
111
 
@@ -115,13 +113,13 @@ with c4:
115
  label = lbl['post'],
116
  min_value = 0.0,
117
  max_value = 100.0,
118
- value = 50.0 if exemple_changed or choix == "Manuel" else st.session_state.get("post", 50.0),
119
  step = 0.1,
120
- key = "post",
121
  label_visibility = "collapsed"
122
  )
123
 
124
- # ─── Choix à calculer ─────────────────────────────────────────────────────
125
  st.write("")
126
  st.subheader("Calculer :", divider=False)
127
 
@@ -131,7 +129,7 @@ calc_recall = cols[1].checkbox(lbl["recall"], key="c_rec")
131
  calc_speci = cols[2].checkbox(lbl["spe"], key="c_spe")
132
  calc_post = cols[3].checkbox(lbl["post"], value=True, key="c_post")
133
 
134
- # Bouton principal (inchangé)
135
  if st.button("Calculer", type="primary", use_container_width=True):
136
  p = prev / 100
137
  se = recall / 100
@@ -150,15 +148,12 @@ if st.button("Calculer", type="primary", use_container_width=True):
150
  if calc_post:
151
  res = (se * p) / (se * p + (1 - sp) * (1 - p))
152
  label = lbl["post"]
153
-
154
  elif calc_prev:
155
  res = (po * (1 - sp)) / (se - po * (se - (1 - sp)))
156
  label = lbl["prev"]
157
-
158
  elif calc_recall:
159
  res = (po * (1 - sp) * (1 - p)) / (p * (1 - po))
160
  label = lbl["recall"]
161
-
162
  elif calc_speci:
163
  res = 1 - (se * p * (1 - po)) / (po * (1 - p))
164
  label = lbl["spe"]
@@ -170,13 +165,13 @@ if st.button("Calculer", type="primary", use_container_width=True):
170
  st.warning(f"Résultat : {res_pct:,.2f} % → paramètres incohérents")
171
 
172
  except ZeroDivisionError:
173
- st.error("Division par zéro – vérifiez les valeurs extrêmes (0%/100%)")
174
  except Exception as e:
175
  st.error(f"Erreur : {str(e)}")
176
 
177
  # Sources et astuce (inchangés)
178
  with st.expander("Sources et références des exemples", expanded=False):
179
- st.markdown("""...""") # ton contenu sources ici
180
 
181
  with st.expander("Astuce rapide", expanded=False):
182
- st.caption("Plus la prévalence est faible → plus la précision (VPP) chute, même avec un très bon test.")
 
1
  import streamlit as st
2
 
3
+ # CSS inchangé
4
  st.markdown("""
5
  <style>
6
  .block-container {padding-top: 1.2rem; padding-bottom: 1rem;}
 
14
 
15
  st.set_page_config(page_title="Bayes – Calcul rapide", layout="wide")
16
 
 
17
  st.title("🧠 Bayes – Calcul interactif")
18
  st.caption("P(A|B) = [P(B|A) × P(A)] / P(B)")
19
 
20
  with st.expander("Rappel formule", expanded=False):
21
  st.markdown("P(B) = P(B|A)×P(A) + P(B|¬A)×P(¬A)")
22
 
23
+ # ─── Mode + select ────────────────────────────────────────────────────────
24
  col_mode, col_ex = st.columns([40, 60])
25
  with col_mode:
26
  mode_ds = st.toggle("Mode Data Science (Recall/Precision)", value=False)
27
 
 
28
  if mode_ds:
29
  lbl = {
30
  "prev": "Prévalence (Classe +)",
 
48
  "Grossesse ~4–5%",
49
  "ADN culpabilité ~0.001%"
50
  ]
51
+ choix = st.selectbox("Exemple", exemples, index=0, key="exemple_select")
52
 
53
+ # Détection changement + suffix pour clés dynamiques
54
+ if "prev_choix" not in st.session_state:
55
+ st.session_state.prev_choix = "INIT"
 
56
 
57
+ exemple_changed = choix != st.session_state.prev_choix
58
+ key_suffix = f"_{choix.replace(' ', '_')}" if exemple_changed else ""
59
 
60
+ # Mise à jour
61
+ st.session_state.prev_choix = choix
62
 
63
+ # Defaults
64
  defaults = {
65
  "Cancer dépistage ~0.8%": (0.8, 85.0, 92.0),
66
  "Fraude CB ~0.1%": (0.1, 92.0, 99.85),
 
68
  "ADN culpabilité ~0.001%": (0.001, 99.9, 99.99),
69
  }.get(choix, (5.0, 90.0, 95.0))
70
 
71
+ # ─── Inputs avec clés dynamiques quand changement ─────────────────────────
72
  c1, c2, c3, c4 = st.columns(4, gap="small")
73
 
74
  with c1:
 
77
  label = lbl['prev'],
78
  min_value = 0.0,
79
  max_value = 100.0,
80
+ value = float(defaults[0]),
81
  step = 0.01,
82
+ key = f"prev{key_suffix}",
83
  label_visibility = "collapsed"
84
  )
85
 
 
89
  label = lbl['recall'],
90
  min_value = 0.0,
91
  max_value = 100.0,
92
+ value = float(defaults[1]),
93
  step = 0.1,
94
+ key = f"rec{key_suffix}",
95
  label_visibility = "collapsed"
96
  )
97
 
 
101
  label = lbl['spe'],
102
  min_value = 0.0,
103
  max_value = 100.0,
104
+ value = float(defaults[2]),
105
  step = 0.1,
106
+ key = f"spe{key_suffix}",
107
  label_visibility = "collapsed"
108
  )
109
 
 
113
  label = lbl['post'],
114
  min_value = 0.0,
115
  max_value = 100.0,
116
+ value = 50.0,
117
  step = 0.1,
118
+ key = f"post{key_suffix}",
119
  label_visibility = "collapsed"
120
  )
121
 
122
+ # ─── Checkboxes (inchangées, mais on peut les reset si tu veux) ───────────
123
  st.write("")
124
  st.subheader("Calculer :", divider=False)
125
 
 
129
  calc_speci = cols[2].checkbox(lbl["spe"], key="c_spe")
130
  calc_post = cols[3].checkbox(lbl["post"], value=True, key="c_post")
131
 
132
+ # Bouton Calculer (inchangé)
133
  if st.button("Calculer", type="primary", use_container_width=True):
134
  p = prev / 100
135
  se = recall / 100
 
148
  if calc_post:
149
  res = (se * p) / (se * p + (1 - sp) * (1 - p))
150
  label = lbl["post"]
 
151
  elif calc_prev:
152
  res = (po * (1 - sp)) / (se - po * (se - (1 - sp)))
153
  label = lbl["prev"]
 
154
  elif calc_recall:
155
  res = (po * (1 - sp) * (1 - p)) / (p * (1 - po))
156
  label = lbl["recall"]
 
157
  elif calc_speci:
158
  res = 1 - (se * p * (1 - po)) / (po * (1 - p))
159
  label = lbl["spe"]
 
165
  st.warning(f"Résultat : {res_pct:,.2f} % → paramètres incohérents")
166
 
167
  except ZeroDivisionError:
168
+ st.error("Division par zéro – vérifiez les valeurs extrêmes")
169
  except Exception as e:
170
  st.error(f"Erreur : {str(e)}")
171
 
172
  # Sources et astuce (inchangés)
173
  with st.expander("Sources et références des exemples", expanded=False):
174
+ st.markdown("... ton contenu ...")
175
 
176
  with st.expander("Astuce rapide", expanded=False):
177
+ st.caption("Plus la prévalence est faible → plus la précision chute...")