¿Borro o marco un valor imposible? Cómo encontrarlo en pandas
Encuentra los kilos que no pueden ser con una regla que confirmó quien conoce los datos, márcalos para revisión y mira lo que un filtro se lleva de más.
Curso gratis. Tu Maestro, una IA, .
El inventario de kilos dijo que van de -12 a 9999. La mediana es 53. Nadie le vende -12 kilos de café a una cafetería, y 9999 kilos son casi diez toneladas en una hoja donde la venta de en medio es de 53. Algo pasó con esas dos ventas. La pregunta es qué hacer con ellas.
El primer impulso es filtrar: quedarte solo con lo razonable. Predice qué deja un filtro así.
Filtrar lo razonable
Ejemplo 1 de 2
import pandas as pd
kilos = pd.Series([40, -12, None, 9999, 53])
buenos = kilos[kilos.between(1, 500)]
print(len(kilos), len(buenos))
Adivinar está bien: se guarda tal como la escribiste para compararla. Solo tú y tu Maestro ven tus predicciones.
Ejemplo 2 de 2, se abre cuando expliques este
La regla la pone quien conoce el negocio
"Imposible" no es una opinión tuya sobre los datos. Es una regla del negocio, y como las decisiones de los huecos, se pregunta. En la historia, Marisol confirma dos cosas: una venta es de 1 a 500 kilos, y las devoluciones se capturan en otra hoja, así que un número negativo aquí no es una devolución, es un error de captura. Con eso puedes escribir la regla en código, con nombre y en un solo lugar:
KILOS_MIN = 1
KILOS_MAX = 500
kilos = ventas["kilos"]
ventas["revisar_kilos"] = kilos.notna() & ~kilos.between(KILOS_MIN, KILOS_MAX)
print(ventas["revisar_kilos"].sum())
print(ventas.loc[ventas["revisar_kilos"], ["folio", "kilos", "monto"]])En la hoja de marzo la columna nueva marca 2 ventas: V-0023 con -12 kilos y V-0045 con 9999. ¿Por qué marcar y no borrar? Porque una venta marcada todavía se puede arreglar. Mira el monto de cada una. Con los montos ya convertidos, puedes dividir monto entre kilos y ver cuánto se cobró por kilo:
- En las ventas normales, el café tostado sale entre 265 y 320 pesos por kilo, y el verde entre 95 y 120. (Hay una excepción, una captura de la V-0031 que sale en casi 3,000 pesos el kilo; esa la resuelves en el módulo 3.)
- La V-0045 cobró 12,012 pesos por 9999 kilos: 1.20 pesos el kilo. Con el monto, lo más probable es que alguien tecleó 9999 en lugar de un número mucho menor. Marisol puede buscar la nota y corregirlo.
- La V-0023 cobró 2,601 pesos por -12 kilos. El monto existe; el signo de los kilos, no.
Si las hubieras borrado, Marisol tendría dos ventas menos en el reporte, cobradas y reales, y nadie sabría que existieron. Marcadas, son dos renglones en una lista de pendientes.
Y hay un tercer caso escondido: la venta V-0012, sin kilos. Un filtro con between la habría borrado junto con las imposibles. La marca con notna() la deja fuera de la lista de imposibles porque su problema es otro: falta un dato, y ya está en tu lista de huecos.
¿Cómo pondrías una regla así para los datos de tu trabajo? Platícalo con tu Maestro.
Cuando la tabla sí necesita quedar sin esas ventas (por ejemplo, para un promedio de kilos por venta), las quitas en ese cálculo, con la marca: ventas.loc[~ventas["revisar_kilos"], "kilos"].mean(). La tabla limpia las conserva; el cálculo decide qué usa, y el reporte dice cuántas dejó fuera y por qué.
Inténtalo
En el padrón de socios, Marisol confirma que ninguna parcela de la cooperativa tiene menos de un cuarto de hectárea ni más de 20. Si no sabes cómo combinar las dos condiciones, pide una pista a tu Maestro.
Marca en una columna revisarha las hectáreas que tienen dato y están fuera de 0.25 a 20. Imprime los socios marcados. Después compara el promedio de hectáreas de los productores con y sin las marcadas. Terminaste cuando ves un solo socio marcado y los dos promedios.
Marca en una columna revisar_ha las hectáreas que tienen dato y están fuera de 0.25 a 20. Imprime los socios marcados. Después compara el promedio de hectáreas de los productores con y sin las marcadas. Terminaste cuando ves un solo socio marcado y los dos promedios.
Ejecuta tu código para ver lo que imprime y el valor de su última expresión. Cada ejecución empieza de nuevo. Ctrl+Enter ejecuta tu código. Tab agrega sangría; para salir del editor, presiona Escape y luego Tab.
Listo para ejecutar tu código.
Ejecuta tu código para ver su salida aquí.
Datos: socios-cooperativa, 30 filas
Enter guarda una celda y Escape la deja como estaba. Deja una celda vacía para un valor faltante.
| Fila | Quitar | ||||||
|---|---|---|---|---|---|---|---|
| 1 | |||||||
| 2 | |||||||
| 3 | |||||||
| 4 | |||||||
| 5 | |||||||
| 6 | |||||||
| 7 | |||||||
| 8 | |||||||
| 9 | |||||||
| 10 | |||||||
| 11 | |||||||
| 12 | |||||||
| 13 | |||||||
| 14 | |||||||
| 15 | |||||||
| 16 | |||||||
| 17 | |||||||
| 18 | |||||||
| 19 | |||||||
| 20 |
Un solo socio, José Luis Cruz Velasco con 250 hectáreas, sube el promedio de los productores de 3.06 a 12.94 hectáreas: más del cuádruple. Por eso un valor imposible se encuentra antes de calcular cualquier cosa, y por eso se marca: quizá eran 2.50 hectáreas y Marisol lo puede confirmar en una llamada.