时间序列

本用户指南部分概述了流表达式和数学表达式中提供的一些时间序列功能。

时间序列聚合

timeseries 函数利用 Solr 的内置分面和日期数学功能执行快速分布式时间序列聚合。

以下示例对每日股票价格数据集合执行每月时间序列聚合。在此示例中,计算股票代码 AMZN 在特定日期范围内的平均月度收盘价。

timeseries(stocks,
           q=ticker_s:amzn,
           field="date_dt",
           start="2010-01-01T00:00:00Z",
           end="2017-11-01T00:00:00Z",
           gap="+1MONTH",
           format="YYYY-MM",
           avg(close_d))

将此表达式发送到 /stream 处理程序时,它会响应

{
  "result-set": {
    "docs": [
      {
        "date_dt": "2010-01",
        "avg(close_d)": 127.42315789473685
      },
      {
        "date_dt": "2010-02",
        "avg(close_d)": 118.02105263157895
      },
      {
        "date_dt": "2010-03",
        "avg(close_d)": 130.89739130434782
      },
      {
        "date_dt": "2010-04",
        "avg(close_d)": 141.07
      },
      {
        "date_dt": "2010-05",
        "avg(close_d)": 127.606
      },
      {
        "date_dt": "2010-06",
        "avg(close_d)": 121.66681818181816
      },
      {
        "date_dt": "2010-07",
        "avg(close_d)": 117.5190476190476
      }
]}}

使用 Zeppelin-Solr,可以使用折线图可视化此时间序列。

timeseries1

矢量化时间序列

在对时间序列进行平滑或建模之前,需要对数据进行矢量化。col 函数可用于将元组列表中的一列数据复制到数组中。

以下表达式演示了 date_dtavg(close_d) 字段的矢量化。然后使用 zplot 函数在 x 轴上绘制月份,在 y 轴上绘制平均收盘价。

timeseries2

平滑

时间序列平滑通常用于去除时间序列中的噪声并帮助发现潜在趋势。数学表达式库有三种用于时间序列平滑的滑动窗口方法。这些方法使用滑动数据窗口中的汇总值来计算一组新的平滑数据点。

这三个滑动窗口函数是滞后指标,这意味着它们在趋势影响滑动窗口的汇总值之前不会开始朝趋势方向移动。由于这种滞后特性,这些平滑函数通常用于确认趋势的方向。

移动平均

movingAvg 函数计算滑动数据窗口上的简单移动平均。以下示例生成时间序列,对 avg(close_d) 字段进行矢量化,并计算窗口大小为 5 的移动平均。

移动平均函数返回一个比原始向量长度更短的数组。这是因为仅当有完整的数据窗口可用于计算平均值时才会生成结果。对于窗口大小为 5,移动平均将在第 5 个值处开始生成结果。先前值不包含在结果中。

然后使用 zplot 函数在 x 轴上绘制月份,在 y 轴上绘制平均收盘价和移动平均。请注意,ltrim 函数用于从 x 轴和平均收盘价中去掉前 4 个值。这样做是为了使三个数组对齐,以便它们从第 5 个值开始。

movingavg

指数移动平均

expMovingAvg 函数使用不同的公式来计算移动平均,该公式对基础数据中的变化响应更快。这意味着它比简单移动平均更少地成为滞后指标。

下面是一个计算移动平均和指数移动平均并将其与原始 y 值一起绘制的示例。请注意,指数移动平均对 y 值的变化更敏感。

expmoving

移动中位数

movingMedian 函数使用滑动窗口的中值,而不是平均值。在许多情况下,移动中值比移动平均值对异常值更稳健

下面是一个计算移动中值的示例

movingMedian

差分

差分可用于通过从序列中移除趋势或季节性来使时间序列平稳。

一阶差分

差分中使用的技术是使用值之间的差值,而不是原始值。一阶差分获取值与紧接其前一个值之间的差值。一阶差分通常用于从时间序列中移除趋势。

以下示例使用一阶差分使两个时间序列平稳,以便在不考虑趋势的情况下对其进行比较。

在此示例中,我们将比较两家股票(亚马逊和谷歌)的月度平均收盘价。下图绘制了应用差分之前的两个时间序列。

timecompare

在下一个示例中,diff 函数应用于 zplot 函数内的两个时间序列。diff 可应用于 zplot 函数内,或像 let 函数内的任何其他函数一样。

请注意,两个时间序列现在都已移除趋势,并且可以在不受趋势影响的情况下研究股票价格的月度变动。

diff1

在下一个示例中,时间序列可视化的 zoom 函数用于放大特定月份范围。这允许更仔细地检查数据。通过更仔细地检查数据,似乎两家股票的月度变动之间存在一些相关性。

diffzoom

在最后一个示例中,差分时间序列与 corr 函数相关。

diffcorr

滞后差分

diff 函数有一个可选的第二个参数,用于指定差分中的滞后。如果指定了滞后,则差值取自一个值与其过去指定滞后值处的那个值之间的差值。滞后差分通常用于从时间序列中移除季节性。

以下简单示例演示了滞后差分的工作原理。请注意,示例中的数组遵循一个简单的重复模式。这种类型的模式通常会显示出季节性。

season

在此示例中,我们使用滞后 4 的diff函数移除此模式。这将减去当前索引后滞后四个索引的值。请注意,结果集大小是原始数组大小减去滞后。这是因为diff函数仅为可以计算滞后 4 的值返回结果。

seasondiff

异常检测

movingMAD(移动平均绝对偏差)函数可用于通过测量滑动窗口中的离散度(与平均值的偏差)来显示时间序列中的异常。

movingMAD函数的工作方式与移动平均类似,除了它测量窗口内的平均绝对偏差而不是平均值。通过寻找异常高或低的离散度,我们可以找到时间序列中的异常。

对于此示例,我们将使用亚马逊两年期间的每日股票价格。每日股票数据将提供更大的数据集进行研究。

在下面的示例中,search表达式用于返回两年期间股票代码AMZN的每日收盘价。

anomaly

下一步是将movingMAD函数应用于数据,以计算 10 天窗口内的移动平均绝对偏差。以下示例显示了该函数的应用和可视化。

mad

计算出移动 MAD 后,我们可以使用empiricalDistribution函数可视化离散度的分布。以下示例使用 10 个箱绘制经验分布,创建时间序列离散度的 10 个箱直方图。

此可视化显示,大多数平均绝对偏差介于 0 和 9.2 之间,最后一个箱的平均值为 11.94。

maddist

最后一步是使用outliers函数检测序列中的异常值。outliers函数使用概率分布来查找数字向量中的异常值。outliers函数采用四个参数

  • 概率分布

  • 数字向量

  • 低概率阈值

  • 高概率阈值

  • 数字向量从中选择的列表

outliers 函数迭代数字向量,并使用概率分布来计算每个值的累积概率。如果累积概率低于低概率阈值或高于高阈值,则它会将该值视为异常值。当 outliers 函数遇到异常值时,它会从第五个参数提供的结果列表中返回相应的结果。它还包括累积概率和异常值。

以下示例显示了应用于亚马逊股票价格数据集的 outliers 函数。移动平均绝对偏差的经验分布是第一个参数。包含移动平均绝对偏差的向量是第二个参数。-1 是低概率阈值,.99 是高概率阈值。-1 表示不会考虑低异常值。最后一个参数是包含 close_ddate_dt 字段的原始结果集。

outliers 函数的输出包含检测到异常值的结果。在这种情况下,检测到 5 个高于 .99 概率阈值的结果。

outliers

建模

Solr 中支持的数学表达式包括许多可用于对时间序列进行建模的函数。这些函数包括线性回归、多项式和谐波曲线拟合、loess 回归和 KNN 回归。

这些函数中的每一个都可以对时间序列进行建模,并用于插值(预测数据集中的值),其中几个可用于外推(预测数据集之外的值)。

用户指南的线性回归、曲线拟合和机器学习部分详细介绍了各种回归函数。

以下示例使用 polyfit 函数(多项式回归)为时间序列拟合非线性模型。所使用的数据集是亚马逊在八年期间的月平均收盘价。

在此示例中,polyfit 函数使用 4 次多项式为 y 轴(即平均月收盘价)返回拟合模型。多项式的次数决定模型中的曲线数量。拟合模型设置为变量 y1。然后使用 zplot 直接绘制拟合模型以及原始 y 值。

可视化显示了通过平均收盘价数据拟合的平滑曲线。

timemodel

预测

polyfit 函数还可用于外推时间序列以预测未来的股票价格。以下示例演示了 10 个月的预测。

在示例中,polyfit 函数为 y 轴拟合一个模型,并且该模型被设置为变量 m。然后,为了创建预测,将 10 个零追加到 y 轴以创建名为 y10 的新向量。然后,使用 natural 函数创建一个新 x 轴,该函数返回从 0 到 y10 长度的全数字序列。新 x 轴存储在变量 x10 中。

predict 函数使用拟合模型来预测存储在变量 x10 中的新 x 轴的值。

然后使用 zplot 函数在 x 轴上绘制 x10 向量,在 y 轴上绘制 y10 向量和外推模型。请注意,y10 向量在观测数据结束时降至零,但预测继续沿着模型的拟合曲线进行。

forecast