7 oct 2026
Mercado automotriz de México con datos vivos del INEGI
Pipeline que guarda cada publicación mensual del INEGI sobre ventas, producción y exportación de vehículos ligeros como una foto inmutable, para analizar marcas, estacionalidad y tipo de cambio, y medir cómo se revisan las cifras entre publicaciones. En construcción: hoy funciona la ingesta con detección de revisiones.
Problema
Cada mes, el INEGI publica las ventas, la producción y la exportación de vehículos ligeros en México por marca y modelo. Son datos vivos: cada publicación trae el mes nuevo y además puede corregir meses anteriores. Por ejemplo, las ventas de mayo de 2025 se difundieron con 119,959 unidades y hoy aparecen con 121,110. Un análisis que solo descarga “la última versión” no ve esas correcciones y no puede explicar por qué cambió una cifra.
La pregunta del proyecto es cómo evolucionan las ventas por marca, qué tan estacionales son y cuánto las explica el tipo de cambio. El proyecto incluye un pronóstico a 3–6 meses que solo se reporta si le gana a un modelo ingenuo estacional en backtesting.
Estado
Proyecto en construcción. Esta página se actualiza en cada iteración y solo describe lo que ya se ejecutó.
| Etapa | Estado |
|---|---|
| Ingesta de cada publicación a raw como foto inmutable | Hecho |
| Detector de publicación nueva y descarga automática | Pendiente |
| Capa curated en Parquet (tipos, normalización, duplicados) | Pendiente |
| Contratos de datos que detienen un lote defectuoso | Pendiente |
| Conciliación contra la API del INEGI y tipo de cambio de Banxico | Pendiente |
| Comparación entre publicaciones (qué se revisó y por qué) | Pendiente |
| Warehouse en BigQuery y marts | Pendiente |
| Pronóstico con backtesting contra baseline | Pendiente |
| Dashboard | Pendiente |
| Ejecución programada en Google Cloud | Pendiente |
Arquitectura planeada
INEGI (4 zips mensuales) ─► raw/ (una foto por publicación) ─► curated/ (Parquet) ─► BigQuery ─► dashboard
API del INEGI + Banxico ─► conciliación y tipo de cambio ──────────┘
Hoy existe la capa raw. Cada publicación se guarda tal como llegó, en raw/raiavl/<producto>/publication_date=AAAA-MM-DD/, junto con una copia del metadato y un manifiesto. El manifiesto incluye el sha256 del zip y el de cada archivo que contiene.
Lo que ya funciona
- Ingesta de fotos: el producto y la fecha de publicación se leen del contenido del zip, no del nombre del archivo. Antes de guardar se verifica la integridad (CRC) y la estructura del zip. Ingerir las dos publicaciones reales (8 zips, 69 MB) tarda alrededor de un segundo, y la segunda ejecución no escribe nada.
- Nunca se sobrescribe una foto. Si llega otro zip con la misma fecha de publicación, se comparan los archivos por dentro:
- si es el mismo contenido con otro empaquetado, no se escribe nada y se avisa;
- si es una corrección silenciosa, la ingesta se detiene y lista los archivos que cambiaron.
- Pruebas sin red: 73 pruebas corren en GitHub Actions en cada push. Usan fixtures de 71 KB recortados de las publicaciones reales, sin cambiar ningún valor. Los fixtures incluyen a propósito los casos difíciles: claves duplicadas, correcciones negativas, una marca que cambia de nombre y la reclasificación de BMW.
Hallazgos sobre la fuente
Medidos al comparar dos publicaciones reales (septiembre y octubre de 2026). El pipeline aún no los calcula de forma automática: eso llega con el diff entre publicaciones.
- Las cifras se revisan entre publicaciones. En octubre, BMW movió unidades de “Serie 2” y “Serie 3” importados a modelos nacionales nuevos (“Serie 2-”, “Serie 3-”) desde diciembre de 2021. Por ejemplo, en agosto de 2026 la Serie 2 importada pasó de 157 a 50 unidades y aparecieron 107 en la versión nacional. El total histórico de ventas solo cambió en 1 unidad.
- La revisión de octubre tocó solo los años 2021–2026. En ventas, los archivos de 2005 a 2020 llegaron idénticos byte a byte.
- Las cifras pasan a definitivas un mes a la vez. En octubre solo septiembre de 2023 pasó de revisadas a definitivas, en los cuatro productos. La nota oficial dice que el cambio ocurre en febrero de cada año. Hipótesis por confirmar con las siguientes publicaciones: una ventana móvil de 36 meses.
- El empaquetado cambia sin aviso. Los zips de octubre llegaron sin comprimir y pesan entre 12 y 34 veces más según el producto, con las mismas columnas. Por eso la ingesta compara contenido y no solo bytes.
- Calidad de origen: claves repetidas (137 en ventas, 0.11 % de las unidades), correcciones con unidades negativas (87 filas en ventas, la mayor de −791) y marcas que cambian de nombre (JETOUR pasa a “Jetour Soueast” en marzo de 2025).
Decisiones de diseño
- Cada publicación es una foto inmutable, identificada por la fecha
modifiedde sus metadatos. El historial de revisiones solo existe desde la primera foto guardada, y no se simulan revisiones pasadas. - Se distingue un reempaquetado de una corrección real: la comparación es por archivo, así que regenerar el zip con los mismos datos no detiene el pipeline, pero una corrección silenciosa sí.
- El mismo código corre en local y en la nube: el almacenamiento tiene una interfaz común (
LocalStorage/GCSStorage). - Sin credenciales en el repositorio: los tokens del INEGI y de Banxico solo viven en variables de entorno o en Secret Manager.
Stack
Hoy: Python (biblioteca estándar), pytest, ruff, GitHub Actions. Planeado: pandas y pyarrow, SQL en BigQuery, Cloud Storage, Cloud Run Jobs, Cloud Scheduler, Terraform y un dashboard en Looker Studio.
Datos
Fuente: INEGI, Registro Administrativo de la Industria Automotriz de Vehículos Ligeros (RAIAVL), datos abiertos usados bajo los términos de libre uso del INEGI. Este proyecto es independiente: el INEGI no lo respalda ni lo revisa. Hasta ahora no se ha transformado ningún valor; los zips se guardan tal como se publicaron. El tipo de cambio vendrá del Sistema de Información Económica (SIE) de Banxico, serie SF43718.
Documentación técnica: README del repositorio y fixtures de prueba y sus casos.