Eduardo Anica Gonzalez
Volver a proyectos

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 modified de 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.