Compartir a través de


Tutorial: Uso de funciones de agregación

Se aplica a: ✅Microsoft FabricAzure Data Explorer✅Azure MonitorMicrosoft Sentinel

Las funciones de agregación permiten agrupar y combinar datos de varias filas en un valor de resumen. El valor de resumen depende de la función elegida, por ejemplo, un valor de recuento, máximo o promedio.

En este tutorial, aprenderá a:

En los ejemplos de este tutorial se usa la StormEvents tabla , que está disponible públicamente en el clúster de ayuda. Para explorar con sus propios datos, cree su propio clúster gratuito.

En los ejemplos de este tutorial se usa la StormEvents tabla , que está disponible públicamente en los datos de ejemplo de Análisis meteorológicos.

Este tutorial se basa en la base del primer tutorial y aprende operadores comunes.

Requisitos previos

Para ejecutar las siguientes consultas, necesita un entorno de consulta con acceso a los datos de ejemplo. Puede usar cualquiera de los siguientes medios:

  • Una cuenta microsoft o una identidad de usuario de Microsoft Entra para iniciar sesión en el clúster de ayuda

Uso del operador summarize

El operador summarize es esencial para realizar agregaciones sobre los datos. El summarize operador agrupa filas basadas en la by cláusula y, a continuación, usa la función de agregación proporcionada para combinar cada grupo en una sola fila.

Busque el número de eventos por estado mediante summarize con la función de agregación count .

StormEvents
| summarize TotalStorms = count() by State

Salida

Valor TotalStorms
TEXAS 4701
KANSAS 3166
IOWA 2337
ILLINOIS 2022
MISURI 2016
... ...

Visualización de los resultados de la consulta

Visualizar los resultados de una consulta en un gráfico o gráfico puede ayudarle a identificar patrones, tendencias y valores atípicos en los datos. Puede hacerlo con el operador render .

A lo largo del tutorial, verá ejemplos de cómo usar render para mostrar los resultados. Por ahora, vamos a usar render para ver los resultados de la consulta anterior en un gráfico de barras.

StormEvents
| summarize TotalStorms = count() by State
| render barchart

Captura de pantalla del total de tormentas por gráfico de barras de estado creado con el operador render.

Recuento condicional de filas

Al analizar los datos, use countif() para contar filas en función de una condición específica para comprender cuántas filas cumplen los criterios especificados.

La consulta siguiente usa countif() para contar las tormentas que causaron daños. A continuación, la consulta usa el top operador para filtrar los resultados y mostrar los estados con la mayor cantidad de daños causados por tormentas.

StormEvents
| summarize StormsWithCropDamage = countif(DamageCrops > 0) by State
| top 5 by StormsWithCropDamage

Salida

Valor StormsWithCropDamage
IOWA 359
NEBRASKA 201
MISISIPÍ 105
CAROLINA DEL NORTE 82
MISURI 78

Agrupar datos en contenedores

Para agregar por valores numéricos o de hora, primero querrá agrupar los datos en contenedores mediante la función bin(). El uso bin() de puede ayudarle a comprender cómo se distribuyen los valores dentro de un intervalo determinado y realizar comparaciones entre distintos períodos.

En la consulta siguiente se cuenta el número de tormentas que causaron daños en el cultivo por cada semana en 2007. El 7d argumento representa una semana, ya que la función requiere un valor de intervalo de tiempo válido.

StormEvents
| where StartTime between (datetime(2007-01-01) .. datetime(2007-12-31)) 
    and DamageCrops > 0
| summarize EventCount = count() by bin(StartTime, 7d)

Salida

StartTime EventCount
2007-01-01T00:00:00Z 16
2007-01-08T00:00:00Z 20
2007-01-29T00:00:00Z 8
2007-02-05T00:00:00Z 1
2007-02-12T00:00:00Z 3
... ...

Agregue | render timechart al final de la consulta para visualizar los resultados.

Captura de pantalla del gráfico de daños de recorte por semana representado por la consulta anterior.

Nota:

bin() es similar a la floor() función en otros lenguajes de programación. Reduce cada valor al múltiplo más cercano del módulo que se proporciona y permite summarize asignar las filas a los grupos.

Calcular el mínimo, máximo, promedio y suma

Para obtener más información sobre los tipos de tormentas que causan daños en el cultivo, calcule el daño mínimo(), max()y avg() para cada tipo de evento y, a continuación, ordene el resultado por el daño medio.

Tenga en cuenta que puede usar varias funciones de agregación en un único summarize operador para generar varias columnas calculadas.

StormEvents
| where DamageCrops > 0
| summarize
    MaxCropDamage=max(DamageCrops), 
    MinCropDamage=min(DamageCrops), 
    AvgCropDamage=avg(DamageCrops)
    by EventType
| sort by AvgCropDamage

Salida

EventType MaxCropDamage MinCropDamage AvgCropDamage
Helada/Congelación 568600000 3000 9106087.5954198465
Wildfire 21000000 10 000 7268333.333333333
Sequía 700 000 000 2000 6763977.8761061952
Inundación 500000000 1 000 4844925.23364486
Viento de tormenta 22000000 100 920328.36538461538
... ... ... ...

