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 :
- Utiliser l’opérateur de synthèse
- Visualiser les résultats de la requête
- Compter les lignes de manière conditionnelle
- Regrouper des données dans des compartiments
- Calculer les valeurs min, max, avg et sum
- Calculer des pourcentages
- Extraire des valeurs uniques
- Compartimenter les données par condition
- Effectuer l’agrégation sur une fenêtre glissante
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
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.
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
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
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 :
- Placez chaque enregistrement dans un seul jour par rapport à
windowStart
. - 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
etwindowEnd
, ajustez la valeur en conséquence. - Créez un tableau de sept jours pour chaque enregistrement, à partir du jour actuel de l’enregistrement.
- 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.
- 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.
- 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.
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour