Kusto - 具有缺失值的时间序列的百分位数()
Kusto - percentile() on a time series with missing values
我有点难以尝试计算时间序列中某些数据的第 95 个百分位数字,这些数据已在 24 小时内汇总到 1 分钟的分箱中,但由于某些分箱丢失在这些垃圾箱中没有数据被记录。
例如给定这个 table,它已经从原始数据汇总到 bin 中:
datatable (Timestamp: datetime, MaxRUsPerSecond: double)
[
'2020-07-06 00:01:00', 1,
'2020-07-06 00:20:00', 10
]
如果我简单地添加 | summarize percentile(MaxRUsPerSecond, 95)
它会给我值 10
这在数学上是正确的,但它忽略了 18 个丢失的每分钟样本,这些样本应该被视为零值。
实际上,我真正想要计算的结果是这样的,它给出了第 95 个百分位数 1
:
datatable (Timestamp: datetime, MaxRUsPerSecond: double)
[
'2020-07-06 00:01:00', 1,
'2020-07-06 00:02:00', 0,
'2020-07-06 00:03:00', 0,
'2020-07-06 00:04:00', 0,
'2020-07-06 00:05:00', 0,
'2020-07-06 00:06:00', 0,
'2020-07-06 00:07:00', 0,
'2020-07-06 00:08:00', 0,
'2020-07-06 00:09:00', 0,
'2020-07-06 00:10:00', 0,
'2020-07-06 00:11:00', 0,
'2020-07-06 00:12:00', 0,
'2020-07-06 00:13:00', 0,
'2020-07-06 00:14:00', 0,
'2020-07-06 00:15:00', 0,
'2020-07-06 00:16:00', 0,
'2020-07-06 00:17:00', 0,
'2020-07-06 00:18:00', 0,
'2020-07-06 00:19:00', 0,
'2020-07-06 00:20:00', 10,
]
| summarize percentile(MaxRUsPerSecond, 95)
我开始使用 percentilew
查看加权百分位数,但感觉就像是从一个兔子洞开始,试图附加一个合成箱来说明丢失的箱子,然后计算出赋予它的权重基于丢失的垃圾箱数量,所以我停了一分钟,看看是否有其他人有更好的主意。
对于上下文,我正在尝试从 CosmosDB 帐户获得每分钟的最大吞吐量 (RU/s)。这是我到目前为止的查询:
AzureDiagnostics
| where TimeGenerated >= ago(24hr)
| where Category == "DataPlaneRequests"
| summarize ConsumedRUsPerSecond = sum(todouble(requestCharge_s)) by collectionName_s, _ResourceId, bin(TimeGenerated, 1sec)
| summarize MaxRUsPerSecond = max(ConsumedRUsPerSecond) by collectionName_s, _ResourceId, bin(TimeGenerated, 1min)
基本上,将每个集合的总消耗 RU 放入 1 秒的 bin 中,然后获取每分钟的最大值。如果我能得到其中的第 95 个百分位数(不知何故包括丢失的 1 分钟箱),它会告诉我是否可以将我们的一些集合缩小到更小的吞吐量。
一般来说,您可以在数组中填充缺失值,第一个选项是使用 make-series operator and specify the 'default' argument to the value that you want to use to replace the missing values or use one of the series_fill functions such as series_fill_linear.
创建数组后,您可以使用 mv-expand 运算符扩展它们并计算百分位数。
这是一个例子:
let Start = datetime(2020-07-06 00:01:00);
let End = datetime(2020-07-06 00:21:00);
datatable (Timestamp: datetime, MaxRUsPerSecond: double)
[
datetime(2020-07-06 00:01:00), 1,
datetime(2020-07-06 00:20:00), 10
]
| make-series MaxRUsPerSecond= any(MaxRUsPerSecond) default =0 on Timestamp from Start to End step 1m
| mv-expand MaxRUsPerSecond to typeof(double), Timestamp to typeof(datetime)
| summarize percentiles(MaxRUsPerSecond, 95)
我有点难以尝试计算时间序列中某些数据的第 95 个百分位数字,这些数据已在 24 小时内汇总到 1 分钟的分箱中,但由于某些分箱丢失在这些垃圾箱中没有数据被记录。
例如给定这个 table,它已经从原始数据汇总到 bin 中:
datatable (Timestamp: datetime, MaxRUsPerSecond: double)
[
'2020-07-06 00:01:00', 1,
'2020-07-06 00:20:00', 10
]
如果我简单地添加 | summarize percentile(MaxRUsPerSecond, 95)
它会给我值 10
这在数学上是正确的,但它忽略了 18 个丢失的每分钟样本,这些样本应该被视为零值。
实际上,我真正想要计算的结果是这样的,它给出了第 95 个百分位数 1
:
datatable (Timestamp: datetime, MaxRUsPerSecond: double)
[
'2020-07-06 00:01:00', 1,
'2020-07-06 00:02:00', 0,
'2020-07-06 00:03:00', 0,
'2020-07-06 00:04:00', 0,
'2020-07-06 00:05:00', 0,
'2020-07-06 00:06:00', 0,
'2020-07-06 00:07:00', 0,
'2020-07-06 00:08:00', 0,
'2020-07-06 00:09:00', 0,
'2020-07-06 00:10:00', 0,
'2020-07-06 00:11:00', 0,
'2020-07-06 00:12:00', 0,
'2020-07-06 00:13:00', 0,
'2020-07-06 00:14:00', 0,
'2020-07-06 00:15:00', 0,
'2020-07-06 00:16:00', 0,
'2020-07-06 00:17:00', 0,
'2020-07-06 00:18:00', 0,
'2020-07-06 00:19:00', 0,
'2020-07-06 00:20:00', 10,
]
| summarize percentile(MaxRUsPerSecond, 95)
我开始使用 percentilew
查看加权百分位数,但感觉就像是从一个兔子洞开始,试图附加一个合成箱来说明丢失的箱子,然后计算出赋予它的权重基于丢失的垃圾箱数量,所以我停了一分钟,看看是否有其他人有更好的主意。
对于上下文,我正在尝试从 CosmosDB 帐户获得每分钟的最大吞吐量 (RU/s)。这是我到目前为止的查询:
AzureDiagnostics
| where TimeGenerated >= ago(24hr)
| where Category == "DataPlaneRequests"
| summarize ConsumedRUsPerSecond = sum(todouble(requestCharge_s)) by collectionName_s, _ResourceId, bin(TimeGenerated, 1sec)
| summarize MaxRUsPerSecond = max(ConsumedRUsPerSecond) by collectionName_s, _ResourceId, bin(TimeGenerated, 1min)
基本上,将每个集合的总消耗 RU 放入 1 秒的 bin 中,然后获取每分钟的最大值。如果我能得到其中的第 95 个百分位数(不知何故包括丢失的 1 分钟箱),它会告诉我是否可以将我们的一些集合缩小到更小的吞吐量。
一般来说,您可以在数组中填充缺失值,第一个选项是使用 make-series operator and specify the 'default' argument to the value that you want to use to replace the missing values or use one of the series_fill functions such as series_fill_linear.
创建数组后,您可以使用 mv-expand 运算符扩展它们并计算百分位数。
这是一个例子:
let Start = datetime(2020-07-06 00:01:00);
let End = datetime(2020-07-06 00:21:00);
datatable (Timestamp: datetime, MaxRUsPerSecond: double)
[
datetime(2020-07-06 00:01:00), 1,
datetime(2020-07-06 00:20:00), 10
]
| make-series MaxRUsPerSecond= any(MaxRUsPerSecond) default =0 on Timestamp from Start to End step 1m
| mv-expand MaxRUsPerSecond to typeof(double), Timestamp to typeof(datetime)
| summarize percentiles(MaxRUsPerSecond, 95)