pivot
语法
pivot(func, funcArgs, rowAlignCol, colAlignCol)
参数
func 函数。
funcArgs func 的参数。如果 func 有多个参数,那么它是一个元组。
rowAlignCol 行的分组变量。
colAlignCol 列的分组变量。
rowAlignCol, colAlignCol 和 funcArgs 中的每个参数都是相同长度的向量。
详情
在指定的二维维度上重组数据,结果为一个矩阵。
假设 rowAlignCol 有 n 个不同元素,colAlignCol 有 m 个不同元素。该高阶函数将会返回 n 行 m 列的矩阵,colAlignCol 的唯一值作为行标签,rowAlignCol 的唯一值作为列标签。对于矩阵的每一个元素,将指定函数应用到 rowAlignCol 和 colAlignCol 所指定的矩阵单元格的元素上。
例子
本例计算多只股票收益率的两两相关性。
原始数据表有 4 列:sym, price, volume 和 time。
$ syms=`600300`600400`600500$SYMBOL
$ sym=syms[0 0 0 0 0 0 0 1 1 1 1 1 1 1 2 2 2 2 2 2 2]
$ time=09:40:00+1 30 65 90 130 185 195 10 40 90 140 160 190 200 5 45 80 140 170 190 210
$ price=172.12 170.32 172.25 172.55 175.1 174.85 174.5 36.45 36.15 36.3 35.9 36.5 37.15 36.9 40.1 40.2 40.25 40.15 40.1 40.05 39.95
$ volume=100 * 10 3 7 8 25 6 10 4 5 1 2 8 6 10 2 2 5 5 4 4 3
$ t1=table(sym, time, price, volume);
$ t1;
sym |
time |
price |
volume |
---|---|---|---|
600300 |
09:40:01 |
172.12 |
1000 |
600300 |
09:40:30 |
170.32 |
300 |
600300 |
09:41:05 |
172.25 |
700 |
600300 |
09:41:30 |
172.55 |
800 |
600300 |
09:42:10 |
175.1 |
2500 |
600300 |
09:43:05 |
174.85 |
600 |
600300 |
09:43:15 |
174.5 |
1000 |
600400 |
09:40:10 |
36.45 |
400 |
600400 |
09:40:40 |
36.15 |
500 |
600400 |
09:41:30 |
36.3 |
100 |
600400 |
09:42:20 |
35.9 |
200 |
600400 |
09:42:40 |
36.5 |
800 |
600400 |
09:43:10 |
37.15 |
600 |
600400 |
09:43:20 |
36.9 |
1000 |
600500 |
09:40:05 |
40.1 |
200 |
600500 |
09:40:45 |
40.2 |
200 |
600500 |
09:41:20 |
40.25 |
500 |
600500 |
09:42:20 |
40.15 |
500 |
600500 |
09:42:50 |
40.1 |
400 |
600500 |
09:43:10 |
40.05 |
400 |
600500 |
09:43:30 |
39.95 |
300 |
将数据依据 time 和 sym 维度对齐,并且计算每分钟内股价以交易量为权重的加权平均值。结果为一个矩阵。
$ stockprice=pivot(wavg, [t1.price, t1.volume], minute(t1.time), t1.sym)
$ stockprice.round(2);
label |
600300 |
600400 |
600500 |
---|---|---|---|
09:40m |
171.7 |
36.28 |
40.15 |
09:41m |
172.41 |
36.3 |
40.25 |
09:42m |
175.1 |
36.38 |
40.13 |
09:43m |
174.63 |
36.99 |
40.01 |
计算每分钟的股票收益率:
$ stockreturn = each(ratios, stockprice)-1
$ stockreturn;
label |
600300 |
600400 |
600500 |
---|---|---|---|
09:40m |
|||
09:41m |
0.004108 |
0.000459 |
0.002491 |
09:42m |
0.015602 |
0.002204 |
-0.003037 |
09:43m |
-0.002677 |
0.016871 |
-0.003006 |
计算股票收益率的两两相关性:
$ cross(corr, stockreturn, stockreturn);
label |
600300 |
600400 |
600500 |
---|---|---|---|
600300 |
1 |
-0.719182 |
-0.151824 |
600400 |
-0.719182 |
1 |
-0.577578 |
600500 |
-0.151824 |
-0.577578 |
1 |
统计每个股票每分钟内的记录数量:
$ pivot(count, price, minute(time), sym);
label |
600300 |
600400 |
600500 |
---|---|---|---|
09:40m |
2 |
2 |
2 |
09:41m |
2 |
1 |
1 |
09:42m |
1 |
2 |
2 |
09:43m |
2 |
2 |
2 |
每个股票每分钟里的最后一条记录:
$ pivot(last, price, minute(time), sym);
label |
600300 |
600400 |
600500 |
---|---|---|---|
09:40m |
170.32 |
36.15 |
40.2 |
09:41m |
172.55 |
36.3 |
40.25 |
09:42m |
175.1 |
36.5 |
40.1 |
09:43m |
174.5 |
36.9 |
39.95 |
相关函数:unpivot