时间序列
本用户指南部分概述了流表达式和数学表达式中提供的一些时间序列功能。
时间序列聚合
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,可以使用折线图可视化此时间序列。
矢量化时间序列
在对时间序列进行平滑或建模之前,需要对数据进行矢量化。col
函数可用于将元组列表中的一列数据复制到数组中。
以下表达式演示了 date_dt
和 avg(close_d)
字段的矢量化。然后使用 zplot
函数在 x 轴上绘制月份,在 y 轴上绘制平均收盘价。
平滑
时间序列平滑通常用于去除时间序列中的噪声并帮助发现潜在趋势。数学表达式库有三种用于时间序列平滑的滑动窗口方法。这些方法使用滑动数据窗口中的汇总值来计算一组新的平滑数据点。
这三个滑动窗口函数是滞后指标,这意味着它们在趋势影响滑动窗口的汇总值之前不会开始朝趋势方向移动。由于这种滞后特性,这些平滑函数通常用于确认趋势的方向。
移动平均
movingAvg
函数计算滑动数据窗口上的简单移动平均。以下示例生成时间序列,对 avg(close_d)
字段进行矢量化,并计算窗口大小为 5 的移动平均。
移动平均函数返回一个比原始向量长度更短的数组。这是因为仅当有完整的数据窗口可用于计算平均值时才会生成结果。对于窗口大小为 5,移动平均将在第 5 个值处开始生成结果。先前值不包含在结果中。
然后使用 zplot
函数在 x 轴上绘制月份,在 y 轴上绘制平均收盘价和移动平均。请注意,ltrim
函数用于从 x 轴和平均收盘价中去掉前 4 个值。这样做是为了使三个数组对齐,以便它们从第 5 个值开始。
差分
差分可用于通过从序列中移除趋势或季节性来使时间序列平稳。
一阶差分
差分中使用的技术是使用值之间的差值,而不是原始值。一阶差分获取值与紧接其前一个值之间的差值。一阶差分通常用于从时间序列中移除趋势。
以下示例使用一阶差分使两个时间序列平稳,以便在不考虑趋势的情况下对其进行比较。
在此示例中,我们将比较两家股票(亚马逊和谷歌)的月度平均收盘价。下图绘制了应用差分之前的两个时间序列。
在下一个示例中,diff
函数应用于 zplot
函数内的两个时间序列。diff
可应用于 zplot
函数内,或像 let
函数内的任何其他函数一样。
请注意,两个时间序列现在都已移除趋势,并且可以在不受趋势影响的情况下研究股票价格的月度变动。
在下一个示例中,时间序列可视化的 zoom
函数用于放大特定月份范围。这允许更仔细地检查数据。通过更仔细地检查数据,似乎两家股票的月度变动之间存在一些相关性。
在最后一个示例中,差分时间序列与 corr
函数相关。
异常检测
movingMAD
(移动平均绝对偏差)函数可用于通过测量滑动窗口中的离散度(与平均值的偏差)来显示时间序列中的异常。
movingMAD
函数的工作方式与移动平均类似,除了它测量窗口内的平均绝对偏差而不是平均值。通过寻找异常高或低的离散度,我们可以找到时间序列中的异常。
对于此示例,我们将使用亚马逊两年期间的每日股票价格。每日股票数据将提供更大的数据集进行研究。
在下面的示例中,search
表达式用于返回两年期间股票代码AMZN的每日收盘价。
下一步是将movingMAD
函数应用于数据,以计算 10 天窗口内的移动平均绝对偏差。以下示例显示了该函数的应用和可视化。
计算出移动 MAD 后,我们可以使用empiricalDistribution
函数可视化离散度的分布。以下示例使用 10 个箱绘制经验分布,创建时间序列离散度的 10 个箱直方图。
此可视化显示,大多数平均绝对偏差介于 0 和 9.2 之间,最后一个箱的平均值为 11.94。
最后一步是使用outliers
函数检测序列中的异常值。outliers
函数使用概率分布来查找数字向量中的异常值。outliers
函数采用四个参数
-
概率分布
-
数字向量
-
低概率阈值
-
高概率阈值
-
数字向量从中选择的列表
outliers
函数迭代数字向量,并使用概率分布来计算每个值的累积概率。如果累积概率低于低概率阈值或高于高阈值,则它会将该值视为异常值。当 outliers
函数遇到异常值时,它会从第五个参数提供的结果列表中返回相应的结果。它还包括累积概率和异常值。
以下示例显示了应用于亚马逊股票价格数据集的 outliers
函数。移动平均绝对偏差的经验分布是第一个参数。包含移动平均绝对偏差的向量是第二个参数。-1
是低概率阈值,.99
是高概率阈值。-1
表示不会考虑低异常值。最后一个参数是包含 close_d
和 date_dt
字段的原始结果集。
outliers
函数的输出包含检测到异常值的结果。在这种情况下,检测到 5 个高于 .99 概率阈值的结果。
建模
Solr 中支持的数学表达式包括许多可用于对时间序列进行建模的函数。这些函数包括线性回归、多项式和谐波曲线拟合、loess 回归和 KNN 回归。
这些函数中的每一个都可以对时间序列进行建模,并用于插值(预测数据集中的值),其中几个可用于外推(预测数据集之外的值)。
用户指南的线性回归、曲线拟合和机器学习部分详细介绍了各种回归函数。
以下示例使用 polyfit
函数(多项式回归)为时间序列拟合非线性模型。所使用的数据集是亚马逊在八年期间的月平均收盘价。
在此示例中,polyfit
函数使用 4 次多项式为 y 轴(即平均月收盘价)返回拟合模型。多项式的次数决定模型中的曲线数量。拟合模型设置为变量 y1
。然后使用 zplot
直接绘制拟合模型以及原始 y
值。
可视化显示了通过平均收盘价数据拟合的平滑曲线。
预测
polyfit
函数还可用于外推时间序列以预测未来的股票价格。以下示例演示了 10 个月的预测。
在示例中,polyfit
函数为 y 轴拟合一个模型,并且该模型被设置为变量 m
。然后,为了创建预测,将 10 个零追加到 y 轴以创建名为 y10
的新向量。然后,使用 natural
函数创建一个新 x 轴,该函数返回从 0 到 y10
长度的全数字序列。新 x 轴存储在变量 x10
中。
predict
函数使用拟合模型来预测存储在变量 x10
中的新 x 轴的值。
然后使用 zplot
函数在 x 轴上绘制 x10
向量,在 y 轴上绘制 y10
向量和外推模型。请注意,y10
向量在观测数据结束时降至零,但预测继续沿着模型的拟合曲线进行。