Tutoriel : Utiliser des fonctions d’agrégation

Les fonctions d’agrégation vous permettent de regrouper et de combiner des données de plusieurs lignes en une valeur récapitulative. La valeur récapitulative dépend de la fonction choisie, par exemple un nombre, une valeur maximale ou une valeur moyenne.

Ce didacticiel vous montre comment effectuer les opérations suivantes :

Les exemples de ce tutoriel utilisent la StormEvents table, qui est disponible publiquement dans le cluster d’aide. Pour explorer avec vos propres données, créez votre propre cluster gratuit.

Ce didacticiel s’appuie sur les bases du premier didacticiel, Learn Common Operators.

Prérequis

  • Un compte Microsoft ou une identité d’utilisateur Microsoft Entra pour se connecter au cluster d’aide

Utiliser l’opérateur de synthèse

L’opérateur summarize est essentiel pour effectuer des agrégations sur vos données. L’opérateur summarize regroupe les lignes en fonction de la by clause, puis utilise la fonction d’agrégation fournie pour combiner chaque groupe dans une seule ligne.

Recherchez le nombre d’événements par état à l’aide summarize de la fonction d’agrégation count .

StormEvents
| summarize TotalStorms = count() by State

Sortie

State TotalStorms
TEXAS 4701
KANSAS 3166
IOWA 2337
ILLINOIS 2022
MISSOURI 2016
... ...

Visualiser les résultats de la requête

La visualisation des résultats d’une requête dans un graphique ou un graphique peut vous aider à identifier des modèles, des tendances et des valeurs hors norme dans vos données. Vous pouvez le faire avec l’opérateur render .

Tout au long du tutoriel, vous verrez des exemples d’utilisation render pour afficher vos résultats. Pour l’instant render , utilisons pour afficher les résultats de la requête précédente dans un graphique à barres.

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

Capture d’écran du graphique à barres total de tempêtes par état créé avec l’opérateur render.

Compter les lignes de manière conditionnelle

Lors de l’analyse de vos données, utilisez countif() pour compter les lignes en fonction d’une condition spécifique afin de comprendre combien de lignes répondent aux critères donnés.

La requête suivante utilise countif() pour compter les tempêtes qui ont causé des dommages. La requête utilise ensuite l’opérateur top pour filtrer les résultats et afficher les états présentant le plus grand nombre de dégâts causés aux cultures par les tempêtes.

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

Sortie

State StormsWithCropDamage
IOWA 359
NEBRASKA 201
MISSISSIPPI 105
CAROLINE DU NORD 82
MISSOURI 78

Regrouper des données dans des compartiments

Pour agréger par valeurs numériques ou temporelles, vous devez d’abord regrouper les données dans des compartiments à l’aide de la fonction bin(). L’utilisation bin() peut vous aider à comprendre comment les valeurs sont distribuées dans une certaine plage et à effectuer des comparaisons entre différentes périodes.

La requête suivante compte le nombre de tempêtes qui ont causé des dommages aux cultures pour chaque semaine en 2007. L’argument 7d représente une semaine, car la fonction nécessite une valeur d’intervalle de temps valide.

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

Sortie

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

Ajoutez | render timechart à la fin de la requête pour visualiser les résultats.

Capture d’écran du graphique des dommages aux cultures par semaine rendu par la requête précédente.

Notes

bin() est similaire à la floor() fonction dans d’autres langages de programmation. Il réduit chaque valeur au multiple le plus proche du module que vous fournissez et permet summarize d’affecter les lignes à des groupes.

Calculer les valeurs min, max, avg et sum

Pour en savoir plus sur les types de tempêtes qui causent des dommages aux cultures, calculez les dommages aux cultures min(),max() et avg() pour chaque type d’événement, puis triez le résultat en fonction des dommages moyens.

Notez que vous pouvez utiliser plusieurs fonctions d’agrégation dans un seul summarize opérateur pour produire plusieurs colonnes calculées.

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

Sortie

Type d’événement MaxCropDamage MinCropDamage AvgCropDamage
Gel/gel 568600000 3000 9106087.5954198465
Feu de forêt 21000000 10000 7268333.333333333
Sécheresse 700000000 2000 6763977.8761061952
Crue 500000000 1 000 4844925.23364486
Vent d’orage 22000000 100 920328.36538461538
... ... ... ...

