移动平均聚合
已弃用
moving_avg
聚合已被弃用,建议使用 moving_fn
聚合。
moving_avg
聚合是一个父管道聚合,它计算有序数据集中窗口(相邻子集)中包含的指标的平均值序列。
要创建 moving_avg
聚合,首先需要创建一个 histogram
或 date_histogram
聚合。然后,您可以选择性地将一个指标聚合嵌入到 histogram 聚合中。最后,将 moving_avg
聚合嵌入到 histogram 中,并将 buckets_path
参数设置为您想要跟踪的嵌入式指标。
窗口的大小是窗口中连续数据值的数量。在每次迭代中,算法会计算窗口中所有数据点的平均值,然后向前滑动一个数据值,排除前一个窗口的第一个值,并包含下一个窗口的第一个值。
例如,给定数据 [1, 5, 8, 23, 34, 28, 7, 23, 20, 19]
,窗口大小为 5 的移动平均值如下所示
(1 + 5 + 8 + 23 + 34) / 5 = 14.2
(5 + 8 + 23 + 34 + 28) / 5 = 19.6
(8 + 23 + 34 + 28 + 7) / 5 = 20
and so on ...
moving_avg
聚合通常应用于时间序列数据,以平滑噪声或短期波动,并识别趋势。指定较小的窗口大小以平滑小规模波动。指定较大的窗口大小以平滑高频波动或随机噪声,使低频趋势更明显。
有关移动平均值的更多信息,请参阅 Wikipedia。
参数
moving_avg
聚合接受以下参数。
参数 | 必需/可选 | 数据类型 | 描述 |
---|---|---|---|
buckets_path | 必需 | 字符串 | 要聚合的桶路径。请参阅 桶路径。 |
gap_policy | 可选 | 字符串 | 应用于缺失数据的策略。有效值包括 skip 和 insert_zeros 。默认值为 skip 。请参阅 数据间隙。 |
format | 可选 | 字符串 | 一个 DecimalFormat 格式化字符串。在聚合的 value_as_string 属性中返回格式化输出。 |
window | 可选 | 数值型 | 窗口中包含的数据点数量。默认值为 5 。 |
model | 可选 | 字符串 | 要使用的加权移动平均模型。选项包括 ewma 、holt 、holt_winters 、linear 和 simple 。默认值为 simple 。请参阅 模型。 |
settings | 可选 | 对象 | 调整窗口的参数。请参阅 模型。 |
predict | 可选 | 数值型 | 要附加到结果末尾的预测值数量。默认值为 0 。 |
示例
以下示例使用 OpenSearch Dashboards 日志样本数据创建了一个间隔为一个月的日期直方图。sum
子聚合计算每个月的总字节数。最后,moving_avg
聚合根据这些总和计算每月字节数的移动平均值
GET opensearch_dashboards_sample_data_logs/_search
{
"size": 0,
"aggs": {
"my_date_histogram": {
"date_histogram": {
"field": "@timestamp",
"calendar_interval": "month"
},
"aggs": {
"sum_of_bytes": {
"sum": { "field": "bytes" }
},
"moving_avg_of_sum_of_bytes": {
"moving_avg": {
"buckets_path": "sum_of_bytes"
}
}
}
}
}
}
示例响应
聚合从第二个桶开始返回 moving_avg
值。第一个桶没有移动平均值,因为没有足够的先前数据点来计算它
{
"took": 5,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 10000,
"relation": "gte"
},
"max_score": null,
"hits": []
},
"aggregations": {
"my_date_histogram": {
"buckets": [
{
"key_as_string": "2025-03-01T00:00:00.000Z",
"key": 1740787200000,
"doc_count": 480,
"sum_of_bytes": {
"value": 2804103
}
},
{
"key_as_string": "2025-04-01T00:00:00.000Z",
"key": 1743465600000,
"doc_count": 6849,
"sum_of_bytes": {
"value": 39103067
},
"moving_avg_of_sum_of_bytes": {
"value": 2804103
}
},
{
"key_as_string": "2025-05-01T00:00:00.000Z",
"key": 1746057600000,
"doc_count": 6745,
"sum_of_bytes": {
"value": 37818519
},
"moving_avg_of_sum_of_bytes": {
"value": 20953585
}
}
]
}
}
}
示例:预测
您可以使用 moving_avg
聚合来预测未来的桶。
以下示例将前一个示例的间隔缩短到一周,并在响应末尾附加五个预测的一周桶
GET opensearch_dashboards_sample_data_logs/_search
{
"size": 0,
"aggs": {
"my_date_histogram": {
"date_histogram": {
"field": "@timestamp",
"calendar_interval": "week"
},
"aggs": {
"sum_of_bytes": {
"sum": {
"field": "bytes"
}
},
"moving_avg_of_sum_of_bytes": {
"moving_avg": {
"buckets_path": "sum_of_bytes",
"predict": 5
}
}
}
}
}
}
响应包含五个预测。请注意,预测桶的 doc_count
为 0
响应
{
"took": 5,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 10000,
"relation": "gte"
},
"max_score": null,
"hits": []
},
"aggregations": {
"my_date_histogram": {
"buckets": [
{
"key_as_string": "2025-03-24T00:00:00.000Z",
"key": 1742774400000,
"doc_count": 249,
"sum_of_bytes": {
"value": 1531493
}
},
{
"key_as_string": "2025-03-31T00:00:00.000Z",
"key": 1743379200000,
"doc_count": 1617,
"sum_of_bytes": {
"value": 9213161
},
"moving_avg_of_sum_of_bytes": {
"value": 1531493
}
},
{
"key_as_string": "2025-04-07T00:00:00.000Z",
"key": 1743984000000,
"doc_count": 1610,
"sum_of_bytes": {
"value": 9188671
},
"moving_avg_of_sum_of_bytes": {
"value": 5372327
}
},
{
"key_as_string": "2025-04-14T00:00:00.000Z",
"key": 1744588800000,
"doc_count": 1610,
"sum_of_bytes": {
"value": 9244851
},
"moving_avg_of_sum_of_bytes": {
"value": 6644441.666666667
}
},
{
"key_as_string": "2025-04-21T00:00:00.000Z",
"key": 1745193600000,
"doc_count": 1609,
"sum_of_bytes": {
"value": 9061045
},
"moving_avg_of_sum_of_bytes": {
"value": 7294544
}
},
{
"key_as_string": "2025-04-28T00:00:00.000Z",
"key": 1745798400000,
"doc_count": 1554,
"sum_of_bytes": {
"value": 8713507
},
"moving_avg_of_sum_of_bytes": {
"value": 7647844.2
}
},
{
"key_as_string": "2025-05-05T00:00:00.000Z",
"key": 1746403200000,
"doc_count": 1710,
"sum_of_bytes": {
"value": 9544718
},
"moving_avg_of_sum_of_bytes": {
"value": 9084247
}
},
{
"key_as_string": "2025-05-12T00:00:00.000Z",
"key": 1747008000000,
"doc_count": 1610,
"sum_of_bytes": {
"value": 9155820
},
"moving_avg_of_sum_of_bytes": {
"value": 9150558.4
}
},
{
"key_as_string": "2025-05-19T00:00:00.000Z",
"key": 1747612800000,
"doc_count": 1610,
"sum_of_bytes": {
"value": 9025078
},
"moving_avg_of_sum_of_bytes": {
"value": 9143988.2
}
},
{
"key_as_string": "2025-05-26T00:00:00.000Z",
"key": 1748217600000,
"doc_count": 895,
"sum_of_bytes": {
"value": 5047345
},
"moving_avg_of_sum_of_bytes": {
"value": 9100033.6
}
},
{
"key_as_string": "2025-06-02T00:00:00.000Z",
"key": 1748822400000,
"doc_count": 0,
"moving_avg_of_sum_of_bytes": {
"value": 8297293.6
}
},
{
"key_as_string": "2025-06-09T00:00:00.000Z",
"key": 1749427200000,
"doc_count": 0,
"moving_avg_of_sum_of_bytes": {
"value": 8297293.6
}
},
{
"key_as_string": "2025-06-16T00:00:00.000Z",
"key": 1750032000000,
"doc_count": 0,
"moving_avg_of_sum_of_bytes": {
"value": 8297293.6
}
},
{
"key_as_string": "2025-06-23T00:00:00.000Z",
"key": 1750636800000,
"doc_count": 0,
"moving_avg_of_sum_of_bytes": {
"value": 8297293.6
}
},
{
"key_as_string": "2025-06-30T00:00:00.000Z",
"key": 1751241600000,
"doc_count": 0,
"moving_avg_of_sum_of_bytes": {
"value": 8297293.6
}
}
]
}
}
}
模型
moving_avg
聚合支持五种模型,它们在移动窗口中对值的加权方式不同。
使用 model
参数指定要使用的模型。
模型 | 模型关键词 | 加权方式 |
---|---|---|
简单 | simple | 窗口中所有值的未加权平均值。 |
线性 | linear | 使用线性权重衰减,对近期值给予更高的重要性。 |
指数加权移动平均 | ewma | 使用指数递减权重,对近期值给予更高的重要性。 |
Holt | holt | 使用第二个指数项来平滑长期趋势。 |
Holt-Winters | holt_winters | 使用第三个指数项来平滑周期性(季节性)效应。 |
使用 settings
对象设置模型的属性。下表显示了每种模型的可用设置。
模型 | 参数 | 允许的值 | 默认值 | 描述 |
---|---|---|---|---|
simple | 无 | 数值数组 | 无 | 窗口中所有值的算术平均值。 |
linear | 无 | 数值数组 | 无 | 窗口中所有值的加权平均值,其中近期值权重更高。 |
ewma | alpha | [0, 1] | 0.3 | 衰减参数。值越高,近期数据点权重越大。 |
holt | alpha | [0, 1] | 0.3 | 水平分量的衰减参数。 |
beta | [0, 1] | 0.1 | 趋势分量的衰减参数。 | |
holt_winters | alpha | [0, 1] | 0.3 | 水平分量的衰减参数。 |
beta | [0, 1] | 0.3 | 趋势分量的衰减参数。 | |
gamma | [0, 1] | 0.3 | 季节性分量的衰减参数。 | |
type | add 、mult | add | 定义季节性的建模方式:加法或乘法。 | |
period | 整数 | 1 | 构成周期的桶数量。 | |
pad | 布尔型 | true | 是否为 mult 类型模型中为 0 的值添加一个小的偏移量,以避免除以零错误。 |
有关这些模型及其参数的讨论,请参阅 Wikipedia。
示例:Holt 模型
holt
模型通过 alpha
和 beta
参数控制的指数衰减计算权重。
以下请求使用 Holt 模型计算每周总字节数据的移动平均值,其中 window
大小为 6
,alpha
值为 0.4
,beta
值为 0.2
GET opensearch_dashboards_sample_data_logs/_search
{
"size": 0,
"aggs": {
"my_date_histogram": {
"date_histogram": {
"field": "@timestamp",
"calendar_interval": "week"
},
"aggs": {
"sum_of_bytes": {
"sum": {
"field": "bytes"
}
},
"moving_avg_of_sum_of_bytes": {
"moving_avg": {
"buckets_path": "sum_of_bytes",
"window": 6,
"model": "holt",
"settings": { "alpha": 0.4, "beta": 0.2 }
}
}
}
}
}
}
移动平均值从第二个桶开始
响应
{
"took": 7,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"skipped": 0,
"failed": 0
},
"hits": {
"total": {
"value": 10000,
"relation": "gte"
},
"max_score": null,
"hits": []
},
"aggregations": {
"my_date_histogram": {
"buckets": [
{
"key_as_string": "2025-03-24T00:00:00.000Z",
"key": 1742774400000,
"doc_count": 249,
"sum_of_bytes": {
"value": 1531493
}
},
{
"key_as_string": "2025-03-31T00:00:00.000Z",
"key": 1743379200000,
"doc_count": 1617,
"sum_of_bytes": {
"value": 9213161
},
"moving_avg_of_sum_of_bytes": {
"value": 1531493
}
},
{
"key_as_string": "2025-04-07T00:00:00.000Z",
"key": 1743984000000,
"doc_count": 1610,
"sum_of_bytes": {
"value": 9188671
},
"moving_avg_of_sum_of_bytes": {
"value": 4604160.2
}
},
{
"key_as_string": "2025-04-14T00:00:00.000Z",
"key": 1744588800000,
"doc_count": 1610,
"sum_of_bytes": {
"value": 9244851
},
"moving_avg_of_sum_of_bytes": {
"value": 6806684.584000001
}
},
{
"key_as_string": "2025-04-21T00:00:00.000Z",
"key": 1745193600000,
"doc_count": 1609,
"sum_of_bytes": {
"value": 9061045
},
"moving_avg_of_sum_of_bytes": {
"value": 8341230.127680001
}
},
{
"key_as_string": "2025-04-28T00:00:00.000Z",
"key": 1745798400000,
"doc_count": 1554,
"sum_of_bytes": {
"value": 8713507
},
"moving_avg_of_sum_of_bytes": {
"value": 9260724.7236736
}
},
{
"key_as_string": "2025-05-05T00:00:00.000Z",
"key": 1746403200000,
"doc_count": 1710,
"sum_of_bytes": {
"value": 9544718
},
"moving_avg_of_sum_of_bytes": {
"value": 9657431.903375873
}
},
{
"key_as_string": "2025-05-12T00:00:00.000Z",
"key": 1747008000000,
"doc_count": 1610,
"sum_of_bytes": {
"value": 9155820
},
"moving_avg_of_sum_of_bytes": {
"value": 9173999.55240704
}
},
{
"key_as_string": "2025-05-19T00:00:00.000Z",
"key": 1747612800000,
"doc_count": 1610,
"sum_of_bytes": {
"value": 9025078
},
"moving_avg_of_sum_of_bytes": {
"value": 9172040.511275519
}
},
{
"key_as_string": "2025-05-26T00:00:00.000Z",
"key": 1748217600000,
"doc_count": 895,
"sum_of_bytes": {
"value": 5047345
},
"moving_avg_of_sum_of_bytes": {
"value": 9108804.964619776
}
}
]
}
}
}