序列差分聚合

编辑

序列差分是一种技术,其中时间序列中的值会在不同的时间滞后或周期内从自身中减去。例如,数据点 f(x) = f(xt) - f(xt-n),其中 n 是正在使用的周期。

周期为 1 等同于没有时间归一化的导数:它仅仅是从一个点到下一个点的变化。单个周期对于消除恒定、线性趋势很有用。

单个周期也用于将数据转换为平稳序列。在此示例中,道琼斯指数在约 250 天的时间内绘制。原始数据不是平稳的,这会使其难以使用某些技术。

通过计算一阶差分,我们可以消除数据的趋势(例如,消除恒定、线性趋势)。我们可以看到数据变成了一个平稳序列(例如,一阶差分随机分布在零附近,并且似乎没有表现出任何模式/行为)。这种转换揭示了数据集遵循随机游走;该值是前一个值 +/- 一个随机量。这种洞察力允许选择进一步的分析工具。

dow
图 11. 道琼斯指数绘制并使用一阶差分使其平稳

较大的周期可用于消除季节性/周期性行为。在此示例中,使用正弦波 + 恒定线性趋势 + 随机噪声合成生成了旅鼠种群。正弦波的周期为 30 天。

一阶差分消除了恒定的趋势,仅留下正弦波。然后将第 30 阶差分应用于一阶差分,以消除周期性行为,从而留下一个适合其他分析的平稳序列。

lemmings
图 12. 旅鼠数据绘制并使用第 1 阶和第 30 阶差分使其平稳

语法

编辑

一个 serial_diff 聚合独立看起来像这样

{
  "serial_diff": {
    "buckets_path": "the_sum",
    "lag": 7
  }
}

表 79. serial_diff 参数

参数名称 描述 必填 默认值

buckets_path

感兴趣的指标的路径(有关详细信息,请参阅 buckets_path 语法

必填

lag

要从当前值中减去的历史桶。例如,滞后为 7 将从 7 个桶之前的值中减去当前值。必须是一个正的、非零整数

可选

1

gap_policy

确定遇到数据中的间隙时应发生的情况。

可选

insert_zeros

format

输出值的 DecimalFormat 模式。如果指定,则格式化的值将返回在聚合的 value_as_string 属性中

可选

null

serial_diff 聚合必须嵌入在 histogramdate_histogram 聚合内

resp = client.search(
    size=0,
    aggs={
        "my_date_histo": {
            "date_histogram": {
                "field": "timestamp",
                "calendar_interval": "day"
            },
            "aggs": {
                "the_sum": {
                    "sum": {
                        "field": "lemmings"
                    }
                },
                "thirtieth_difference": {
                    "serial_diff": {
                        "buckets_path": "the_sum",
                        "lag": 30
                    }
                }
            }
        }
    },
)
print(resp)
response = client.search(
  body: {
    size: 0,
    aggregations: {
      my_date_histo: {
        date_histogram: {
          field: 'timestamp',
          calendar_interval: 'day'
        },
        aggregations: {
          the_sum: {
            sum: {
              field: 'lemmings'
            }
          },
          thirtieth_difference: {
            serial_diff: {
              buckets_path: 'the_sum',
              lag: 30
            }
          }
        }
      }
    }
  }
)
puts response
const response = await client.search({
  size: 0,
  aggs: {
    my_date_histo: {
      date_histogram: {
        field: "timestamp",
        calendar_interval: "day",
      },
      aggs: {
        the_sum: {
          sum: {
            field: "lemmings",
          },
        },
        thirtieth_difference: {
          serial_diff: {
            buckets_path: "the_sum",
            lag: 30,
          },
        },
      },
    },
  },
});
console.log(response);
POST /_search
{
   "size": 0,
   "aggs": {
      "my_date_histo": {                  
         "date_histogram": {
            "field": "timestamp",
            "calendar_interval": "day"
         },
         "aggs": {
            "the_sum": {
               "sum": {
                  "field": "lemmings"     
               }
            },
            "thirtieth_difference": {
               "serial_diff": {                
                  "buckets_path": "the_sum",
                  "lag" : 30
               }
            }
         }
      }
   }
}

在 “timestamp” 字段上构造一个名为 “my_date_histo” 的 date_histogram,间隔为一天

使用 sum 指标来计算字段的总和。这可以是任何指标(总和、最小值、最大值等)

最后,我们指定一个使用 “the_sum” 指标作为其输入的 serial_diff 聚合。

通过首先在字段上指定 histogramdate_histogram 来构建序列差分。然后,您可以选择在直方图内部添加普通指标,例如 sum。最后,将 serial_diff 嵌入到直方图内部。buckets_path 参数用于“指向”直方图内部的同级指标之一(有关 buckets_path 语法的描述,请参阅 buckets_path 语法)。