gpt4 book ai didi

elasticsearch - 按比例计算修整平均值

转载 作者:行者123 更新时间:2023-12-03 02:28:21 24 4
gpt4 key购买 nike

我目前有一个在Elasticsearch中包含许多数据点(数十亿个数量级)的数据集。我以Elasticsearch提供的方式(平均,中位数,百分位数等)对这些文档进行统计。

但是我现在需要Trimmed Mean计算。简而言之,这是当您订购数据时,从数据两边(高和低)中取x%并计算剩余数据点的平均值。举例来说,按5%的均值调整后的收入将消除收入最低的5%和收入最高的5%的那些,并对剩余收入值进行均值

它旨在作为一种集中趋势的度量,以减少主要异常值的影响。

但是从我看到的结果来看,Elasticsearch不支持此功能,并且我找不到很多可以做到的事情。甚至百分位数之类的事情也很难大规模实现,但是Elasticsearch的算法可以做一些估算(我认为它们是基于数据草图的,但我不确定是否在那里)。

我可以通过查询两个百分位数(x百分位数和100-x百分位数)的数据来重新创建此效果,然后执行第三个查询以过滤出这些数据点并取均值。那行得通,但是现在我要进行三个相对较长的查询,理想情况下,我希望将其与数据集来回最小化。

我说我正在使用Elasticsearch,这在解决方案方面比较可取,但实际上可以接受任何建议

最佳答案

我认为不可能一口气做到这一点,但这是我的两步走。

首先使用percentiles聚合计算修整限制。

GET billion_index/_search
{
"size": 0,
"aggs": {
"boundaries": {
"percentiles": {
"field": "price",
"percents": [
5,
95
]
}
}
}
}

需要特别注意的是,在数十亿个值的情况下,百分位数聚合将是probably be approximate和不确定的(同一查询的结果不同)。

上面的查询计算:
{
...
"hits" : {
"total" : 1558776,
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : {
"boundaries" : {
"values" : {
"5.0" : 1121.4101013907416,
"95.0" : 1148582.9150790304
}
}
}
}

将它们插入一组经过过滤的extended_stats聚合中:
GET billion_index/_search
{
"size": 0,
"aggs": {
"standard_mean": { <--- for comparison of non-trimmed
"extended_stats": {
"field": "price"
}
},
"pipelined_mean": {
"filter": {
"range": {
"price": {
"gt": 1121, <--- filter by % transformed to real vals
"lt": 1148582
}
}
},
"aggs": {
"trimmed_mean": { <--- calculate stats after having filtered
"extended_stats": {
"field": "price"
}
}
}
}
}
}

产量
{
...
"aggregations" : {
"standard_mean" : {
"count" : 1558390,
"min" : 0.0,
"max" : 8.888888888E9,
"avg" : 368803.9027932674, <--- standard mean
"sum" : 5.74740314074E11,
"sum_of_squares" : 8.645745157058162E19,
"variance" : 5.534268385940522E13,
"std_deviation" : 7439266.352228909,
"std_deviation_bounds" : {
"upper" : 1.5247336607251085E7,
"lower" : -1.450972880166455E7
}
},
"pipelined_mean" : {
"doc_count" : 1401944,
"trimmed_mean" : {
"count" : 1401944,
"min" : 1123.0,
"max" : 1148500.0,
"avg" : 246760.4101305045, <--- trimmed mean, understandably lower
"sum" : 3.4594427642E11,
"sum_of_squares" : 1.6918684996958976E17,
"variance" : 5.978947692482006E10,
"std_deviation" : 244518.86823887448,
"std_deviation_bounds" : {
"upper" : 735798.1466082535,
"lower" : -242277.32634724447
}
}
}
}
}

您可以使用 statsextended_stats,具体取决于您实际需要的信息量。

关于elasticsearch - 按比例计算修整平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60531164/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com