更强大、更灵活、更全面丨一文搞懂DolphinDB窗口计算
在时序数据的处理中经常需要使用窗口计算。在DolphinDB中,窗口计算不仅仅应用于全量的历史数据计算,还可以应用于增量的流计算。窗口函数既可应用于SQL(处理表中的列),也可应用于面板数据(处理矩阵中的列)。DolphinDB对于窗口计算进行了精心优化,与其它系统相比,拥有显著的性能优势。除此之外,DolphinDB的窗口函数使用上更加灵活,不仅内置的或自定义的vector函数都可用于窗口计算,而且可以多个函数嵌套使用。
本篇将系统的介绍DolphinDB的窗口计算,从概念划分、应用场景、指标计算等角度,帮助用户快速掌握和运用DolphinDB强大的窗口计算功能。
本篇所有代码支持DolphinDB 1.30.15,2.00.3及以上版本。
1.30.7,2.00.0以上版本支持绝大部分代码,细节部分会在小节内部详细说明。
1. 窗口的概念及分类
DolphinDB内有四种窗口,分别是:滚动窗口、滑动窗口、累计窗口和不定长窗口(包括会话窗口和segment window)。
在DolphinDB中,窗口的度量标准有两种:数据行数和时间。 为了方便理解,可以参考下图:
本章节将介绍各个窗口类型的概念,具体的应用实例会在第2-4章节详细介绍。
1.1 滚动窗口
滚动窗口将每个数据分配到一个指定大小的窗口中。通常滚动窗口大小固定,且相邻两个窗口没有重复的元素。
滚动窗口根据度量标准的不同可以分为2种:
- 以行数划分窗口
图1-1-1 指定窗口大小为3行记录,横坐标以时间为单位。从图上可以看出,按每三行记录划分为了一个窗口,窗口之间的元素没有重叠。
- 以时间划分窗口
图1-1-2 指定窗口大小为3个时间单位,横坐标以时间为单位。与以行数划分窗口不同,按时间划分的窗口内记录数是不固定的。从两个图中可以看出,同一数据按不同单位类型划分窗口的结果是不同的。
1.2 滑动窗口
滑动窗口的模式是:一定长度的窗口,根据步长,进行滑动。与滚动窗口不同,滑动窗口相邻两个窗口可能包括重复的元素。滑动窗口根据步长和窗口采用不同的度量标准,可以分成以下4种:
- 步长为1行, 窗口为n行
图1-2-1 指定窗口大小为6行记录,窗口每次向后滑动1行记录。
- 步长为1行,窗口为指定时间
图1-2-2 指定窗口大小为3个时间单位,窗口以右边界为基准进行前向计算,窗口每次向后滑动1行记录。
- 步长为时间,窗口为n个步长时间
图1-2-3 指定窗口大小为4个时间单位,每次向后滑动2个时间单位。
- 步长为n行,窗口为m行
图1-2-4 指定窗口大小为5行记录,窗口每次向后滑动3行记录。
1.3 累计窗口
累计窗口,即窗口的起始边界固定,结束边界累计右移。根据数据的增加或时间的增长,窗口的大小会变大。 累计窗口根据度量标准的不同可以分为2种:
- 步长为指定时间单位
图1-3-1 窗口右边界每次右移2个时间单位,窗口大小累计增加。
- 步长为1行
图1-3-2 窗口右边界每次右移1行,窗口大小累计增加。
1.4 不定长窗口
1.4.1 会话窗口
会话窗口是根据指定时间长度(session gap)切分窗口:若某条数据之后指定时间长度内无数据进入,则该条数据为一个窗口的终点,之后条新数据为另一个窗口的起点。 会话窗口的窗口大小可变,窗口的度量方式为时间。
1.4.2 segment窗口
segment窗口是根据给定的数据来切分窗口,连续的相同元素为一个窗口。窗口大小可变,窗口的度量方式为行。
2. SQL中的窗口计算以及窗口连接计算
SQL中的窗口计算一般涉及滚动窗口,滑动窗口,累计窗口以及segment窗口。DolphinDB中也有涉及窗口计算的window join窗口连接。本章将对上述几个窗口计算一一介绍。
2.1 SQL中的窗口计算
2.1.1 滚动窗口
2.1.1.1 时间维度的滚动窗口
在SQL中,可使用interval
, bar
, dailyAlignedBar
等函数配合group by
语句实现滚动窗口的聚合计算。
以bar
函数为例,下面的例子是将10:00:00到10:05:59每秒更新的数据,每2分钟统计一次交易量之和:
t=table(2021.11.01T10:00:00..2021.11.01T10:05:59 as time, 1..360 as volume)
select sum(volume) from t group by bar(time, 2m)
# output
bar_time sum_volume
------------------- ----------
2021.11.01T10:00:00 7260
2021.11.01T10:02:00 21660
2021.11.01T10:04:00 36060
相关文章