← Volver a Arquitectura Software · Análisis

Python · KQL

El lenguaje del análisis. Python orquesta el pipeline desde la adquisición en el CM4 hasta los modelos predictivos en la nube. KQL convierte terabytes de telemetría en respuestas de subsegundo para el portal de alertas.

Python en IN-SIGHT

Python es el lenguaje principal del stack de análisis de IN-SIGHT, presente en ambos extremos del sistema: edge y nube. Su combinación de productividad de desarrollo, ecosistema científico maduro (NumPy, SciPy, scikit-learn) y capacidad de JIT compilation (numba) lo hace viable tanto para el código embebido del CM4 como para los pipelines de análisis en Azure.

Edge — Raspberry CM4 (Python 3.11)

  • Adquisición MEMS: Lectura SPI a través de spidev a 6.667 Hz con buffer doble para evitar gaps.
  • DSP: scipy.signal para filtros IIR, ventanas Hann y FFT. Módulos críticos compilados con numba @jit para reducir latencia de 40 ms a 4 ms.
  • EKF: Implementación NumPy vectorizada del Filtro de Kalman Extendido. Matrices de estado en memoria contigua (C-order) para máxima eficiencia de caché.
  • MQTT: paho-mqtt con reconexión automática y cola persistente para resiliencia en túneles.

Cloud — Azure Functions + AKS (Python 3.12)

  • Pipeline de ingestión: Azure Functions procesan los eventos de IoT Hub, enriquecen con metadatos de flota y escriben en ADX.
  • EKF cloud: Ejecución paralela del EKF para toda la flota con Dask. Un worker por vehículo, escalado automático.
  • API del portal: FastAPI sirve los datos de alertas y tendencias al frontend del portal.
  • Modelos predictivos: scikit-learn para modelos de RUL (Random Forest, Gradient Boosting). Re-entrenamiento mensual con datos históricos de ADX.

KQL — Kusto Query Language

KQL es el lenguaje de consulta declarativo de Azure Data Explorer. Su filosofía es pipe-based: el resultado de cada operador fluye al siguiente, similar a Unix pipes pero con semántica de tablas y optimizaciones nativas para series temporales.

KQL incluye primitivas especializadas que serían complejas de implementar en SQL estándar: series_fit_line() para regresión en series, series_decompose_anomalies() para detección automática de anomalías, make_series para pivotear datos en arrays temporales densos, y funciones de correlación cruzada entre señales.

Queries clave en IN-SIGHT

// Tendencia de deterioro — últimas 4 semanas
telemetry
| where metric == "bearing_rms"
  and vehicle_id == "TMB-5042"
  and timestamp > ago(28d)
| make-series rms_avg = avg(value)
    on timestamp
    from ago(28d) to now()
    step 1h
| extend anomalies = series_decompose_anomalies(
    rms_avg, 1.5, -1, 'linefit')
| render anomalychart

// Resumen de salud de flota en tiempo real
telemetry
| where timestamp > ago(5m)
| summarize
    last_rms   = take_any(value),
    alert_count = countif(alert_level != "OK")
    by vehicle_id
| join kind=leftouter (
    vehicles | project vehicle_id, line, depot
  ) on vehicle_id
| order by alert_count desc

Alertas programadas con KQL

Azure Data Explorer permite definir scheduled queries: consultas KQL que se ejecutan automáticamente cada N minutos y pueden disparar notificaciones cuando el resultado supera un umbral. IN-SIGHT usa este mecanismo para detectar tendencias lentas que el EKF local no detectaría (el EKF es óptimo para anomalías súbitas; las tendencias graduales durante semanas requieren contexto histórico).

// Alerta de tendencia — se ejecuta cada 6 horas
telemetry
| where metric == "bearing_rms"
  and timestamp between (ago(7d) .. ago(1d))
| make-series v = avg(value)
    on timestamp step 6h
    by vehicle_id
| extend (slope, intercept, rsq) =
    series_fit_line_dynamic(v)
| where slope > 0.005    // deterioro > 0.5% RMS/hora
  and rsq > 0.7          // tendencia estadísticamente significativa
| project vehicle_id, slope, rsq