Interpolación Lineal en Python
La interpolación lineal es una técnica fundamental en análisis numérico que permite estimar valores intermedios dentro de un conjunto de datos discretos. A diferencia de los métodos más complejos (splines, interpolación polinómica de alto grado), la lineal es simple, rápida y, en muchos casos, suficientemente precisa.
En este artículo encontrarás:
- Fundamentos matemáticos de la interpolación lineal.
- Implementación paso a paso en Python (sin dependencias externas y usando
numpy/scipy). - Ejemplos reales: series temporales, calibración de sensores y gráficos interactivos.
- Comparativa con otros algoritmos de interpolación.
- Buenas prácticas, optimización y troubleshooting.
1. Fundamento Matemático
Dados dos puntos conocidos \((x_0, y_0)\) y \((x_1, y_1)\) donde \(x_0 \neq x_1\), el valor estimado \(y\) para cualquier \(x\) entre ellos se calcula mediante:
y = y_0 + (y_1 - y_0) * \frac{x - x_0}{x_1 - x_0}
Esta ecuación representa la recta que pasa por los dos puntos y garantiza continuidad en \(C^0\) (valor) pero no en la derivada.
2. Implementación en Python
Hay tres enfoques habituales:
- Implementación manual (solo
math). - Uso de
numpy.interp(rápido y vectorizado). - Uso de
scipy.interpolate.interp1dpara mayor flexibilidad (permite extrapolación, diferentes estilos).
2.1 Código “desde cero”
def linear_interp(x, xp, fp):
"""Interpolación lineal sin librerías externas.
Args:
x (float or list/np.ndarray): Punto(s) a interpolar.
xp (list/np.ndarray): Coordenadas x de los datos conocidos (ordenadas).
fp (list/np.ndarray): Coordenadas y correspondientes.
Returns:
float or np.ndarray: Valor(es) interpolado(s).
"""
import bisect
import numpy as np
if np.isscalar(x):
x = [x]
result = []
for xv in x:
# Ubicar el intervalo [xp[i], xp[i+1]] que contiene xv
i = bisect.bisect_left(xp, xv) - 1
if i < 0:
i = 0
if i >= len(xp) - 1:
i = len(xp) - 2
x0, x1 = xp[i], xp[i+1]
y0, y1 = fp[i], fp[i+1]
# Fórmula de interpolación lineal
y = y0 + (y1 - y0) * (xv - x0) / (x1 - x0)
result.append(y)
return np.array(result) if len(result) > 1 else result[0]
2.2 Con numpy.interp
import numpy as np
xp = np.array([0, 2, 4, 6])
fp = np.array([0, 1, 0, 1])
x_new = np.linspace(0, 6, 13) # 0,0.5,…,6
y_new = np.interp(x_new, xp, fp)
print(y_new)
2.3 Con scipy.interpolate.interp1d
from scipy.interpolate import interp1d
import numpy as np
import matplotlib.pyplot as plt
xp = np.array([0, 1, 2, 3, 4])
fp = np.sin(xp)
# Crear la función interpoladora
f = interp1d(xp, fp, kind='linear', fill_value='extrapolate')
x_fine = np.linspace(-1, 5, 200)
y_fine = f(x_fine)
plt.figure(figsize=(8,4))
plt.plot(xp, fp, 'o', label='Datos originales')
plt.plot(x_fine, y_fine, '-', label='Interpolación lineal')
plt.legend(); plt.title('Interpolación lineal con SciPy'); plt.show()
3. Casos de Uso del Mundo Real
3.1 Calibración de sensores
Los sensores de temperatura a menudo entregan lecturas discretas (p.ej., cada 0.5°C). Cuando se necesita el valor exacto para una temperatura intermedia, la interpolación lineal permite estimar la salida del ADC con una precisión < 0.1°C sin sobrecargar el microcontrolador.
# Tabla de calibración (°C → ADC)
cal_temp = np.array([0, 10, 20, 30, 40])
cal_adc = np.array([100, 250, 400, 560, 720])
def temp_from_adc(adc):
return np.interp(adc, cal_adc, cal_temp)
3.2 Series temporales financieras
En análisis de precios de acciones, los datos pueden faltar en algunos minutos. La interpolación lineal rellena los huecos antes de aplicar indicadores técnicos.
import pandas as pd
# Simular un DataFrame con timestamps faltantes
rng = pd.date_range('2024-01-01', periods=10, freq='T')
prices = pd.Series([100, np.nan, 101, np.nan, np.nan, 103, 104, np.nan, 105, 106], index=rng)
# Rellenar con interpolación lineal
prices_filled = prices.interpolate(method='linear')
print(prices_filled)
4. Comparativa con Otros Algoritmos de Interpolación
| Método | Complejidad Computacional | Continuidad | Precisión típica | Uso recomendado |
|---|---|---|---|---|
| Interpolación lineal | O(N) | C⁰ (solo valor) | ±1–2% del rango total | Datos escasos, tiempo real, dispositivos embebidos. |
| Polinómica (Lagrange, Newton) | O(N²) para coeficientes | Cⁿ (depende del grado) | Alta en intervalos pequeños, pero sujeta a oscilaciones (Runge). | Curvas suaves con pocos puntos. |
| Spline cúbico | O(N) | C² (valor y primera derivada) | Muy alta, sin oscilaciones. | Gráficos de ingeniería, animaciones, CAD. |
| Interpolación de Kriging (Geo‑estadística) | O(N³) (matriz de covarianza) | C⁰ o C¹ según modelo | Excelente para datos espaciales. | Minería, meteorología, GIS. |
5. Buenas Prácticas, Optimización y Seguridad
- Ordenar los puntos antes de interpolar (\(x_i\) debe ser monótono).
- Validar rangos: si el punto a interpolar está fuera del dominio, decidir entre extrapolación controlada o lanzar excepción.
- Vectorizar con NumPy para grandes volúmenes (evita bucles Python).
- Precaución con datos de alta frecuencia: la interpolación lineal puede introducir artefactos de aliasing; considere un filtro previo.
- Seguridad en entornos críticos (p.ej., control de procesos): combine la interpolación con límites de tolerancia y alertas de desviación.
5.1 Profiling rápido
import numpy as np, time
xp = np.sort(np.random.rand(1_000_000))
fp = np.sin(xp)
xi = np.linspace(0,1,1_000_000)
start = time.perf_counter()
yi = np.interp(xi, xp, fp)
print('Tiempo np.interp:', time.perf_counter()-start)
En un CPU moderno, interpolar un millón de puntos con np.interp suele tardar
6. Conclusión
La interpolación lineal sigue siendo una herramienta indispensable por su simplicidad, velocidad y bajo consumo de recursos. Cuando la precisión requerida es moderada y la arquitectura del proyecto impone limitaciones de memoria o tiempo, elegir este método es la decisión más sensata. Sin embargo, es crucial reconocer sus limitaciones (continuidad de la derivada, posible sub‑/sobre‑estimación) y, en caso de requerir mayor suavidad, migrar a splines o métodos basados en kriging.
Interpolación Lineal en Python: Teoría, Implementación y Casos Prácticos