Workflow SECOP II: de la API al navegador

Workflow SECOP II: de la API al navegador A data-flow diagram generated by Archify. 01 / Fuente 02 / Pipeline Python 03 / MySQL (secop_dashboard) 04 / Dashboard PHP 05 / Navegador API Socrata · datos.gov.co · SECOP II · 01 / Fuente · jbjy-vk9h API Socrata datos.gov.co · SECOP II jbjy-vk9h Extracción · ancla fecha + descarga paginada · 02 / Pipeline Python · SoQL Extracción ancla fecha + descarga paginada SoQL Limpieza · pandas · dedupe + tipos · 02 / Pipeline Python · df limpio Limpieza pandas · dedupe + tipos df limpio Agregación · groupby día / sector / depto · 02 / Pipeline Python · pandas Agregación groupby día / sector / depto pandas contratos · detalle · PK id_contrato · 03 / MySQL (secop_dashboard) contratos detalle · PK id_contrato Tablas agregadas · agg_diario · agg_sector · agg_depto · 03 / MySQL (secop_dashboard) · 3 tablas Tablas agregadas agg_diario · agg_sector · agg_depto 3 tablas Dashboard PHP · config.php + index.php · PDO · 04 / Dashboard PHP · Apache Dashboard PHP config.php + index.php · PDO Apache Navegador · Chart.js (CDN) · 05 / Navegador Navegador Chart.js (CDN) GET jbjy-vk9h.json 2 llamadas: max(fecha) y paginado DataFrame crudo ~22,831 filas (últimos 7 días) DataFrame limpio dedupe por id_contrato TRUNCATE + INSERT SQLAlchemy · tabla detalle TRUNCATE + INSERT ×3 groupby día / sector / depto SELECT detalle últimos contratos SELECT agg_* diario, sector, depto (top 8) HTML + JSON inline Chart.js renderiza client-side Legend primary data data store data flow

Endpoint y ventana anclada a la fuente

  • • GET datos.gov.co/resource/jbjy-vk9h.json (SECOP II)
  • • 1) $select=max(fecha_de_firma) ancla la ventana a la fecha real más reciente, no a 'hoy'
  • • 2) $where + $order + $limit=5000 + $offset trae los 7 días completos (~22,831 filas)

Filtro de outliers de captura

  • • SECOP tiene contratos con dígitos de más que antes inflaban un sector a cifras absurdas
  • • $where excluye valor_del_contrato fuera de $0–$500 mil millones COP
  • • Los agregados quedan sobre datos limpios, no sobre outliers

Carga idempotente · próxima fase

  • • TRUNCATE + INSERT en cada corrida — no upsert, nunca duplica datos
  • • Hoy: Task Scheduler a las 7:00 AM; el código ya está listo para un DAG de Airflow
  • • Siguiente paso: desplegar en el VPS propio (Coolify), mismo patrón que n8n.tdtiendas.com