Volver a Proyectos
Flight Price Intelligence

Flight Price Intelligence

XGBoost + SerpAPI: compara el precio real de Google Flights con la predicción del modelo y emite una señal Compra ahora / Espera con % de confianza.

XGBoost MAE 2,088 INR · R² 0.97 — supera KNN y Regresión Lineal en la misma comparativa

Pipeline completo: Kaggle → Supabase → MLflow → FastAPI (Render) → Streamlit Cloud

Precio en tiempo real via SerpAPI (Google Flights) + señal BUY/WAIT accionable

Resumen ejecutivo

Contexto de negocio

Los precios de los vuelos cambian decenas de veces al día. Sin un punto de referencia, el viajero no sabe si el precio que ve es bueno o si conviene esperar. Se entrenó un modelo con 300k vuelos domésticos de India (Kaggle) para construir ese punto de referencia y convertirlo en una señal accionable.

Mi rol

Construí el pipeline completo: EDA en Supabase, feature engineering, tracking de 3 modelos en MLflow, exportación del mejor a joblib, FastAPI con endpoints /predict y /price_curve deployada en Render, y app Streamlit con tarjetas estilo Google Flights, gauge y curva de precios por anticipación.

Stakeholders

Viajeros domésticos (India)Agencias de viaje

Sistemas y fuentes

Ease My Trip Flight Dataset (Kaggle) — 300,261 vuelosSerpAPI — Google Flights en tiempo realSupabase — PostgreSQL (raw_flights)MLflow — experiment tracking local

Preguntas de negocio que responde

  • ¿El precio actual está por encima o por debajo del precio esperado para esta ruta?
  • ¿Cuánto conviene anticipar la compra en esta ruta? ¿7 días o 30?
  • ¿Qué aerolínea ofrece mejor relación precio/predicción en este trayecto?

Tecnologías

Python XGBoost FastAPI Streamlit MLflow Supabase SerpAPI scikit-learn Plotly Render

Por qué este proyecto

Las herramientas existentes de precios de vuelos muestran gráficos históricos pero no dan una recomendación. Este proyecto cierra esa brecha: el modelo emite una señal directa COMPRA / ESPERA — no solo un gráfico.

Selección del modelo

ModeloMAE (INR)
Linear Regression9,8420.71
KNN (k=10)4,2010.88
XGBoost2,0880.97

XGBoost fue seleccionado porque el precio de los vuelos es intrínsecamente no-lineal: la misma ruta cuesta 3× más dependiendo de la aerolínea, la clase y la anticipación de compra. Los árboles en ensemble capturan estas interacciones sin cruces manuales de features.

Decisiones técnicas clave

Endpoint /price_curve server-side — en lugar de que Streamlit llame 10 veces a /predict para construir el gráfico de ventana de compra, un único GET genera todas las predicciones del lado de la API. Un round-trip en vez de diez.

days_until_flight como proxy de anticipación — el dataset no tiene fecha de compra, solo fecha de vuelo y fecha de scraping. La diferencia se usó como proxy para la anticipación de compra. Limitación documentada honestamente en el Model Card.

Banda de tolerancia del 5% en BUY/WAIT — precios dentro del ±5% de la predicción son BUY. La confianza escala con la distancia al precio predicho: min(|diff| / 30, 1.0).

Lo que aprendí

¿Qué te pareció este proyecto?

Si tienes preguntas sobre cómo lo hice o quieres charlar sobre datos, escríbeme.