window

New in version 1.30.16.

语法

window(func, funcArgs, range)

参数

func 是一个聚合函数。

funcArgsfunc 的参数。func 有多个参数时,它是一个元组。

range 是一个整型数据对或 DURATION 数据对,左右边界都包含在内。

注意:如果 range 是 DURATION 类型,则 funcArgs 必须是一个索引矩阵(indexed matrix)或者是索引序列(indexed series)。

详情

应用函数/运算符到给定对象的滑动窗口。对给定对象的每一个元素,滑动窗口由 range 决定。结果的维度与 funcArgs 的维度相同(若 funcArgs 是一个元组, 结果的维度与该元组中每个元素的维度相同)。

滑动窗口的确定规则(假设 range 参数为 d1:d2):

1. 若 funcArgs 为向量,range 必须为整型。对 funcArgs 中第 i 位的元素,窗口所含元素的位置区间为 [i+d1, i+d2] 。

2. 若 funcArgs 为索引序列或索引矩阵:

  • funcArgs 的索引为时间类型,对 funcArgs 中索引为 fi 的元素,其对应的窗口索引范围为 [temporalAdd(fi, d1), temporalAdd(fi, d2)]。

  • funcArgs 的索引为整型,range 必须亦为整型。对 funcArgs 中索引为 fi 的元素,其对应的窗口索引范围为 [fi+d1, fi+d2] 。

moving 函数相比,window 函数具有更灵活的窗口。moving 可以视为 window 指定 range 右边界为 0 的特殊情况。但需要注意以下两点:

1. 元素个数决定窗口长度时,窗口内元素个数不足时,moving 函数将输出空值,但 window 会输出计算结果。

2. 时间长度决定窗口长度时,moving 确定的窗口左开右闭,但 window 确定窗口左闭右闭。详见以下说明:

假定索引类型为 DATETIME, 需要指定一个长度为 “3d” 的窗口进行滑动窗口计算。对于索引中的某个时间点 “2022.01.05T09:00:00”, moving 函数根据该时间点确定的窗口为 (2022.01.02T09:00:00,2022.01.05T09:00:00],window 指定 range 为 “-2d:0d”, 确定的窗口为 [2022.01.03T09:00:00,2022.01.05T09:00:00]。

例子

funcArgs 为向量, 确定窗口位置区间为 [i+1,i+3], i 是 x 的下标。

$ x = 5 4 NULL -1 2 4
$ window(min, x, 1:3)
[-1, -1, -1, 2, 4, ]

$ y = 4.8 9.6 7.1 3.3 5.9 2.7
$ window(corr, (x, y), 1:3)
[1, 1, -0.623, -1, , ]

funcArgs 为索引序列, 索引为时间类型,确定的窗口范围为 [temporalAdd(ti, 1d), temporalAdd(ti, 3d)],ti 是 t 第 i 个元素对应的值。

$ t = 2021.01.02 2021.01.05 2021.01.06 2021.01.09 2021.01.10 2021.01.12
$ x1 = indexedSeries(t, x)
$ window(min, x1, 1d:3d)

label

col1

2021.01.02

4

2021.01.05

2021.01.06

-1

2021.01.09

2

2021.01.10

4

2021.01.12

funcArgs 为索引矩阵, 索引为时间,确定索引对应的窗口范围 [temporalAdd(ti, 1d), temporalAdd(ti, 3d)],ti 是 t 第 i 个元素对应的值。 以 a, b 列分组进行滑动窗口计算。

$ t= 2021.01.02 2021.01.05  2021.01.06  2021.01.09 2021.01.10 2021.01.12
$ m=matrix(5 4 NULL -1 2 4, 3 2 8 1 0 5)
$ m1=m.rename!(t, `a`b).setIndexedMatrix!()
$ window(min, m1, 1d:3d)

label

a

b

2021.01.02

4

2

2021.01.05

8

2021.01.06

-1

1

2021.01.09

2

0

2021.01.10

4

5

2021.01.12

$ t1 = table(`A`A`B`B`C`C as sym, 09:56:03 09:56:07 09:56:02 09:56:05 09:56:04 09:56:06 as time, 10.6 10.7 20.6 11.6 11.7 19.6 as price)
$ select *, window(avg, t1.time.indexedSeries(t1.price), 2s:4s) from t1 context by sym

sym

time

price

window_avg

A

09:56:03

10.6

10.7

A

09:56:07

10.7

B

09:56:02

20.6

11.6

B

09:56:05

11.6

C

09:56:04

11.7

19.6

C

09:56:06

19.6