时间序列

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

时间序列聚合

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 个 bin 的经验分布,创建了时间序列离散度的 10 个 bin 直方图。

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

maddist

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

  • 概率分布

  • 数值向量

  • 低概率阈值

  • 高概率阈值

  • 数值向量从中选择的结果列表

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

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

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

outliers

建模

Solr 中支持的数学表达式包含许多可用于建模时间序列的函数。这些函数包括线性回归、多项式和调和曲线拟合、局部加权回归和 KNN 回归。

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

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

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

在本示例中,polyfit 函数使用 4 次多项式返回 y 轴的拟合模型,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