sessionWindow

语法

sessionWindow(X, sessionGap)

参数

X 整型或时间类型向量。

SessionGap 正整数,表示两个会话之间的间隔。其单位同 X 一致。

详情

X 的第一个非空元素开始一个会话窗口,依次判断 X 中每个元素与前一个相邻元素的差值是否小于 sessionGap。若差值小于 sessionGap,则会话窗口继续打开;否则,会话窗口关闭,且由当前元素开始一个新的会话窗口。以各个会话窗口的第一个元素值作为它的编号。该函数返回 X 中每个元素所属的会话窗口的编号。

注:
  • 对于 X 中的空值(不参与比较):若空值位于 X 的开头,则返回空;否则,返回其前一个非空元素所属会话窗口的编号。

  • 乱序数据不会参与比较,直接返回当前会话窗口的编号。

例子

x = 1 5 6 12 13 13 15
sessionWindow(x, 5)
# output
[1,1,1,12,12,12,12]

y = 2012.06.13 2012.06.15 2012.06.19 2012.06.26 2012.06.28
sessionWindow(y, 5)
# output
[2012.06.13,2012.06.13,2012.06.13,2012.06.26,2012.06.26]

在下例中,第二个会话窗口(编号为12)之后出现的乱序数据3和7不参与判断,直接返回编号12。其后的元素15属于会话窗口12(因为15-12<4)。

x = [, , 1, 12, 3, 7, 15, 19]
sessionWindow(x, 4) 
# output
[,,1,12,12,12,12,12,12,19]
colTime = 2023.06.01T10:00:00.000 + 1 2 3 4 5 6 7 8 9 21 22 23 28 29 30
colSym = take(`A`B`C,15)
colVolume = [2,1,5,5,2,3,2,3,2,2,5,5,2,7,2]
t = table(colTime as time, colSym as sym, colVolume as volume)
t
time sym volume
2023.06.01 10:00:00.001 A 2
2023.06.01 10:00:00.002 B 1
2023.06.01 10:00:00.003 C 5
2023.06.01 10:00:00.004 A 5
2023.06.01 10:00:00.005 B 2
2023.06.01 10:00:00.006 C 3
2023.06.01 10:00:00.007 A 2
2023.06.01 10:00:00.008 B 3
2023.06.01 10:00:00.009 C 2
2023.06.01 10:00:00.021 A 2
2023.06.01 10:00:00.022 B 5
2023.06.01 10:00:00.023 C 5
2023.06.01 10:00:00.028 A 2
2023.06.01 10:00:00.029 B 7
2023.06.01 10:00:00.030 C 2

在下面的代码中,我们使用了高阶函数 contextby,根据股票代码 sym 对数据进行分组,并在每个分组内使用 sessionWindow 划分会话窗口,然后计算每个窗口中的交易量总和。其中,sessionWinodow 使用了部分应用,其第一个参数固定为时间列 time。

select sum(volume) from t group by contextby(sessionWindow{, 5}, time, sym) as time,sym
time sym sum_volume
2023.06.01 10:00:00.001 A 9
2023.06.01 10:00:00.002 B 6
2023.06.01 10:00:00.003 C 10
2023.06.01 10:00:00.021 A 2
2023.06.01 10:00:00.022 B 5
2023.06.01 10:00:00.023 C 5
2023.06.01 10:00:00.028 A 2
2023.06.01 10:00:00.029 B 7
2023.06.01 10:00:00.030 C 2