练习 - 使用聚合函数汇总数据
我们已使用气象数据集来比较 2007 年美国各州中某些类型的风暴事件数量,并对结果进行了可视化。 在这里,你将探索其他聚合函数来描述数据。
使用 avg()
函数描绘风暴类型的特征
在最后一个单元中,你将风暴数量视为时间函数,并查看了这些风暴造成的损失。 让我们看一下有助于描述风暴本身特征的其他统计信息。
首先,你将使用 avg()
函数来计算风暴造成的平均损失(以美元为单位)。
以下查询使用 extend
运算符创建计算列以添加所有损坏值,在本例中为 DamageProperty 和 DamageCrops(以美元为单位)。 然后,查询会筛选导致损失大于零的事件。 接下来,查询汇总了每种风暴类型造成的平均损失。 最后,结果按新的平均损失列进行排序。
运行以下查询:
StormEvents | extend damage = DamageProperty + DamageCrops | where damage > 0 | summarize avg(damage) by EventType | sort by avg_damage
应获得如下图所示的结果:
运行此查询的更简洁方法是使用
avgif()
函数。 此函数与avg()
函数类似,但仅计算谓词为 true 的结果的平均值。 此函数的输入是要计算的列,以及计算值的条件。 因此,查询where damage > 0 | summarize avg(damage) by EventType
等效于summarize avgif(damage, damage > 0) by EventType
。在此过程中,让我们使用
round()
函数清理结果。 此函数将结果舍入到小数点后的指定位数。 在此示例中,你将使用默认舍入值 0。运行以下查询:
StormEvents | extend damage = DamageProperty + DamageCrops | summarize round(avgif(damage, damage > 0)) by EventType | sort by avgif_damage
应获得如下图所示的结果:
使用 min()
和 max()
查找极值
现在让我们来看看损失极值。
对于绝对最大值或最小值,使用 min()
和 max()
聚合函数。 在这些函数中,必须定义要计算最小值或最大值的列,以及要聚合数据的字段。 以下查询基于以前计算的 damage
列生成,为同一列添加 min()
和 max()
值。
运行以下查询:
StormEvents | extend damage = DamageProperty + DamageCrops | where damage > 0 | summarize MaxDamage=max(damage), MinDamage=min(damage), AverageDamage=avg(damage) by EventType | sort by MaxDamage
应获得如下图所示的结果:
查看结果。 请注意,为了使列名更好记,已将查询中的汇总列重命名为 MinDamage 和 MaxDamage。
尝试更改查询以使用
minif()
和maxif()
函数。 这些函数类似于min()
和max()
函数,但仅为谓词返回 true 的记录返回提供的表达式的最小值或最大值。 同样,可以使用sumif()
函数为谓词返回 true 的记录返回提供的表达式的总和。
使用 percentiles()
函数
到目前为止,你已计算每个事件造成的损失的最小值、最大值和平均值。 若要完成这些值的分布图,计算百分位数可能很有用。 使用 percentiles()
函数,可以定义要计算的输入数据和百分位数。 在以下示例中,你将计算每个事件类型的损失的第 5、20、50、80 和 95 个百分位值。
表示频率分布的百分位数不应与作为整体的一部分的百分比混淆。
运行以下查询:
StormEvents | extend damage = DamageProperty + DamageCrops | where damage > 0 | summarize percentiles(damage, 5, 20, 50, 80, 95) by EventType | sort by EventType asc
应获得如下图所示的结果:
查看结果。 能否确定淹没所造成损失的中值? 中值等于第 50 个百分位数。