Les résultats de la requête précédente indiquent que les événements de gel/gel ont causé le plus de dommages aux cultures en moyenne. Toutefois, la requête bin() a montré que les événements ayant causé des dommages aux récoltes se sont surtout produits pendant les mois d’été.

Utilisez sum() pour case activée le nombre total de cultures endommagées au lieu de la quantité d’événements qui ont causé des dommages, comme cela a été fait count() dans la requête bin() précédente.

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

Capture d’écran du graphique d’heure montrant les dommages aux cultures par semaine.

Maintenant, vous pouvez voir un pic de dommages aux récoltes en janvier, qui était probablement dû au gel/gel.

Conseil

Utilisez minif(), maxif(), avgif() et sumif() pour effectuer des agrégations conditionnelles, comme nous l’avons fait dans la section Compter conditionnellement les lignes .

Calculer des pourcentages

Le calcul des pourcentages peut vous aider à comprendre la distribution et la proportion de différentes valeurs dans vos données. Cette section décrit deux méthodes courantes de calcul des pourcentages avec le Langage de requête Kusto (KQL).

Calculer le pourcentage sur la base de deux colonnes

Utilisez count() et countif pour trouver le pourcentage d’événements de tempête qui ont causé des dommages aux cultures dans chaque état. Tout d’abord, comptez le nombre total de tempêtes dans chaque état. Ensuite, comptez le nombre de tempêtes qui ont causé des dommages aux cultures dans chaque état.

Ensuite, utilisez étendre pour calculer le pourcentage entre les deux colonnes en divisant le nombre de tempêtes ayant causé des dommages aux cultures par le nombre total d’orages et en multipliant par 100.

Pour vous assurer d’obtenir un résultat décimal, utilisez la fonction todouble() pour convertir au moins une des valeurs de nombre entier en un double avant d’effectuer la division.

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

Sortie

State TotalStormsInState StormsWithCropDamage PercentWithCropDamage
IOWA 2337 359 15.36
NEBRASKA 1766 201 11.38
MISSISSIPPI 1218 105 8.62
CAROLINE DU NORD 1721 82 4.76
MISSOURI 2016 78 3.87
... ... ... ...

Notes

Lors du calcul des pourcentages, convertissez au moins une des valeurs entières de la division avec todouble() ou toreal(). Cela garantit que vous n’obtenez pas de résultats tronqués en raison d’une division entière. Pour plus d’informations, consultez Règles de type pour les opérations arithmétiques.

Calculer le pourcentage en fonction de la taille de la table

Pour comparer le nombre d’orages par type d’événement au nombre total d’orages dans la base de données, enregistrez d’abord le nombre total d’orages dans la base de données en tant que variable. Les instructions let sont utilisées pour définir des variables au sein d’une requête.

Étant donné que les instructions d’expression tabulaire retournent des résultats tabulaires, utilisez la fonction toscalar() pour convertir le résultat tabulaire de la count() fonction en valeur scalaire. Ensuite, la valeur numérique peut être utilisée dans le calcul du pourcentage.

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

Sortie

Type d’événement EventCount Pourcentage
Vent d’orage 13015 22.034673077574237
Grêle 12711 21.519994582331627
Crue soudaine 3688 6.2438627975485055
Sécheresse 3616 6.1219652592015716
Météo hivernale 3349 5.669928554498358
... ... ...

Extraire des valeurs uniques

Utilisez make_set() pour transformer une sélection de lignes d’une table en tableau de valeurs uniques.

La requête suivante utilise make_set() pour créer un tableau des types d’événements qui provoquent des décès dans chaque état. La table résultante est ensuite triée par le nombre de types storm dans chaque tableau.

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

Sortie

