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 |