Una exportación con agujeros
El programa de reservas de la empresa exporta un año de días para que lo estudies. Algunas temperaturas están en blanco. Un día marca 99,9 grados. Un recuento de alquileres dice «unknown».
Un modelo que aprende de este archivo aprende también de sus fallos. Limpiar va primero, y suele ser la mayor parte del trabajo.
Al final de esta lección
Nota
Puedo encontrar y corregir valores ausentes y erróneos en un conjunto de datos.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Valor ausente | una celda que no tiene nada | NaN |
| Tipo de dato | la clase de valor que guarda una columna | float64 |
| Duplicado | una fila que repite otra exactamente | |
| Valor atípico | un valor muy lejos del resto | |
| Imputar | rellenar un valor ausente con una estimación razonable |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Cuatro fallos que buscar
Casi todos los datos malos tienen uno de cuatro fallos. Falta un valor. Una columna tiene el tipo de dato equivocado, y los números se guardan como texto. Una fila está duplicada. O un valor no puede ser cierto.
Cada fallo tiene una prueba rápida en pandas. Mira antes de cambiar nada.
Ejemplo resuelto: cada fallo y su prueba
| Fallo | Cómo se ve | La prueba |
|---|---|---|
| Valor ausente | NaN en una celda | messy.isna().sum() |
| Tipo de dato equivocado | object donde esperas números | messy.dtypes |
| Duplicado | más filas que días | messy.duplicated().sum() |
| Valor imposible | un máximo que no puede darse | messy["temp_c"].max() |
| Palabras que no coinciden | Sunny y sunny contadas aparte | messy["weather"].value_counts() |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Crea la copia sucia y revísala
docker exec jupyter python3 steps/messy.pySe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe esto en tu cuaderno: las repeticiones
import pandas as pd
messy = pd.read_csv("messy.csv")
# keep=False marca las dos copias de cada fila repetida.
messy[messy.duplicated(keep=False)]
Escribe esto en tu cuaderno: un valor imposible
# Un valor imposible: más de 45 grados.
messy[messy["temp_c"] > 45]
Una columna de texto esconde números
Basta una palabra en una columna de números para que pandas guarde toda la columna como texto. Su tipo pasa a object, y una media ya no funciona.
pd.to_numeric(columna, errors="coerce") convierte en número todo lo que puede. Lo que no puede leer pasa a NaN, y así lo encuentras.
Las palabras tienen la misma trampa. Para un ordenador, «Sunny » con un espacio y «SUNNY» son valores distintos.
Ordenar palabras y comprobar recuentos
# Tres maneras de escribir el mismo tiempo.
words = ["rainy", " Rainy", "RAINY "]
for word in words:
print(repr(word), "pasa a", repr(word.strip().lower()))
# ¿Es un recuento de alquileres un número entero?
for text in ["290", "-12", "n/a"]:
print(text, text.isdigit())
# Añade "4.5" a la segunda lista. ¿Qué dice isdigit?
Escribe esto en tu cuaderno: las palabras
# Quita los espacios y pasa a minúsculas antes de contar.
messy["weather"].str.strip().str.lower().value_counts()
Un error muy común
Advertencia
Mucha gente cree que todo valor atípico es un error que hay que borrar. Un valor raro puede ser cierto: el día con más alquileres, 487, es un domingo de sol de junio. Quita o sustituye un valor solo cuando no puede ser cierto, como 99,9 grados o un recuento negativo.
Borrar, corregir o imputar, y anotarlo
Para cada fallo, elige una de tres cosas. Borra la fila cuando no tiene arreglo, como un recuento «unknown». Corrige el valor cuando el bueno está claro, como «Sunny » a «sunny». Imputa el valor cuando basta una estimación, como la mediana de las temperaturas.
No toques el archivo original y limpia una copia. Así cada paso se puede revisar y repetir.
Ejemplo resuelto: los pasos en orden
| Paso | Filas que quedan | Por qué |
|---|---|---|
| Leer messy.csv | 367 | La exportación tal como llegó |
| drop_duplicates | 365 | Dos filas eran repeticiones |
| Dejar recuentos de 0 o más | 363 | «unknown» y -5 no son recuentos |
| Marcar como ausente lo que pase de 45 grados | 363 | El 99,9 se une a los ausentes |
| Rellenar con la mediana | 363 | Aquí una estimación es mejor que un hueco |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Ejecuta los pasos de limpieza
docker exec jupyter python3 steps/clean.pySe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Para ir más lejos: deja una marca
Quien lea tus datos limpios querrá saber qué cifras son reales y cuáles son estimaciones. En tu cuaderno, repite los pasos de clean.py sobre messy.csv.
Justo antes de rellenar, crea una columna nueva: clean["temp_filled"] = clean["temp_c"].isna(). Después rellena. ¿Cuántas filas quedan marcadas con True? ¿Por qué es útil esa columna para un modelo o para un informe?