Indice / Practicas / EJ-6.7
EJ-6.7 · Resumen de asistencia y alumnos en riesgo
Un resumen de asistencia por alumno y la lista de los que no llegan
al 75 %. El groupby es la parte fácil; la que decide el resultado es
cuál es el denominador.
Qué hay que hacer
A partir de asistencia_larga.csv - la salida de
EJ-6.6 -, producir:
asistencia_resumen.csv- una fila por alumno, con sus sesiones computables, presencias, ausencias y porcentaje.en_riesgo.csv- los 8 que quedan por debajo del 75 %.
ELI5Explicado facil
Un alumno faltó 3 veces de 12 clases: asistió el 75 %. Fácil.
Pero en la planilla de otro alumno hay una casilla que dice «X». ¿Ese día fue o no fue? Nadie sabe. Entonces ese alumno no tiene 12 clases para medir: tiene 11. Contar la «X» como falta lo castiga por un error de quien llenó la planilla.
Archivos
- Entrada ·
objetivos/ej-6-06/asistencia_larga.csv - Objetivo ·
asistencia_resumen.csv - Objetivo ·
en_riesgo.csv - Herramienta ·
comparar.py
El denominador variable
Cinco alumnos tienen una celda ilegible, así que tienen 11 sesiones computables y no 12. El porcentaje de cada uno se mide contra sus sesiones computables.
| Denominador | Qué afirma | Resultado para L2728 (4 presencias, 11 computables) |
|---|---|---|
computables | «se mide con lo que se sabe» | 36,36 % |
12 fijo | «la celda rara cuenta como falta» | 33,33 % |
size() | lo mismo que 12, escrito distinto | 33,33 % |
Los tres corren, ninguno da error, y solo uno está en el contrato. Elegir el denominador es el ejercicio.
Cómo saber si te salió
python comparar.py mi_resumen.csv asistencia_resumen.csv
python comparar.py mi_riesgo.csv en_riesgo.csv
Antes de arrancar, mirá los datos
| legajo | estudiante | sesion | estado | valido |
|---|---|---|---|---|
| L2701 | Rocío Duarte | sesion_01 | P | 1 |
| L2701 | Rocío Duarte | sesion_02 | P | 1 |
| L2701 | Rocío Duarte | sesion_03 | A | 1 |
| L2701 | Rocío Duarte | sesion_04 | P | 1 |
| L2701 | Rocío Duarte | sesion_05 | P | 1 |
El contrato de salida
asistencia_resumen.csv · 30 filas
| Columna | Tipo | Que lleva |
|---|---|---|
legajo | texto | El legajo del estudiante |
estudiante | texto | Su nombre |
computables | entero | Sesiones con un estado reconocible (valido = 1). Es el DENOMINADOR |
presentes | entero | Sesiones con estado exactamente P |
ausentes | entero | computables menos presentes |
sin_dato | entero | Sesiones con un estado que el sistema no reconoce |
porcentaje | decimal | 100 * presentes / computables, redondeado a 2 decimales |
en_riesgo.csv · 8 filas
| Columna | Tipo | Que lleva |
|---|---|---|
legajo | texto | El legajo del estudiante |
estudiante | texto | Su nombre |
computables | entero | Su denominador |
presentes | entero | Cuantas veces asistio |
porcentaje | decimal | Su porcentaje, menor que 75 |
Que hacer con cada defecto
| Defecto | Donde | Accion | Adonde va |
|---|---|---|---|
| estados que no son ni P ni A (X, PRESENTE, p, -, vacio) | 5 celdas repartidas en 5 alumnos | NO NO cuentan como ausencia ni como presencia: salen del denominador. Se informan en la columna sin_dato | asistencia_resumen.csv |
| el denominador no es 12 para todos | 5 alumnos tienen 11 sesiones computables | cada cada alumno se mide contra SUS sesiones computables, no contra las 12 del curso | asistencia_resumen.csv, columna computables |
| empates de porcentaje en la lista de riesgo | hay tres alumnos con 58.33 y dos con 50.00 | desempatar desempatar por legajo ascendente | en_riesgo.csv |
Una fila puede tener mas de un problema. Se informa solo el primero de esta lista:
- agrupar por legajo y estudiante
- computables = suma de valido
- presentes = cuantos estados son exactamente P
- porcentaje = 100 * presentes / computables
- filtrar los que quedan por debajo de 75
El denominador se calcula ANTES del porcentaje y sale de la columna valido, no de contar filas. Dividir por 12 o por size() da un porcentaje mas bajo para los 5 alumnos que tienen una celda ilegible, y los castiga por un error de carga que no cometieron.
Conteos clave
| filas de entrada | 360 |
|---|---|
| asistencia_resumen.csv | 30 |
| en_riesgo.csv | 8 |
| alumnos con 12 sesiones computables | 25 |
| alumnos con 11 | 5 |
| umbral de riesgo | 75 |
| porcentaje mas bajo | 36.36 |
| por motivo |
Invariantes
Comprobaciones que tu resultado tiene que cumplir. Corrilas vos mismo antes de comparar los archivos:
len(resumen) == 30
len(riesgo) == 8
resumen['legajo'].is_unique
(resumen['presentes'] + resumen['ausentes'] == resumen['computables']).all()
(resumen['computables'] + resumen['sin_dato'] == 12).all()
int(resumen['sin_dato'].sum()) == 5
int(resumen['computables'].sum()) == 355
resumen['porcentaje'].between(0, 100).all()
(riesgo['porcentaje'] < 75).all()
set(riesgo['legajo']) <= set(resumen['legajo'])
PISTASSi te trabas, abri esto
- El denominador de cada alumno es SU cantidad de sesiones computables. Dividir por 12 castiga a los 5 que tienen una celda ilegible.
- size() cuenta filas y sum() sobre la columna valido cuenta las computables: la diferencia son exactamente los 5 estados raros.
- computables + sin_dato tiene que dar 12 para todos: es el assert que atrapa el error de denominador.
- El umbral es estrictamente menor que 75: un alumno con 75.00 exacto NO esta en riesgo. Hay dos en ese borde.
Así tiene que quedar
| legajo | estudiante | computables | presentes | ausentes | sin_dato | porcentaje |
|---|---|---|---|---|---|---|
| L2701 | Rocío Duarte | 12 | 6 | 6 | 0 | 50.0 |
| L2702 | Yamila Escobar | 12 | 10 | 2 | 0 | 83.33 |
| L2703 | Fabián Bravo | 11 | 10 | 1 | 1 | 90.91 |
| L2704 | Pablo Luna | 12 | 9 | 3 | 0 | 75.0 |
| L2705 | Valeria Vidal | 12 | 11 | 1 | 0 | 91.67 |
| legajo | estudiante | computables | presentes | porcentaje |
|---|---|---|---|---|
| L2728 | Fabián Bravo | 11 | 4 | 36.36 |
| L2701 | Rocío Duarte | 12 | 6 | 50.0 |
| L2726 | Valeria Bravo | 12 | 6 | 50.0 |
| L2706 | Diego Silva | 12 | 7 | 58.33 |
| L2718 | Santiago Ibarra | 12 | 7 | 58.33 |
Hay dos alumnos con exactamente 75.00 %, y no entran en la lista
de riesgo. Si tu archivo tiene 10 filas en vez de 8, usaste <=.
Un borde así siempre tiene que estar escrito. «Menos del 75 %» y «75 % o menos» son dos reglas distintas, y en este archivo la diferencia son dos personas a las que alguien va a llamar.
assert que atrapa el error de denominador
computables + sin_dato == 12 para todos los alumnos. Si no cierra, el
denominador salió de contar filas en vez de sumar la columna valido.