window
语法
window(func, funcArgs, range)
参数
-
func 是一个聚合函数。
-
funcArgs 是 func 的参数。func 有多个参数时,它是一个元组。
-
range 是一个整型数据对或 DURATION 数据对,左右边界都包含在内。
详情
应用函数/运算符到给定对象的滑动窗口。对给定对象的每一个元素,滑动窗口由 range 决定。结果的维度与 funcArgs 的维度相同(若 funcArgs 是一个元组, 结果的维度与该元组中每个元素的维度相同)。
滑动窗口的确定规则(假设 range 参数为 d1:d2):
-
若 funcArgs 为向量,range 必须为整型。对 funcArgs 中第 i 位的元素,窗口所含元素的位置区间为 [i+d1, i+d2] 。
-
若 funcArgs 为索引序列或索引矩阵:
-
若 funcArgs 的索引为时间类型,对 funcArgs 中索引为 fi 的元素,其对应的窗口索引范围为 [temporalAdd(fi, d1), temporalAdd(fi, d2)]。
-
若 funcArgs 的索引为整型,range 必须亦为整型。对 funcArgs 中索引为 fi 的元素,其对应的窗口索引范围为 [fi+d1, fi+d2] 。
-
与 moving
函数相比,window
函数具有更灵活的窗口。moving
可以视为 window
指定 range
右边界为 0 的特殊情况。但需要注意以下两点:
-
元素个数决定窗口长度时,窗口内元素个数不足时,
moving
函数将输出空值,但window
会输出计算结果。 -
时间长度决定窗口长度时,
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)
// output
[-1, -1, -1, 2, 4, ]
y = 4.8 9.6 7.1 3.3 5.9 2.7
window(corr, (x, y), 1:3)
// output
[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 |