Saltar al contenido

Indice / Practicas / EJ-5.6

EJ-5.6 · Deduplicar, validar rango e imputar

Los tres problemas de la unidad en un solo archivo de 50 libros: una clave repetida, valores imposibles y campos vacíos. Cada uno pide una decisión distinta, y una de las tres no es descartar.

Qué hay que hacer

A partir de libros_catalogo.csv, producir:

ELI5Explicado facil

Estás ordenando la biblioteca y encontrás tres clases de problema:

  • Dos libros distintos con el mismo código de barras. No hay forma de saber cuál es el que corresponde: los dos van al cajón de dudosos.
  • Un libro que dice haber sido publicado en 2199. Imposible: afuera.
  • Un libro sin precio. Ese sí se puede resolver: le ponés lo que cuesta un libro típico de la estantería, y anotás en la ficha que el precio lo pusiste vos.

Lo último es la parte que se olvida. Si no queda anotado, en tres meses nadie distingue el precio real del inventado.

Archivos

Las tres decisiones

Un problema, una decisión
Qué pasaQué se hacePor qué
ISBN repetido con títulos distintosDescartar las dos filasNo hay ninguna columna que diga cuál es la buena
Autor vacíoDescartarUn nombre no se puede estimar del resto del catálogo
Año 2199 · precio −5DescartarSon imposibles; el valor real se perdió
Año vacío · precio vacíoImputar y marcarloFalta el dato, pero hay una estimación defendible

Por qué acá se descartan las dos copias y en EJ-5.5 no

En EJ-5.5 el catálogo tenía una columna actualizado, y las dos filas repetidas eran la misma cosa en dos momentos: quedarse con la más reciente es una decisión que se puede defender.

Acá no hay fecha, y las dos filas del ISBN 978-1000-001 tienen títulos y autores diferentes. No son dos versiones: son dos libros a los que alguien les puso el mismo código. Elegir cualquiera de las dos sería inventar un criterio que los datos no tienen.

La misma operación, distinta política, porque los datos son distintos. Esa es la idea que vale más que la sintaxis.

Cómo saber si te salió

python comparar.py mi_unicos.csv libros_unicos.csv
python comparar.py mi_rechazados.csv libros_rechazados.csv

Antes de arrancar, mirá los datos

libros_catalogo.csv (entrada) · 50 filas, se muestran 5
isbntituloautoranioprecio
978-1000-001Algoritmos vol. 1Ximena Molina200357.24
978-8695-002Bases de datos vol. 1Guadalupe Gutiérrez201673.18
978-7073-003Redes vol. 1Nahuel Vega200747.34
978-7146-004Sistemas operativos vol. 1Olivia Ríos202536.31
978-3259-005Compiladores vol. 1Delfina Molina200681.58

El contrato de salida

libros_unicos.csv · 45 filas

ColumnaTipoQue lleva
isbntextoLa clave del libro, unica en la salida
titulotextoSin espacios en los extremos
autortextoSin espacios en los extremos. Nunca vacio
anioenteroEntre 1900 y 2026. Los ausentes vienen imputados
preciodecimalMayor que 0, redondeado a 2 decimales. Los ausentes vienen imputados
anio_imputadoentero1 si el anio lo pusimos nosotros, 0 si venia en el archivo
precio_imputadoentero1 si el precio lo pusimos nosotros, 0 si venia en el archivo

Orden de las filas: isbn ascendente. Es unico en la salida, asi que no hace falta desempate. Indice: no se escribe: to_csv(index=False)

libros_rechazados.csv · 5 filas

ColumnaTipoQue lleva
fila_origenenteroPosicion de la fila en el archivo de entrada, empezando en 0
isbn_origentextoEl ISBN de la fila descartada. NO es unico: el duplicado aparece dos veces
columnatextoEn que columna estaba el problema
valor_originaltextoEl valor tal cual venia en el archivo
motivotextoUno del vocabulario cerrado del curso

Orden de las filas: fila_origen ascendente. Es la unica columna unica de este archivo: el isbn_origen se repite. Indice: no se escribe: to_csv(index=False)

Que hacer con cada defecto

