andrespm commited on
Commit
f5b9a51
·
verified ·
1 Parent(s): c5bf68a

Update src/streamlit_app.py

Browse files
Files changed (1) hide show
  1. src/streamlit_app.py +48 -24
src/streamlit_app.py CHANGED
@@ -4,7 +4,6 @@ from pathlib import Path
4
 
5
  DATA_FILE = Path(__file__).parent / "master_evaluacion_evaluado.json"
6
 
7
-
8
  @st.cache_data
9
  def load_data(path):
10
  with open(path, encoding="utf-8") as f:
@@ -23,23 +22,26 @@ def build_exam():
23
  preguntas = random.sample(data["preguntas"], 38)
24
  casos = random.sample(data["casos_clinicos"], 1)
25
  items = [{"grupo": "normal", "data": q} for q in preguntas]
26
- for c in casos: # bloques de caso completos
27
  for q in c["preguntas"]:
28
- items.append({"grupo": c["id"],
29
- "data": {**q, "caso": c["titulo"], "context": c["contexto"]}})
 
 
30
  return items
31
 
32
  # ───────── Estado inicial ─────────
33
  if "mode" not in st.session_state:
34
- st.session_state.mode = "preguntas" # preguntas | caso | examen
35
- st.session_state.question = random_question()
36
- st.session_state.case_list = []
37
- st.session_state.case_idx = 0
38
  st.session_state.exam_items = []
39
- st.session_state.exam_idx = 0
40
- st.session_state.hits_norm = 0
41
- st.session_state.hits_case = {}
42
  st.session_state.total_case = {}
 
43
 
44
  # ───────── Barra lateral ─────────
45
  st.sidebar.title("Evaluación")
@@ -60,7 +62,7 @@ if st.sidebar.button("Casos clínicos"):
60
  st.session_state.question = st.session_state.case_list[0]
61
  st.rerun()
62
 
63
- if st.sidebar.button("Examen (38 + 1 caso)"):
64
  st.session_state.mode = "examen"
65
  st.session_state.exam_items = build_exam()
66
  st.session_state.exam_idx = 0
@@ -74,14 +76,21 @@ if st.sidebar.button("Examen (38 + 1 caso)"):
74
  st.session_state.question = st.session_state.exam_items[0]["data"]
75
  st.rerun()
76
 
 
 
 
 
 
 
77
  st.sidebar.markdown("---")
78
  st.sidebar.markdown("Creado con ❤️ por Requetito")
79
 
80
  # ───────── Encabezado: modo + progreso ─────────
81
  mode_label = {
82
  "preguntas": "Práctica – Preguntas sueltas",
83
- "caso": "Práctica – Casos clínicos",
84
- "examen": "Examen final"
 
85
  }
86
 
87
  st.subheader(mode_label[st.session_state.mode])
@@ -91,8 +100,18 @@ if st.session_state.mode == "examen":
91
  progreso = f"{st.session_state.exam_idx + 1} / {len(st.session_state.exam_items)}"
92
  elif st.session_state.mode == "caso":
93
  progreso = f"{st.session_state.case_idx + 1} / {len(st.session_state.case_list)}"
 
 
 
 
 
 
 
 
 
 
94
 
95
- if progreso:
96
  st.caption(progreso)
97
 
98
  # ───────── Pregunta ─────────
@@ -111,12 +130,12 @@ selected = st.radio(
111
  )
112
 
113
  col1, col2 = st.columns(2)
114
- comprobar = col1.button("✅ Comprobar")
115
- siguiente = col2.button("➡️ Siguiente")
116
 
117
  # contenedores feedback
118
  feedback_box = st.empty()
119
- justif_box = st.empty()
120
 
121
  # ───────── Comprobar ─────────
122
  if comprobar and selected:
@@ -138,7 +157,8 @@ if comprobar and selected:
138
 
139
  # ───────── Siguiente ─────────
140
  if siguiente:
141
- feedback_box.empty(); justif_box.empty() # limpiar
 
142
 
143
  if st.session_state.mode == "preguntas":
144
  st.session_state.question = random_question()
@@ -158,20 +178,18 @@ if siguiente:
158
  st.session_state.exam_idx += 1
159
  if st.session_state.exam_idx == len(st.session_state.exam_items):
160
  # Fin examen
161
- # NUEVA PONDERACIÓN
162
- pts_preg = st.session_state.hits_norm * (12.8 / 38)
163
  pts_casos = 0
164
  detalles = []
165
 
166
  for cid, tot in st.session_state.total_case.items():
167
- peso_por_preg = 3.2 / tot # Caso clínico completo vale 3.2 puntos
168
  aciertos = st.session_state.hits_case.get(cid, 0)
169
  pts = aciertos * peso_por_preg
170
  pts_casos += pts
171
  detalles.append(f"{cid}: {pts:.2f} / 3.2")
172
 
173
  total = pts_preg + pts_casos
174
-
175
  aprobado = total >= 7.5
176
  st.balloons()
177
  st.markdown(
@@ -179,11 +197,17 @@ if siguiente:
179
  f"**Preguntas (máx 12.8):** {pts_preg:.2f}\n\n"
180
  + "\n".join(detalles) +
181
  f"\n\n**TOTAL:** {total:.2f} / 16 → "
182
- + ("✅ Aprobado" if total >= 7.5 else "❌ No aprobado")
183
  )
184
  st.stop()
185
 
186
  st.session_state.question = \
187
  st.session_state.exam_items[st.session_state.exam_idx]["data"]
188
 
 
 
 
 
 
 
189
  st.rerun()
 
4
 
5
  DATA_FILE = Path(__file__).parent / "master_evaluacion_evaluado.json"
6
 
 
7
  @st.cache_data
