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

标签 elasticsearch statistics mean

我目前有一个在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/

相关文章:

python - 如何在 Python 中使用具有 'None' 值的 numpy?

elasticsearch - 从NEST中的索引名称推断 Elasticsearch 类型

ios - 将 Z 分数转换为百分位数( objective-c )

python - 为什么 scipy.stats.mstats.pearsonr 结果与 scipy.stats.pearsonr 不一致?

statistics - 简单的多维曲线拟合

node.js - 集合显示但文档未显示在 mongoDB 中

caching - 字段作为 Doc_Values 以减少内存使用

scala - 如何使用Scala在ElasticSearch中获取_delete_by_query api的状态

Elasticsearch:如何为多值字段编写映射?

node.js - 将 Angular 6 部署到 heroku 后出现空白页面