Los resultados de la consulta anterior indican que los eventos Frost/Freeze provocaron el mayor daño en el cultivo en promedio. Sin embargo, la consulta bin() mostró que los eventos con daños en el cultivo tuvieron lugar principalmente en los meses de verano.

Use sum() para comprobar el número total de cultivos dañados en lugar de la cantidad de eventos que causaron algún daño, como se hizo con count() en la consulta bin() anterior.

StormEvents
| where StartTime between (datetime(2007-01-01) .. datetime(2007-12-31)) 
    and DamageCrops > 0
| summarize CropDamage = sum(DamageCrops) by bin(StartTime, 7d)
| render timechart

Captura de pantalla del gráfico de tiempo que muestra el daño de recorte por semana.

Ahora puede ver un pico en los daños en el cultivo en enero, que probablemente se debió a Frost/Freeze.

Sugerencia

Use minif(), maxif(), avgif()y sumif() para realizar agregaciones condicionales, como hicimos cuando se encuentra en la sección de filas de recuento condicional.

Cálculo de porcentajes

El cálculo de porcentajes puede ayudarle a comprender la distribución y proporción de valores diferentes dentro de los datos. En esta sección se tratan dos métodos comunes para calcular porcentajes con el Lenguaje de consulta Kusto (KQL).

Cálculo del porcentaje basado en dos columnas

Use count() y countif para encontrar el porcentaje de eventos de tormenta que causaron daños en el cultivo en cada estado. En primer lugar, cuente el número total de tormentas en cada estado. A continuación, cuente el número de tormentas que causaron daños en el cultivo en cada estado.

Después, use extend para calcular el porcentaje entre las dos columnas dividiendo el número de tormentas con daño de cultivo por el número total de tormentas y multiplicando por 100.

Para asegurarse de obtener un resultado decimal, use la función todouble() para convertir al menos uno de los valores de recuento de enteros en un doble antes de realizar la división.

StormEvents
| summarize 
    TotalStormsInState = count(),
    StormsWithCropDamage = countif(DamageCrops > 0)
    by State
| extend PercentWithCropDamage = 
    round((todouble(StormsWithCropDamage) / TotalStormsInState * 100), 2)
| sort by StormsWithCropDamage

Salida

Valor TotalStormsInState StormsWithCropDamage PercentWithCropDamage
IOWA 2337 359 15.36
NEBRASKA 1766 201 11.38
MISISIPÍ 1218 105 8,62
CAROLINA DEL NORTE 1721 82 4.76
MISURI 2016 78 3,87
... ... ... ...

Nota:

Al calcular porcentajes, convierta al menos uno de los valores enteros de la división con todouble() o toreal().. Esto garantizará que no se truncan los resultados debido a la división de enteros. Para obtener más información, consulte Reglas de tipo para operaciones aritméticas.

Cálculo del porcentaje en función del tamaño de tabla

Para comparar el número de tormentas por tipo de evento con el número total de tormentas de la base de datos, guarde primero el número total de tormentas en la base de datos como una variable. Las instrucciones Let se usan para definir variables dentro de una consulta.

Dado que las instrucciones de expresión tabular devuelven resultados tabulares, use la función toscalar() para convertir el resultado tabular de la count() función en un valor escalar. A continuación, el valor numérico se puede usar en el cálculo de porcentaje.

let TotalStorms = toscalar(StormEvents | summarize count());
StormEvents
| summarize EventCount = count() by EventType
| project EventType, EventCount, Percentage = todouble(EventCount) / TotalStorms * 100.0

Salida

EventType EventCount Percentage
Viento de tormenta 13015 22.034673077574237
Granizo 12711 21.519994582331627
Riada 3688 6.2438627975485055
Sequía 3616 6.1219652592015716
Clima de invierno 3349 5.669928554498358
... ... ...

Extracción de valores únicos

Use make_set() para convertir una selección de filas de una tabla en una matriz de valores únicos.

La consulta siguiente usa make_set() para crear una matriz de los tipos de eventos que provocan muertes en cada estado. A continuación, la tabla resultante se ordena por el número de tipos de storm en cada matriz.

StormEvents
| where DeathsDirect > 0 or DeathsIndirect > 0
| summarize StormTypesWithDeaths = make_set(EventType) by State
| project State, StormTypesWithDeaths
| sort by array_length(StormTypesWithDeaths)

Salida

Valor StormTypesWithDeaths
CALIFORNIA ["Viento de tormenta","Alta surf","Frío/Frío","Viento fuerte","Corriente de rasgar","Calor","Calor excesivo","Fuego","Tormenta de polvo","Marea baja astronómica","Niebla densa","Clima de invierno"]
TEXAS ["Flash Flood","Thunderstorm Wind","Tornado","Lightning","Flood","Ice Storm","Winter Weather","Rip Current","Excessive Heat","Dense Fog","Hurricane (Tifón)","Cold/Wind Chill"]
OKLAHOMA ["Flash Flood","Tornado","Cold/Wind Chill","Winter Storm","Heavy Snow","Excessive Heat","Heat","Ice Storm","Winter Weather","Dense Fog"]
NUEVA YORK ["Flood","Lightning","Thunderstorm Wind","Flash Flood","Winter Weather","Ice Storm","Extreme Cold/Wind Chill","Winter Storm","Heavy Snow"]
KANSAS ["Viento de tormenta","Lluvia intensa","Tornado","Inundación","Inundación flash","Rayo","Nieve pesada","Clima de invierno","Blizzard"]
... ...