8
  def load_data(path):
9
  with open(path, encoding="utf-8") as f:
 
22
  preguntas = random.sample(data["preguntas"], 38)
23
  casos = random.sample(data["casos_clinicos"], 1)
24
  items = [{"grupo": "normal", "data": q} for q in preguntas]
25
+ for c in casos: # bloques de caso completos
26
  for q in c["preguntas"]:
27
+ items.append({
28
+ "grupo": c["id"],
29
+ "data": {**q, "caso": c["titulo"], "context": c["contexto"]}
30
+ })
31
  return items
32
 
33
  # ───────── Estado inicial ─────────
34
  if "mode" not in st.session_state:
35
+ st.session_state.mode = "preguntas"
36
+ st.session_state.question = random_question()
37
+ st.session_state.case_list = []
38
+ st.session_state.case_idx = 0
39
  st.session_state.exam_items = []
40
+ st.session_state.exam_idx = 0
41
+ st.session_state.hits_norm = 0
42
+ st.session_state.hits_case = {}
43
  st.session_state.total_case = {}
44
+ st.session_state.recorrido_idx = 0 # nuevo
45
 
46
  # ───────── Barra lateral ─────────
47
  st.sidebar.title("Evaluación")
 
62
  st.session_state.question = st.session_state.case_list[0]
63
  st.rerun()
64
 
65
+ if st.sidebar.button("Examen (38 + a caso)"):
66
  st.session_state.mode = "examen"
67
  st.session_state.exam_items = build_exam()
68
  st.session_state.exam_idx = 0
 
76
  st.session_state.question = st.session_state.exam_items[0]["data"]
77
  st.rerun()
78
 
79
+ if st.sidebar.button("Recorrido completo"):
80
+ st.session_state.mode = "recorrido"
81
+ st.session_state.recorrido_idx = 0
82
+ st.session_state.question = data["preguntas"][0]
83
+ st.rerun()
84
+
85
  st.sidebar.markdown("---")
86
  st.sidebar.markdown("Creado con ❤️ por Requetito")
87
 
88
  # ───────── Encabezado: modo + progreso ─────────
89
  mode_label = {
90
  "preguntas": "Práctica – Preguntas sueltas",
91
+ "caso": "Práctica – Casos clínicos",
92
+ "examen": "Examen final",
93
+ "recorrido": "Recorrido completo – Todas las preguntas"
94
  }
95
 
96
  st.subheader(mode_label[st.session_state.mode])
 
100
  progreso = f"{st.session_state.exam_idx + 1} / {len(st.session_state.exam_items)}"
101
  elif st.session_state.mode == "caso":
102
  progreso = f"{st.session_state.case_idx + 1} / {len(st.session_state.case_list)}"
103
+ elif st.session_state.mode == "recorrido":
104
+ total = len(data["preguntas"])
105
+ idx = st.session_state.recorrido_idx
106
+ progreso = f"{idx + 1} / {total}"
107
+ st.caption(progreso)
108
+ nuevo_idx = st.number_input("Ir a la pregunta n.º:", min_value=1, max_value=total, value=idx + 1, step=1)
109
+ if nuevo_idx - 1 != idx:
110
+ st.session_state.recorrido_idx = nuevo_idx - 1
111
+ st.session_state.question = data["preguntas"][nuevo_idx - 1]
112
+ st.rerun()
113
 
114
+ if progreso and st.session_state.mode != "recorrido":
115
  st.caption(progreso)
116
 
117
  # ───────── Pregunta ─────────
 
130
  )
131
 
132
  col1, col2 = st.columns(2)
133
+ comprobar = col1.button("✅ Comprobar")
134
+ siguiente = col2.button("➡️ Siguiente")
135
 
136
  # contenedores feedback
137
  feedback_box = st.empty()
138
+ justif_box = st.empty()
139
 
140
  # ───────── Comprobar ─────────
141
  if comprobar and selected:
 
157
 
158
  # ───────── Siguiente ─────────
159
  if siguiente:
160
+ feedback_box.empty()
161
+ justif_box.empty()
162
 
163
  if st.session_state.mode == "preguntas":
164
  st.session_state.question = random_question()
 
178
  st.session_state.exam_idx += 1
179
  if st.session_state.exam_idx == len(st.session_state.exam_items):
180
  # Fin examen
181
+ pts_preg = st.session_state.hits_norm * (12.8 / 38)
 
182
  pts_casos = 0
183
  detalles = []
184
 
185
  for cid, tot in st.session_state.total_case.items():
186
+ peso_por_preg = 3.2 / tot
187
  aciertos = st.session_state.hits_case.get(cid, 0)
188
  pts = aciertos * peso_por_preg
189
  pts_casos += pts
190
  detalles.append(f"{cid}: {pts:.2f} / 3.2")
191
 
192
  total = pts_preg + pts_casos
 
193
  aprobado = total >= 7.5
194
  st.balloons()
195
  st.markdown(
 
197
  f"**Preguntas (máx 12.8):** {pts_preg:.2f}\n\n"
198
  + "\n".join(detalles) +
199
  f"\n\n**TOTAL:** {total:.2f} / 16 → "
200
+ + ("✅ Aprobado" if aprobado else "❌ No aprobado")
201
  )
202
  st.stop()
203
 
204
  st.session_state.question = \
205
  st.session_state.exam_items[st.session_state.exam_idx]["data"]
206
 
207
+ elif st.session_state.mode == "recorrido":
208
+ st.session_state.recorrido_idx += 1
209
+ if st.session_state.recorrido_idx >= len(data["preguntas"]):
210
+ st.session_state.recorrido_idx = 0
211
+ st.session_state.question = data["preguntas"][st.session_state.recorrido_idx]
212
+
213
  st.rerun()