0Pricing
Pandas & NumPy Academy · Lección

Interpolación e imputación avanzada

Use interpolate() para realizar un relleno gradual basado en el tiempo y comprenda cuándo es adecuada la imputación mediante la media frente a la mediana.

Interpolación e imputación avanzada es una lección gratuita de Pandas & NumPy Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Pandas & NumPy Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Pandas & NumPy Academy incluye 4 lecciones en total.

Cuándo la interpolación supera a fillna()

El rellenado hacia delante y hacia atrás propaga el valor conocido más cercano sin tener en cuenta la tendencia de los datos. La interpolación estima los valores que faltan suponiendo una transición suave entre los valores conocidos; por ejemplo, si la temperatura era de 20 °C el lunes y de 30 °C el viernes, la interpolación estima 25 °C para el miércoles. Esto produce imputaciones más realistas para señales que cambian gradualmente, como datos de sensores, precios o recuentos de población.

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'day': [1, 2, 3, 4, 5],
    'temp': [20.0, np.nan, np.nan, np.nan, 30.0]
})

# Linear interpolation fills gaps smoothly
df['temp_interp'] = df['temp'].interpolate(method='linear')
print(df)
#    day  temp  temp_interp
# 0    1  20.0         20.0
# 1    2   NaN         22.5
# 2    3   NaN         25.0
# 3    4   NaN         27.5
# 4    5  30.0         30.0

Métodos de interpolate()

Pandas interpolate() admite varios métodos. Los más habituales son 'linear' (se distribuye por igual entre los valores conocidos), 'time' (tiene en cuenta los intervalos de tiempo desiguales cuando se establece un DatetimeIndex), 'polynomial' (ajusta una curva polinómica y requiere un argumento order) y 'spline' (polinomio por tramos suave). Linear es la opción predeterminada más segura; los métodos de orden superior pueden producir sobreajuste en intervalos pequeños.

import pandas as pd
import numpy as np

s = pd.Series([0, np.nan, np.nan, 8.0])

print('linear:', s.interpolate('linear').tolist())
# [0.0, 2.6666..., 5.3333..., 8.0]

print('polynomial(2):', s.interpolate('polynomial', order=2).tolist())
# [0.0, 2.222..., 5.111..., 8.0]

Interpolación time con DatetimeIndex

Cuando su Series tiene un DatetimeIndex con intervalos de tiempo desiguales (por ejemplo, solo días laborables, sin fines de semana), method='time' interpola proporcionalmente al tiempo real transcurrido, no solo según la posición. Esto es más preciso que la interpolación lineal, que trata cada fila como si estuviera equidistante, independientemente del intervalo del calendario.

import pandas as pd
import numpy as np

# Unequal gaps: Jan 1, Jan 3, Jan 10
idx = pd.to_datetime(['2024-01-01', '2024-01-03', '2024-01-10'])
s = pd.Series([100.0, np.nan, 170.0], index=idx)

# linear treats gaps as equal (position-based)
print(s.interpolate('linear').tolist())  # [100.0, 135.0, 170.0]

# time accounts for actual day count
# Jan 1 to Jan 3 = 2 days, Jan 1 to Jan 10 = 9 days
# fraction: 2/9 of the way from 100 to 170
print(s.interpolate('time').tolist())   # [100.0, 115.55..., 170.0]

Limitar el alcance de la interpolación

Al igual que ffill(), interpolate() acepta un parámetro limit para restringir cuántas posiciones NaN consecutivas se rellenan. Los valores NaN que superen el límite permanecen ausentes. Esto evita que la interpolación atraviese intervalos muy largos en los que el valor real podría ser cualquiera; los intervalos largos deben marcarse para revisarlos manualmente.

import pandas as pd
import numpy as np

s = pd.Series([1.0, np.nan, np.nan, np.nan, np.nan, 10.0])

# Only fill the first 2 NaN positions
filled = s.interpolate('linear', limit=2)
print(filled.tolist())
# [1.0, 2.8, 4.6, NaN, NaN, 10.0]

Elegir entre imputación con media o mediana

