contextby (:X)

语法

contextby(func, funcArgs, groupingCol, [sortingCol])

funcArg func:X groupingCol

参数

func 是一个函数。

funcArgs 是函数func的参数。如果有多个参数,则用元组表示。

groupingCol 是分组变量,可为一组或多组。

sortingCol 是可选参数,表示在应用函数func前,依此列进行组内排序。

funcArgs, groupingCol和sortingCol中包含的向量长度相等。

对于第二种用法,func表示的函数只能有一个参数。

详情

根据groupingCol分组,并在组内进行指定计算。返回一个与输入参数长度相同的向量。

如果func是聚合函数,每组内的所有结果相同。若指定了sortingCol,在计算前,依此列进行组内排序。

例子

$ sym=`IBM`IBM`IBM`MS`MS`MS
$ price=172.12 170.32 175.25 26.46 31.45 29.43
$ qty=5800 700 9000 6300 2100 5300
$ trade_date=2013.05.08 2013.05.06 2013.05.07 2013.05.08 2013.05.06 2013.05.07;
$ contextby(avg, price, sym);
[172.563,172.563,172.563,29.113,29.113,29.113]

$ price avg :X sym;
[172.563,172.563,172.563,29.113,29.113,29.113]

$ price at price>contextby(avg, price,sym);
[175.25,31.45,29.43]

$ price at price>price avg :X sym;
[175.25,31.45,29.43]

$ sym at price>contextby(avg, price,sym);
["IBM","MS","MS"]

$ contextby(wavg, [price, qty], sym);
[173.856,173.856,173.856,28.374,28.374,28.374]
// 计算数量加权的平均值

$ contextby(ratios, price, sym, trade_date) - 1;
[-0.01786,,0.028946,-0.100917,,-0.064229]

groupingCol 可包含多个向量:

$ sym=`IBM`IBM`IBM`IBM`IBM`IBM`MS`MS`MS`MS`MS`MS
$ date=2020.12.01 + 0 0 0 1 1 1 0 0 0 1 1 1
$ qty=5800 700 9000 1000 3500 3900 6300 2100 5300 7800 1200 4300
$ contextby(cumsum, qty, [sym,date]);
[5800,6500,15500,1000,4500,8400,6300,8400,13700,7800,9000,13300]

contextby 高阶函数可在SQL查询中使用:

$ t1=table(trade_date,sym,qty,price);
$ t1;

trade_date

sym

qty

price

2013.05.08

IBM

5800

172.12

2013.05.06

IBM

700

170.32

2013.05.07

IBM

9000

175.25

2013.05.08

MS

6300

26.46

2013.05.06

MS

2100

31.45

2013.05.07

MS

5300

29.43

// 选出价格高于组内平均价的交易记录
$ select trade_date, sym, qty, price from t1 where price > contextby(avg, price,sym);

trade_date

sym

qty

price

2013.05.07

IBM

9000

175.25

2013.05.06

MS

2100

31.45

2013.05.07

MS

5300

29.43