Cubo de datos por condición

La función case() agrupa los datos en cubos en función de las condiciones especificadas. La función devuelve la expresión de resultado correspondiente para el primer predicado satisfecho o la expresión final si no se cumple ninguno de los predicados.

En este ejemplo se agrupan estados basados en el número de lesiones relacionadas con tormentas que sus ciudadanos han sufrido.

StormEvents
| summarize InjuriesCount = sum(InjuriesDirect) by State
| extend InjuriesBucket = case (
                              InjuriesCount > 50,
                              "Large",
                              InjuriesCount > 10,
                              "Medium",
                              InjuriesCount > 0,
                              "Small",
                              "No injuries"
                          )
| sort by State asc

Salida

Valor InjuriesCount LesionesBucket
ALABAMA 494 Grande
ALASKA 0 Sin lesiones
AMERICAN SAMOA 0 Sin lesiones
ARIZONA 6 Pequeño
ARKANSAS 54 Grande
ATLANTIC NORTH 15 Media
... ... ...

Cree un gráfico circular para visualizar la proporción de estados que experimentaron tormentas, lo que da lugar a un número grande, mediano o pequeño de lesiones.

StormEvents
| summarize InjuriesCount = sum(InjuriesDirect) by State
| extend InjuriesBucket = case (
                              InjuriesCount > 50,
                              "Large",
                              InjuriesCount > 10,
                              "Medium",
                              InjuriesCount > 0,
                              "Small",
                              "No injuries"
                          )
| summarize InjuryBucketByState=count() by InjuriesBucket
| render piechart 

Captura de pantalla del gráfico circular de la interfaz de usuario web representado por la consulta anterior.

Agregaciones en una ventana deslizante

En el ejemplo siguiente se muestra cómo resumir columnas mediante una ventana deslizante.

La consulta calcula los daños mínimos, máximos y medios de propiedad de tornados, inundaciones y incendios forestales utilizando una ventana deslizante de siete días. Cada registro del conjunto de resultados agrega los siete días anteriores, y los resultados contienen un registro por día en el período de análisis.

Esta es una explicación paso a paso de la consulta:

  1. Bin cada registro en un solo día en relación con windowStart.
  2. Agregue siete días al valor bin para establecer el final del intervalo para cada registro. Si el valor está fuera del intervalo de windowStart y windowEnd, ajuste el valor en consecuencia.
  3. Cree una matriz de siete días para cada registro, empezando por el día actual del registro.
  4. Expanda la matriz del paso 3 con mv-expand para duplicar cada registro a siete registros con intervalos de un día entre ellos.
  5. Realice las agregaciones para cada día. Debido al paso 4, este paso resume realmente los siete días anteriores.
  6. Excluya los primeros siete días del resultado final porque no hay ningún período de devolución de siete días para ellos.
let windowStart = datetime(2007-07-01);
let windowEnd = windowStart + 13d;
StormEvents
| where EventType in ("Tornado", "Flood", "Wildfire") 
| extend bin = bin_at(startofday(StartTime), 1d, windowStart) // 1
| extend endRange = iff(bin + 7d > windowEnd, windowEnd, 
                      iff(bin + 7d - 1d < windowStart, windowStart, 
                        iff(bin + 7d - 1d < bin, bin, bin + 7d - 1d))) // 2
| extend range = range(bin, endRange, 1d) // 3
| mv-expand range to typeof(datetime) // 4
| summarize min(DamageProperty), max(DamageProperty), round(avg(DamageProperty)) by Timestamp=bin_at(range, 1d, windowStart), EventType // 5
| where Timestamp >= windowStart + 7d; // 6

Salida

La tabla de resultados siguiente se trunca. Para ver la salida completa, ejecute la consulta.

Marca de tiempo EventType min_DamageProperty max_DamageProperty avg_DamageProperty
2007-07-08T00:00:00Z Tornado 0 30000 6905
2007-07-08T00:00:00Z Inundación 0 200000 9261
2007-07-08T00:00:00Z Wildfire 0 200000 14033
2007-07-09T00:00:00Z Tornado 0 100000 14783
2007-07-09T00:00:00Z Inundación 0 200000 12529
2007-07-09T00:00:00Z Wildfire 0 200000 14033
2007-07-10T00:00:00Z Tornado 0 100000 31400
2007-07-10T00:00:00Z Inundación 0 200000 12,263
2007-07-10T00:00:00Z Wildfire 0 200000 11694
... ... ...

Paso siguiente

Ahora que está familiarizado con los operadores de consulta comunes y las funciones de agregación, vaya al siguiente tutorial para aprender a combinar datos de varias tablas.