La imputación con media y mediana es sencilla, pero implica importantes compromisos. La media es sensible a los valores atípicos: unos pocos valores muy grandes la elevan, por lo que es una mala opción para rellenar una distribución sesgada hacia la derecha, como los ingresos o los precios de las viviendas. La mediana es resistente a los valores atípicos y resulta más adecuada para columnas sesgadas. Use la media únicamente cuando los datos sean aproximadamente simétricos y no contengan valores atípicos extremos.

import pandas as pd
import numpy as np

# Skewed income data with an outlier
income = pd.Series([30000, 35000, 32000, 1_000_000, np.nan])

print('Mean:  ', income.mean())    # ~274000 — pulled by outlier
print('Median:', income.median())  # ~33500 — robust choice

# Prefer median for skewed data
filled = income.fillna(income.median())
print(filled.tolist())
# [30000, 35000, 32000, 1000000, 33500.0]

Concepto de imputación KNN

La imputación por vecinos más cercanos (KNN) reemplaza un valor ausente por la media (o la media ponderada) de las k filas más similares, medida mediante la distancia entre las características no ausentes. Esta es una estrategia multivariante: utiliza información de otras columnas para determinar el valor de relleno, lo que resulta más preciso que la imputación con la media de una sola columna cuando las características están correlacionadas.

KNNImputer de Scikit-learn se integra directamente con arrays de NumPy y DataFrames de Pandas.

import pandas as pd
import numpy as np
from sklearn.impute import KNNImputer

df = pd.DataFrame({
    'age': [25, 35, np.nan, 45],
    'income': [50000, 70000, 60000, np.nan]
})

imputer = KNNImputer(n_neighbors=2)
df_imputed = pd.DataFrame(
    imputer.fit_transform(df),
    columns=df.columns
)
print(df_imputed.round(1))
#     age   income
# 0  25.0  50000.0
# 1  35.0  70000.0
# 2  30.0  60000.0   <- filled from neighbours
# 3  45.0  65000.0   <- filled from neighbours

Imputación múltiple con IterativeImputer

La imputación múltiple es el estándar de referencia para gestionar datos ausentes en la investigación estadística. IterativeImputer de Scikit-learn implementa un enfoque MICE (Multiple Imputation by Chained Equations): modela cada columna con valores ausentes como una función de las demás columnas y repite la imputación hasta que los valores convergen. Esto captura mejor las relaciones entre características que las estrategias basadas en una sola columna.

import pandas as pd
import numpy as np
from sklearn.experimental import enable_iterative_imputer  # noqa
from sklearn.impute import IterativeImputer

df = pd.DataFrame({
    'x1': [1, 2, np.nan, 4, 5],
    'x2': [2, np.nan, 6, 8, 10],
    'y':  [3, 5, 7, np.nan, 11]
})

imp = IterativeImputer(max_iter=10, random_state=0)
df_filled = pd.DataFrame(imp.fit_transform(df), columns=df.columns)
print(df_filled.round(2))

Columnas indicadoras para datos ausentes

En lugar de ocultar que un valor ha sido imputado, es recomendable añadir una columna indicadora binaria que marque qué filas tenían valores ausentes antes de la imputación. Esto permite que los modelos posteriores aprendan del propio patrón de valores ausentes; a veces, que falte un valor es tan predictivo como el valor en sí.

import pandas as pd
import numpy as np

df = pd.DataFrame({'salary': [50000, np.nan, 70000, np.nan, 90000]})

# Add indicator before filling
df['salary_was_missing'] = df['salary'].isna().astype(int)

# Then fill
df['salary'] = df['salary'].fillna(df['salary'].median())
print(df)
#    salary  salary_was_missing
# 0  50000.0                   0
# 1  70000.0                   1
# 2  70000.0                   0
# 3  70000.0                   1
# 4  90000.0                   0

Imputación y filtración de datos

Una regla fundamental en los pipelines de aprendizaje automático es calcular las estadísticas de imputación (media, mediana y moda) únicamente sobre el conjunto de entrenamiento y aplicar después esos mismos valores al conjunto de prueba. Calcular las estadísticas sobre el conjunto de datos completo antes de dividirlo provoca filtración de datos: el modelo ve indirectamente los datos de prueba durante el entrenamiento, lo que infla las estimaciones de rendimiento. Ajuste siempre los imputadores con los datos de entrenamiento y transforme tanto el conjunto de entrenamiento como el de prueba.

