En lugar de rellenar con ceros, predice el valor vacío basándote en el comportamiento de registros similares usando KNNImputer.
Instead of filling with zeros, predict missing values based on the behavior of similar records using KNNImputer.
Este ejercicio es solo para aprendizaje y pruebas. No ejecutes modelos contra datos reales, sensibles, financieros, médicos, personales o ambientes de producción sin autorización, respaldos, pruebas previas, permisos mínimos, control de cambios, revisión humana y cumplimiento de los protocolos de ciberseguridad y privacidad de tu organización.
This exercise is for learning and testing only. Do not run models against real, sensitive, financial, medical, personal, or production data without authorization, backups, prior testing, least-privilege permissions, change control, human review, and compliance with your organization's cybersecurity and privacy protocols.
Usar KNNImputer para completar valores faltantes en columnas numéricas. El algoritmo busca registros parecidos y estima el valor vacío usando vecinos cercanos, en vez de usar reglas simples como cero, promedio general o texto fijo.
Use KNNImputer to complete missing values in numeric columns. The algorithm finds similar records and estimates the missing value using nearby neighbors instead of simple rules such as zero, overall average, or fixed text.
| ID | Edad | Salario | Experiencia |
|---|---|---|---|
| 1001 | 25 | 42000 | 2 |
| 1002 | 31 | 52000 | 6 |
| 1003 | 29 | 4 | |
| 1004 | 45 | 82000 | 18 |
| 1005 | 61000 | 9 | |
| 1006 | 38 | 72000 |
from sklearn.impute import KNNImputer imputer = KNNImputer(n_neighbors=3) columnas = ['edad', 'salario', 'experiencia'] df_clean = imputer.fit_transform(df[columnas])
# ==========================================================
# Python Advanced Topic 03
# Smart Null Imputation with KNNImputer
# ==========================================================
import pandas as pd
import numpy as np
from sklearn.impute import KNNImputer
# 1. Create synthetic data with missing values
records = [
{"id": 1001, "edad": 25, "salario": 42000, "experiencia": 2},
{"id": 1002, "edad": 31, "salario": 52000, "experiencia": 6},
{"id": 1003, "edad": 29, "salario": np.nan, "experiencia": 4},
{"id": 1004, "edad": 45, "salario": 82000, "experiencia": 18},
{"id": 1005, "edad": np.nan, "salario": 61000, "experiencia": 9},
{"id": 1006, "edad": 38, "salario": 72000, "experiencia": np.nan}
]
df = pd.DataFrame(records)
# 2. Select numeric columns for imputation
columns_to_impute = ["edad", "salario", "experiencia"]
# 3. Create KNN imputer
# n_neighbors controls how many similar records are used
imputer = KNNImputer(n_neighbors=3)
# 4. Impute missing values
df_imputed_values = imputer.fit_transform(df[columns_to_impute])
# 5. Build clean dataframe
df_clean = df.copy()
df_clean[columns_to_impute] = df_imputed_values
# 6. Round values for reporting
df_clean["edad"] = df_clean["edad"].round(0).astype(int)
df_clean["salario"] = df_clean["salario"].round(2)
df_clean["experiencia"] = df_clean["experiencia"].round(1)
# 7. Add imputation flags for auditability
df_clean["edad_imputada"] = df["edad"].isna()
df_clean["salario_imputado"] = df["salario"].isna()
df_clean["experiencia_imputada"] = df["experiencia"].isna()
# 8. Export report
output_file = "knn_imputation_report.csv"
df_clean.to_csv(output_file, index=False)
print(df_clean)
print(f"
Report created: {output_file}")id edad salario experiencia edad_imputada salario_imputado experiencia_imputada 0 1001 25 42000.00 2.0 False False False 1 1002 31 52000.00 6.0 False False False 2 1003 29 55000.00 4.0 False True False 3 1004 45 82000.00 18.0 False False False 4 1005 35 61000.00 9.0 True False False 5 1006 38 72000.00 11.0 False False True Report created: knn_imputation_report.csv
| ID | Edad | Salario | Experiencia | Campo imputado |
|---|---|---|---|---|
| 1003 | 29 | 55000.00 | 4.0 | Salario |
| 1005 | 35 | 61000.00 | 9.0 | Edad |
| 1006 | 38 | 72000.00 | 11.0 | Experiencia |
Este patrón ayuda a tratar valores faltantes de forma más inteligente que rellenar con ceros. Es especialmente útil cuando los registros tienen patrones parecidos y se necesita conservar la mayor cantidad posible de información útil.
This pattern handles missing values more intelligently than filling with zeros. It is especially useful when records have similar patterns and the goal is to preserve as much useful information as possible.