Parte 4: Funciones, Series Temporales y Análisis Avanzado con KQL
- Ahias Portillo
- Dec 15, 2024
- 3 min read
Updated: Apr 1

Ya dominás lo básico de KQL, sabés escribir filtros, agrupar datos, unir fuentes y hasta visualizar directamente con render. Pero cuando trabajás con datos históricos, flujos en tiempo real o querés detectar anomalías o tendencias, necesitás ir más allá.
En esta cuarta entrega, nos metemos en el terreno de las series de tiempo, las funciones avanzadas, y las ventanas de análisis, que te van a permitir construir consultas verdaderamente potentes para monitoreo, predicción y análisis de comportamiento.
¿Por qué trabajar con series de tiempo en KQL?
Muchos de los datos que manejamos especialmente en sectores como finanzas, retail, IoT o seguridad son eventos ordenados cronológicamente: transacciones, precios, tasas, operaciones, lecturas, etc.
Y cuando tenés datos en secuencia temporal, podés:
Detectar anomalías (valores inesperados o picos).
Medir tendencias o patrones (subidas, bajadas, estacionalidades).
Realizar predicciones simples (proyecciones lineales).
Aplicar lógica de comparación con valores anteriores o posteriores.
Kusto está diseñado para esto. Tiene funciones nativas, altamente optimizadas, y sintaxis declarativa que te permite hacer en una línea lo que en otros motores lleva cientos.
Funciones de ventana: comparando eventos en el tiempo
Las funciones de ventana te permiten trabajar con registros “vecinos”: anteriores, siguientes, o en rangos. Muy útil para detectar diferencias, marcar outliers o crear indicadores acumulativos.
Principales funciones:
row_number() – asigna un número incremental a cada fila en una partición.
prev() y next() – permiten acceder al valor anterior o siguiente en el orden.
rank() – ordena registros dentro de un grupo.
Ejemplo: calcular la variación de saldo diaria por cliente
Esto permite ver cuánto cambia el saldo día a día, clave para detectar retiros fuertes, depósitos atípicos o errores de cálculo.
SaldosDiarios | where Fecha >= ago(30d) | sort by ClienteID, Fecha | extend SaldoAnterior = prev(Saldo) | extend Variacion = Saldo - SaldoAnterior | project Fecha, ClienteID, Saldo, SaldoAnterior, Variacion |
Creando series con make-series
Cuando querés generar una línea de tiempo agregada, make-series te permite construir series de tiempo densas, agrupadas por un intervalo fijo.
Ejemplo: volumen de transacciones en USD por día
Ideal para graficar series continuas, incluso si hay días sin datos (los llena con nulls o ceros, según configures).
Transacciones | where Moneda == "USD" | make-series MontoTotal = sum(Monto) on Fecha in range(ago(30d), now(), 1d) |
Trabajando con datos multivaluados: extend, mv-expand, mv-apply
En muchos casos, especialmente cuando hacés parsing de campos dinámicos o cargas de JSON, podés tener columnas con múltiples valores por fila. Para tratarlas:
mv-expand explota cada valor en una nueva fila.
mv-apply permite aplicar lógica a cada valor.
extend te permite transformar o desanidar columnas.
Ejemplo: analizar múltiples productos en una transacción
Esto explota el array de productos comprados y los transforma en filas, permitiendo análisis por ítem.
Transacciones | extend Productos = parse_json(ItemsComprados) | mv-expand Producto = Productos | project Fecha, ClienteID, Producto.Nombre, Producto.Valor |
Detección de anomalías con series_decompose_anomalies
Este operador te permite detectar automáticamente comportamientos atípicos en una serie de tiempo. Es uno de los superpoderes de KQL, porque te da una señal clara sobre picos, caídas o datos fuera del patrón histórico.
Ejemplo: detectar picos en transferencias diarias
Devuelve un array de flags (0/1) marcando qué puntos son considerados anómalos. Perfecto para alertas o validaciones automatizadas
Transacciones | where Tipo == "Transferencia" | make-series Total = sum(Monto) on Fecha in range(ago(30d), now(), 1d) | extend (Trend, Seasonality, Residual, Anomalies) = series_decompose_anomalies(Total) | project Fecha, Total, Anomalies |
Predicción simple con series_fit_line
Si querés hacer una proyección lineal (por ejemplo, cuánto se espera que crezca el volumen de una operación), esta función ajusta una línea de regresión sobre tu serie.
Ejemplo: proyectar el crecimiento en pagos electrónicos
Ideal para análisis de tendencias, especialmente si necesitás presentar crecimiento, desaceleración o estacionalidad en tus métricas clave.
PagosElectronicos | make-series Total = sum(Monto) on Fecha in range(ago(30d), now(), 1d) | extend (Slope, Intercept, R2, LineaAjustada) = series_fit_line(Total) | project Fecha, Total, LineaAjustada |
***Este contenido fue potenciado con IA. Porque cuando el conocimiento humano se encuentra con la inteligencia artificial, surgen mejores ideas.***
Comments