DefectoDondeAccionAdonde va
ISBN 978-1000-001 aparece dos veces, con titulo y autor DISTINTOS2 filas, la 0 y la 33descartar descartar LAS DOS. No hay ninguna columna que diga cual es la buena: son dos libros distintos con el mismo codigo, no dos versiones del mismolibros_rechazados.csv con motivo duplicado
autor vacio1 fila, la 40 (ISBN 978-6834-041)descartar. descartar. Un autor no se puede imputar: no hay de donde sacarlolibros_rechazados.csv con motivo ausente
anio = 2199, fuera del rango 1900 a 20261 fila, la 19 (ISBN 978-3226-020)descartar descartarlibros_rechazados.csv con motivo fuera_de_rango
precio = -5.0, que no puede ser1 fila, la 12 (ISBN 978-4612-013)descartar descartarlibros_rechazados.csv con motivo fuera_de_rango
anio vacio1 fila, ISBN 978-8634-027imputar imputar con la mediana entera de los anios de las filas que sobreviven (da 2011)libros_unicos.csv con anio_imputado = 1
precio vacio y precio con el token NaN2 filas, ISBN 978-2045-006 y 978-4222-048imputar imputar con la mediana de los precios de las filas que sobreviven, redondeada a 2 decimales (da 52.83)libros_unicos.csv con precio_imputado = 1
Orden de comprobacion

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

  1. ISBN repetido
  2. autor vacio
  3. anio fuera de rango
  4. precio fuera de rango

Se informa SOLO el primer motivo de la lista, para que cada fila descartada aparezca una sola vez y valga unicos + rechazados = 50. Y las imputaciones van DESPUES de toda la lista: se imputa sobre lo que quedo, no sobre lo que se va a tirar.

Conteos clave

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

filas de entrada50
libros_unicos.csv45
libros_rechazados.csv5
anios imputados1
precios imputados2
mediana de anio usada2011
mediana de precio usada52.83
por motivoduplicado: 2, fuera_de_rango: 2, ausente: 1

Invariantes

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

len(unicos) + len(rechazados) == 50
unicos['isbn'].is_unique
unicos['anio'].between(1900, 2026).all()
(unicos['precio'] > 0).all()
(unicos['autor'].str.strip() != '').all()
unicos.notna().all().all()
int(unicos['anio_imputado'].sum()) == 1
int(unicos['precio_imputado'].sum()) == 2
rechazados['fila_origen'].is_unique
int((rechazados['motivo'] == 'duplicado').sum()) == 2
PISTASSi te trabas, abri esto
  • duplicated(keep=False) marca TODAS las filas del grupo, no solo las repeticiones. Es lo que hace falta cuando se descartan todas.
  • Las dos medianas se calculan sobre las filas que sobreviven. Calculadas sobre las 50 dan 2008 y 55.04, y entonces las tres imputaciones quedan mal.
  • El autor no se imputa y el anio si. La diferencia no es tecnica: un anio faltante se estima con el resto del catalogo, un nombre no se puede inventar.
  • isbn_origen NO es unico en el archivo de rechazos: el duplicado aparece dos veces. Por eso el orden lo fija fila_origen.

Así tiene que quedar

libros_unicos.csv (objetivo) · 45 filas, se muestran 5
isbntituloautoranioprecioanio_imputadoprecio_imputado
978-1183-007Álgebra lineal vol. 1Nahuel Silva200471.9700
978-1251-028Aprendizaje automático vol. 3Javier Ibarra199963.8600
978-1309-037Álgebra lineal vol. 4Santiago Cabrera201816.1400
978-2002-019Ingeniería de software vol. 2Delfina Núñez199852.8300
978-2045-006Estadística vol. 1Horacio Sol200452.8301
libros_rechazados.csv (objetivo) · 5 filas, se muestran 5
fila_origenisbn_origencolumnavalor_originalmotivo
0978-1000-001isbn978-1000-001duplicado
12978-4612-013precio-5.0fuera_de_rango
19978-3226-020anio2199fuera_de_rango
33978-1000-001isbn978-1000-001duplicado
40978-6834-041autorvacioausente
La trampa: cuándo se calculan las medianas

Las dos medianas se sacan sobre las 45 filas que sobreviven, no sobre las 50 de entrada. Calculadas sobre el archivo entero dan 2008 y 55.04; sobre las que quedan dan 2011 y 52.83.

Los dos programas corren, ninguno da error, y las tres imputaciones quedan distintas. Imputar con un número contaminado por las filas que ya sabemos que están mal es meter el error de vuelta por la ventana.

El archivo de rechazos no se puede ordenar por ISBN

El ISBN duplicado aparece dos veces en ese archivo, así que no es una columna única y no alcanza para fijar el orden. Por eso el contrato pide fila_origen: la posición en el archivo de entrada, que sí es única y además sirve para ir a mirar la fila original.