Saltar al contenido

Indice / Practicas / EJ-6.6

EJ-6.6 · De ancho a largo con melt

Practica de: 6.5 pivot_table y reshapeDificultad: M

Una planilla de asistencia de 30 alumnos por 12 sesiones se convierte en 360 filas. La conversión es una línea; lo que hay que decidir es qué hacer con las cinco celdas que no dicen ni P ni A.

Qué hay que hacer

A partir de asistencia_sesiones.csv, producir asistencia_larga.csv: una fila por celda, con el legajo, el nombre, la sesión, el estado y una bandera que diga si ese estado es reconocible.

ELI5Explicado facil

La grilla de asistencia pegada en la pared tiene un alumno por fila y una columna por clase. Es cómoda de mirar y pésima para contar.

Este ejercicio la pasa a un cuaderno donde cada renglón dice «tal alumno, tal clase, presente». Con 360 renglones en vez de una grilla, contar ausencias pasa a ser una sola línea - y de paso saltan a la vista las cinco anotaciones que nadie entiende.

Archivos

Las cinco celdas raras

Entre las 360 celdas hay una X, un PRESENTE escrito completo, una p minúscula, un guion y una vacía. Ninguna se corrige: se conservan tal cual, con valido = 0.

La p minúscula es la más tentadora: es obvio que quiso decir presente, y normalizarla es una línea. Y este ejercicio no la normaliza a propósito. Si el programa arregla lo obvio en silencio, el informe dice que las 360 celdas están bien y nadie se entera de que alguien está cargando datos de cualquier forma.

Marcar es distinto de corregir: deja el problema visible y la decisión en manos de quien corresponde.

Cómo saber si te salió

python comparar.py mi_salida.csv asistencia_larga.csv

Antes de arrancar, mirá los datos

asistencia_sesiones.csv (entrada) · 30 filas, se muestran 5
legajoestudiantesesion_01sesion_02sesion_03sesion_04sesion_05sesion_06sesion_07sesion_08sesion_09sesion_10sesion_11sesion_12
L2701Rocío DuartePPAPPAPAAPAA
L2702Yamila EscobarPPPPAAPPPPPP
L2703Fabián BravoAPPPvacioPPPPPPP
L2704Pablo LunaAPPPPPPPPPAA
L2705Valeria VidalPPPPPPPAPPPP

El contrato de salida

asistencia_larga.csv · 360 filas

ColumnaTipoQue lleva
legajotextoEl legajo del estudiante, repetido una vez por sesion
estudiantetextoSu nombre, tambien repetido
sesiontextoEl nombre de la columna de origen: sesion_01 a sesion_12
estadotextoEl contenido de la celda, sin espacios en los extremos. Puede quedar vacio
validoentero1 si el estado es exactamente P o A; 0 si no

Orden de las filas: legajo ASC, sesion ASC. El par es unico: cada alumno tiene una sola fila por sesion. Indice: no se escribe: to_csv(index=False)

Que hacer con cada defecto

DefectoDondeAccionAdonde va
estado 'X'1 celda, L2711 en sesion_01NO NO se corrige ni se descarta: se conserva tal cual con valido = 0asistencia_larga.csv
estado 'PRESENTE' escrito completo1 celda, L2724 en sesion_03NO NO se normaliza a P. Adivinar la intencion es una decision que este ejercicio no tomaasistencia_larga.csv con valido = 0
estado 'p' en minuscula1 celda, L2717 en sesion_08NO NO se normaliza. Es el caso mas tentador y el que mejor muestra el punto: normalizar aca seria decidir por el que cargo el datoasistencia_larga.csv con valido = 0
estado '-'1 celda, L2728 en sesion_10se se conserva tal cual con valido = 0asistencia_larga.csv
celda vacia1 celda, L2703 en sesion_05se se conserva como campo vacio con valido = 0asistencia_larga.csv
Orden de comprobacion

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

  1. melt con id_vars=['legajo', 'estudiante'] y value_vars = las 12 sesiones
  2. sacarle los espacios de los extremos al estado
  3. marcar valido = 1 solo si el estado es exactamente P o A
  4. ordenar por legajo y sesion

value_vars se declara explicitamente: sin el, melt derrite TODAS las columnas que no son id_vars, y si manana el archivo trae una columna mas se cuela en el resultado. El strip va antes de comparar; la normalizacion de mayusculas NO se hace, y esa es la decision del ejercicio.

Conteos clave

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

alumnos30
sesiones12
asistencia_larga.csv360
estados P283
estados A72
validos (P o A)355
invalidos5
por motivo

Invariantes

Comprobaciones que tu resultado tiene que cumplir. Corrilas vos mismo antes de comparar los archivos:

len(largo) == 360
30 * 12 == 360
int(largo['valido'].sum()) == 355
int((largo['valido'] == 0).sum()) == 5
largo.duplicated(subset=['legajo', 'sesion']).sum() == 0
largo['legajo'].nunique() == 30
largo['sesion'].nunique() == 12
set(largo.loc[largo['valido'] == 1, 'estado']) == {'P', 'A'}
PISTASSi te trabas, abri esto
  • Declara value_vars aunque parezca redundante: es lo que hace que el resultado no dependa de que columnas traiga el archivo el mes que viene.
  • El par (legajo, sesion) tiene que ser unico en la salida: es la comprobacion de que el melt no duplico nada.
  • No normalices la 'p' minuscula. Es tentador y es exactamente lo que el ejercicio no quiere: el informe tiene que mostrar que hay 5 celdas para revisar.
  • Esta salida es la ENTRADA de EJ-6.7. Si la haces bien, el ejercicio siguiente arranca del archivo correcto.

Así tiene que quedar

asistencia_larga.csv (objetivo) · 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
Declará value_vars aunque parezca redundante

Sin él, melt derrite todas las columnas que no están en id_vars. Hoy da lo mismo; el día que el archivo traiga una columna observaciones, esa columna se convierte en una «sesión» más y el resultado pasa a tener 390 filas sin que nada avise.

Este archivo es la entrada de EJ-6.7

El ejercicio siguiente calcula el porcentaje de asistencia a partir de esta tabla, y ahí la columna valido deja de ser un detalle: define el denominador. Un alumno con una celda ilegible no tiene 12 sesiones computables, tiene 11.