Saltar al contenido

Indice / Practicas / EJ-6.7

EJ-6.7 · Resumen de asistencia y alumnos en riesgo

Practica de: 6.4 groupbyDificultad: M

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:

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

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.

Tres formas de calcular el mismo porcentaje
DenominadorQué afirmaResultado 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 distinto33,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

objetivos/ej-6-06/asistencia_larga.csv (entrada) · 360 filas, se muestran 5
legajoestudiantesesionestadovalido
L2701Rocío Duartesesion_01P1
L2701Rocío Duartesesion_02P1
L2701Rocío Duartesesion_03A1
L2701Rocío Duartesesion_04P1
L2701Rocío Duartesesion_05P1

El contrato de salida

asistencia_resumen.csv · 30 filas

ColumnaTipoQue lleva
legajotextoEl legajo del estudiante
estudiantetextoSu nombre
computablesenteroSesiones con un estado reconocible (valido = 1). Es el DENOMINADOR
presentesenteroSesiones con estado exactamente P
ausentesenterocomputables menos presentes
sin_datoenteroSesiones con un estado que el sistema no reconoce
porcentajedecimal100 * presentes / computables, redondeado a 2 decimales

Orden de las filas: legajo ascendente. Es unico. Indice: no se escribe: to_csv(index=False)

en_riesgo.csv · 8 filas

ColumnaTipoQue lleva
legajotextoEl legajo del estudiante
estudiantetextoSu nombre
computablesenteroSu denominador
presentesenteroCuantas veces asistio
porcentajedecimalSu porcentaje, menor que 75

Orden de las filas: porcentaje ASC y, si empatan, legajo ASC. Indice: no se escribe: to_csv(index=False)

Que hacer con cada defecto

DefectoDondeAccionAdonde va
estados que no son ni P ni A (X, PRESENTE, p, -, vacio)5 celdas repartidas en 5 alumnosNO NO cuentan como ausencia ni como presencia: salen del denominador. Se informan en la columna sin_datoasistencia_resumen.csv
el denominador no es 12 para todos5 alumnos tienen 11 sesiones computablescada cada alumno se mide contra SUS sesiones computables, no contra las 12 del cursoasistencia_resumen.csv, columna computables
empates de porcentaje en la lista de riesgohay tres alumnos con 58.33 y dos con 50.00desempatar desempatar por legajo ascendenteen_riesgo.csv
Orden de comprobacion

Una fila puede tener mas de un problema. Se informa solo el primero de esta lista:

  1. agrupar por legajo y estudiante
  2. computables = suma de valido
  3. presentes = cuantos estados son exactamente P
  4. porcentaje = 100 * presentes / computables
  5. 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

Si estos numeros no te dan, algo se desvio antes de que llegues a comparar los archivos.

filas de entrada360
asistencia_resumen.csv30
en_riesgo.csv8
alumnos con 12 sesiones computables25
alumnos con 115
umbral de riesgo75
porcentaje mas bajo36.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

asistencia_resumen.csv (objetivo) · 30 filas, se muestran 5
legajoestudiantecomputablespresentesausentessin_datoporcentaje
L2701Rocío Duarte1266050.0
L2702Yamila Escobar12102083.33
L2703Fabián Bravo11101190.91
L2704Pablo Luna1293075.0
L2705Valeria Vidal12111091.67
en_riesgo.csv (objetivo) · 8 filas, se muestran 5
legajoestudiantecomputablespresentesporcentaje
L2728Fabián Bravo11436.36
L2701Rocío Duarte12650.0
L2726Valeria Bravo12650.0
L2706Diego Silva12758.33
L2718Santiago Ibarra12758.33
El umbral es estrictamente menor que 75

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.

El 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.