State StormTypesWithDeaths
CALIFORNIE ["Vent orageux »,"High Surf »,"Cold/Wind Chill »,"Strong Wind »,"Rip Current »,"Heat »,"Excessive Heat »,"Wildfire »,"Dust Storm »,"Astronomical Low Tide »,"Dense Fog »,"Winter Weather"]
TEXAS ["Flash Flood »,"Thunderstorm Wind »,"Tornado »,"Lightning »,"Flood »,"Ice Storm »,"Winter Weather »,"Rip Current »,"Excessive Heat »,"Dense Fog »,"Hurricane (Typhon) »,"Cold/Wind Chill"]
OKLAHOMA ["Flash Flood »,"Tornado »,"Cold/Wind Chill »,"Winter Storm »,"Heavy Snow »,"Heat Excessive »,"Heat »,"Heat »,"Ice Storm »,"Winter Weather »,"Dense Fog"]
NEW YORK ["Flood »,"Lightning »,"Thunderstorm Wind »,"Flash Flood »,"Winter Weather »,"Ice Storm »,"Extreme Cold/Wind Chill »,"Winter Storm »,"Heavy Snow"]
KANSAS ["Vent orageux »,"Pluie lourde »,"Tornado »,"Flood »,"Flash Flood »,"Lightning »,"Heavy Snow »,"Winter Weather »,"Blizzard"]
... ...

Données de compartiment par condition

La fonction case() regroupe les données dans des compartiments en fonction des conditions spécifiées. La fonction retourne l’expression de résultat correspondante pour le premier prédicat satisfait, ou l’expression else finale si aucun des prédicats n’est satisfait.

Cet exemple regroupe les états en fonction du nombre de blessures causées par les tempêtes subies par leurs citoyens.

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

Sortie

State InjuriesCount BlessuresBucket
ALABAMA 494 grand
ALASKA 0 Aucune blessure
SAMOA AMÉRICAINES 0 Aucune blessure
ARIZONA 6 Petite
ARKANSAS 54 grand
ATLANTIQUE NORD 15 Moyenne
... ... ...

Créez un graphique à secteurs pour visualiser la proportion d’états ayant subi des tempêtes entraînant un grand, moyen ou petit nombre de blessures.

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 

Capture d’écran d’Azure Data Explorer graphique à secteurs de l’interface utilisateur web rendu par la requête précédente.

Effectuer des agrégations sur une fenêtre glissante

L’exemple suivant montre comment résumer des colonnes à l’aide d’une fenêtre glissante.

La requête calcule les dommages matériels minimum, maximal et moyen des tornades, des inondations et des feux de forêt à l’aide d’une fenêtre glissante de sept jours. Chaque enregistrement du jeu de résultats regroupe les sept jours précédents et les résultats contiennent un enregistrement par jour dans la période d’analyse.

Voici une explication pas à pas de la requête :

  1. Placez chaque enregistrement dans un seul jour par rapport à windowStart.
  2. Ajoutez sept jours à la valeur bin pour définir la fin de la plage pour chaque enregistrement. Si la valeur est hors de la plage de windowStart et windowEnd, ajustez la valeur en conséquence.
  3. Créez un tableau de sept jours pour chaque enregistrement, à partir du jour actuel de l’enregistrement.
  4. Développez le tableau de l’étape 3 avec mv-expand afin de dupliquer chaque enregistrement sur sept enregistrements avec des intervalles d’un jour entre eux.
  5. Effectuez les agrégations pour chaque jour. En raison de l’étape 4, cette étape résume en fait les sept jours précédents.
  6. Excluez les sept premiers jours du résultat final, car il n’y a pas de période de recherche de sept jours pour eux.
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

Sortie

Le tableau de résultats suivant est tronqué. Pour voir la sortie complète, exécutez la requête.

Timestamp Type d’événement min_DamageProperty max_DamageProperty avg_DamageProperty
2007-07-08T00 :00 :00Z Tornade 0 30000 6905
2007-07-08T00 :00 :00Z Crue 0 200000 9261
2007-07-08T00 :00 :00Z Feu de forêt 0 200000 14033
2007-07-09T00 :00 :00Z Tornade 0 100000 14783
2007-07-09T00 :00 :00Z Crue 0 200000 12529
2007-07-09T00 :00 :00Z Feu de forêt 0 200000 14033
2007-07-10T00 :00 :00Z Tornade 0 100000 31400
2007-07-10T00 :00 :00Z Crue 0 200000 12263
2007-07-10T00 :00 :00Z Feu de forêt 0 200000 11694
... ... ...

Étape suivante

Maintenant que vous êtes familiarisé avec les opérateurs de requête courants et les fonctions d’agrégation, passez au tutoriel suivant pour apprendre à joindre des données à partir de plusieurs tables.