movingValid
语法
movingValid(func, funcArgs, window, [minPeriods], [combined=true])
详情
按最近 window 个有效数据(非空值)构造滑动窗口,对每个窗口调用聚合函数 func 计算结果。每计算一次,滑动窗口向右移动一个元素。
若 funcArgs 包含数组向量或列式元组,则按展开后的数据序列,从本行最后一个元素起向左追溯,取最近 window 个有效数据参与计算。
参数
funcArgs 是函数 func 的参数。可为向量、数组向量、列式元组、字典或矩阵。如果有多个参数,则用元组表示,并且每个参数的长度(向量/字典的元素个数)必须相同。当 combined 为 true 时,同一行中每个参数的元素个数必须相同。
window 是正整型,表示窗口内非空元素个数。
minPeriods 是一个正整数。为滑动窗口中最少包含的观测值数据。如果滑动窗口中的观测值小于 minPeriods ,那么该窗口的结果为 NULL 值。默认值与 window 相等。
combined 可选参数,是一个布尔值,表示在 func 为多参数时有效数据的判定方式:
-
true(默认值):展开后相同位置均为非空值的参数组合才被认定为有效数据。
-
false:各参数独立追溯,分别取其最近的 window 个有效数据参与计算
返回值
一个向量,长度与输入参数的长度相同。
例子
例1. 计算一个向量的移动有效平均值,窗口长度为3。
x = 1 2 NULL 3 4 NULL NULL NULL 5 6
movingValid(func=avg, funcArgs=x, window=3, minPeriods=3)
// output:[,,,2,3,3,3,3,4,5]
例2. 根据数组向量列,计算每个时刻过去 3 个有效数据的因子值。
defg myFactor(x){
return (max(x)-min(x))*2
}
timeCol = 09:30:00 + 1..13
value = arrayVector(3 4 5 6 9 11 12 15 16 17 18 21 23,9 1 15 NULL NULL NULL 16 18 4 1 11 NULL 2 14 8 NULL NULL NULL 15 9 16 18 10)
t = table(timeCol, value)
| timeCol | value |
|---|---|
| 09:30:01 | [9, 1, 15] |
| 09:30:02 | [null] |
| 09:30:03 | [null] |
| 09:30:04 | [null] |
| 09:30:05 | [16, 18, 4] |
| 09:30:06 | [1, 11] |
| 09:30:07 | [null] |
| 09:30:08 | [2, 14, 8] |
| 09:30:09 | [null] |
| 09:30:10 | [null] |
| 09:30:11 | [null] |
| 09:30:12 | [15, 9, 16] |
| 09:30:13 | [18, 10] |
select movingValid(myFactor,value,3,3) from t
movingValid_myFactor --- 28 28 28 28 28 20 20 24 24 24 24 14 16
例3. 不同 minPeriods 对结果的影响:
val = 1 2 4 NULL 5 NULL 7 9 10
movingValid(func=min, funcArgs=val, window=3, minPeriods=3)
// output: [,,1,1,2,2,4,5,7]
movingValid(func=min, funcArgs=val, window=3, minPeriods=2)
// output: [,1,1,1,2,2,4,5,7]
例4. 多参数时不同有效数据的判定方式对结果的影响:
combined=true 时
x = arrayVector(2 5 6 8 10 12, 10 20 30 40 NULL NULL 50 NULL NULL 60 70 80)
y = arrayVector(2 5 6 8 10 12, 1 NULL 2 3 NULL 5 1 NULL 2 7 8 5)
movingValid(func=covar, funcArgs=[x,y], window=2, minPeriods=2, combined=true)
| x | [10, 20] | [30, 40, null] | [null] | [50, null] | [null, 60] | [70, 80] |
|---|---|---|---|---|---|---|
| y | [1, null] | [2, 3, null] | [5] | [1, null] | [2, 7] | [8, 5] |
| 窗口计算 | covar([30,40], [2,3]) | covar([30,40], [2,3]) | covar([40,50], [3,1]) | covar([50,60],[1,7]) | covar([70,80],[8,5]) | |
| 结果 | null | 5 | 5 | -10 | 30 | -15 |
combined=false 时
x = arrayVector(2 5 6 8 10 12, 10 20 30 40 NULL NULL 50 NULL NULL 60 70 80)
y = arrayVector(2 5 6 8 10 12, 1 NULL 2 3 NULL 5 1 NULL 2 7 8 5)
movingValid(func=covar, funcArgs=[x,y], window=2, minPeriods=2, combined=false)
| x |
[10, 20] |
[30, 40, null] | [null] | [50, null] | [null, 60] | [70, 80] |
|---|---|---|---|---|---|---|
| y | [1, null] | [2, 3, null] | [5] | [1, null] | [2, 7] | [8, 5] |
| 窗口计算 | covar([30,40], [2,3]) | covar([30,40],[3,5]) | covar([40,50],[5,1]) | covar([50,60],[2,7]) | covar([70,80],[8,5]) | |
| 结果 | null | 5 | 10 | -20 | 25 | -15 |