import pandas as pd
import numpy as np
from sklearn.impute import SimpleImputer
from sklearn.model_selection import train_test_split

df = pd.DataFrame({'feature': [1, 2, np.nan, 4, np.nan, 6, 7, 8]})
train, test = train_test_split(df, test_size=0.25, random_state=0)

# Fit ONLY on training data
imp = SimpleImputer(strategy='mean')
train['feature'] = imp.fit_transform(train[['feature']])

# Transform test using training statistics
test['feature'] = imp.transform(test[['feature']])
print('Train mean used:', imp.statistics_[0])

Comparar visualmente las estrategias de imputación

Después de aplicar varios métodos de imputación, compare su efecto representando gráficamente, uno junto a otro, la distribución de las columnas original e imputada. Una buena imputación debe conservar lo más fielmente posible la forma (media, varianza y asimetría) de la distribución original. La imputación con la media estrecha la distribución; KNN y MICE suelen conservarla mejor.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(0)
original = np.random.exponential(scale=5, size=200)
with_nan = original.copy()
with_nan[np.random.choice(200, 40, replace=False)] = np.nan

s = pd.Series(with_nan)

fig, axes = plt.subplots(1, 2, figsize=(10, 4))
s.dropna().hist(ax=axes[0], bins=20, title='Original (no NaN)')
s.fillna(s.mean()).hist(ax=axes[1], bins=20, title='Mean-imputed')
plt.tight_layout()
plt.savefig('imputation_comparison.png')
print('Saved comparison chart')

Elegir la estrategia de imputación adecuada

No existe una estrategia de imputación universalmente mejor; la elección adecuada depende del contexto. Use mean/median para casos univariantes sencillos con pocos valores ausentes. Use ffill/bfill para series temporales con tendencias estables. Use KNN o IterativeImputer cuando las características estén correlacionadas y desee aprovechar sus relaciones. Use constantes del dominio (por ejemplo, 0 para ausente o -1 para desconocido) cuando el valor que falta tenga un significado empresarial claro. Documente siempre su elección.

# Decision guide (no runnable code)
#
# Missing < 5%  AND data is MCAR?  -> Mean/median fill is fine
# Time series with stable trend?   -> ffill() with limit
# Features are correlated?         -> KNNImputer or IterativeImputer
# Categorical column?              -> Mode fill or 'Unknown' sentinel
# Going into ML model?             -> Add indicator column + fill
# Research / publication quality?  -> Multiple imputation (MICE)
print('Strategy selected based on context')

Comprobación rápida

Compruebe su comprensión de la interpolación y la imputación avanzada.

Resumen de la lección

En esta lección aprendió: interpolate() estima los valores ausentes suponiendo una tendencia suave entre los valores conocidos, method='time' gestiona intervalos desiguales en un DatetimeIndex y las estrategias avanzadas, como KNNImputer e IterativeImputer, utilizan otras columnas para determinar los valores de relleno. Añada siempre columnas indicadoras antes de la imputación y ajuste las estadísticas únicamente con el conjunto de entrenamiento para evitar la filtración de datos. A continuación, inspeccionaremos y convertiremos los tipos de datos de las columnas del DataFrame.

Preguntas frecuentes

¿La lección «Interpolación e imputación avanzada» es gratis?

Sí — el texto completo de «Interpolación e imputación avanzada» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Pandas & NumPy Academy, actualiza a CoddyKit PRO. El curso de Pandas & NumPy Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Interpolación e imputación avanzada»?

Use interpolate() para realizar un relleno gradual basado en el tiempo y comprenda cuándo es adecuada la imputación mediante la media frente a la mediana. Practicas Pandas & NumPy Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Pandas & NumPy Academy?

No se requiere experiencia previa. Pandas & NumPy Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Interpolación e imputación avanzada»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Pandas & NumPy Academy?

Sí. Cada lección de Pandas & NumPy Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Detectar valores faltantes
  2. Eliminar valores faltantes
  3. Rellenar valores faltantes
  4. Interpolación e imputación avanzada
← Volver a Pandas & NumPy Academy