align
语法
align(left, right, [how='outer'], [byRow], [view=true])
参数
left/right 包含标签的矩阵/索引矩阵/索引序列。
how 矩阵的对齐方法。通过将矩阵的行列标签进行 join 操作,来实现标签对齐。可选值为:'outer' (or 'fj'), 'inner' (or 'ej'), 'left' (or 'lj'), or 'asof ('aj')',表示不同的连接方式。默认值是 'outer',即外连接。
byRow 布尔值或空值。若为 true,表示按行标签对齐;若为 false,表示按列标签对齐。默认为空值,表示同时按照行列标签对齐。此时,若行、列的连接方式相同,how 需指定一个连接方式;否则,how 需指定两个连接方式,格式为"行对齐方式,列对齐方式",例如 how="outer,inner",逗号前后不能有空格或其他符号。
left 和 right 指定的矩阵必须包含 byRow 指定的对齐标签,且标签的数据类型需要兼容。目前支持以下类型的标签:整型、浮点型、时间类型、STRING 类型、SYMBOL 类型。其中 INT, SHORT, LONG, CHAR 互相兼容, FLOAT 和 DOUBLE 类型互相兼容,STRING 和 SYMBOL 类型也互相兼容。
详情
- 返回矩阵不保留输入矩阵的属性,如:输入索引矩阵,返回非索引矩阵。
- 通过函数
rename!
设置普通矩阵的标签;通过 exec + pivot by 也会生成以 pivot by 指定列为标签的矩阵。
背景
在 2.00.8 版本前,用户需要通过索引矩阵和索引序列来支持矩阵的对齐运算,其标签必须是严格递增的。索引矩阵和索引序列在进行二元运算时,系统会自动以 "outer" 方式进行对齐,然后进行运算。
引入 align
函数后,标签矩阵的对齐功能得到拓展,使得矩阵对齐和运算更加灵活。对比之前的对齐方式,align
函数具有以下优势:
- 支持普通的标签矩阵对齐,标签的单调性不再受限制;
- 对齐的方法更加多样化。
例子
// 对齐包含重复标签的矩阵
x1 = [09:00:00, 09:00:01, 09:00:03]
x2 = [09:00:00, 09:00:03, 09:00:03, 09:00:04]
m1 = matrix(1 2 3, 2 3 4, 3 4 5).rename!(x1)
m2 = matrix(11 12 13, 12 13 14, 13 14 15, 14 15 16).rename!(x2)
a, b = align(m1, m2, 'fj', false);
a;
09:00:00 | 09:00:01 | 09:00:03 | 09:00:03 | 09:00:04 |
---|---|---|---|---|
1 | 2 | 3 | 3 | |
2 | 3 | 4 | 4 | |
3 | 4 | 5 | 5 |
b;
09:00:00 | 09:00:01 | 09:00:03 | 09:00:03 | 09:00:04 |
---|---|---|---|---|
11 | 12 | 13 | 14 | |
12 | 13 | 14 | 15 | |
13 | 14 | 15 | 16 |
a+b;
09:00:00 | 09:00:01 | 09:00:03 | 09:00:03 | 09:00:04 |
---|---|---|---|---|
12 | 15 | 16 | ||
14 | 17 | 18 | ||
16 | 19 | 20 |
m = align(m1, m2, 'aj', false);
m[0];
09:00:00 | 09:00:01 | 09:00:03 |
---|---|---|
1 | 2 | 3 |
2 | 3 | 4 |
3 | 4 | 5 |
m[1];
09:00:00 | 09:00:01 | 09:00:03 |
---|---|---|
11 | 11 | 13 |
12 | 12 | 14 |
13 | 13 | 15 |
// 定义一个价格表 pt, 一个交易量的表 vt
timestamp = [09:00:00, 09:00:02, 09:00:03, 09:00:06, 09:00:08]
id= ['st1', 'st2', 'st1', 'st1', 'st2']
price = [197.8, 197.5, 198.4, 198.6, 198.6]
pt = table(timestamp, id, price)
timestamp = [09:00:00, 09:00:01, 09:00:02, 09:00:05, 09:00:08]
id = ['st1', 'st2', 'st2', 'st3', 'st2']
vol = [200, 300, 150, 200, 180]
vt = table(timestamp, id, vol)
// 利用 pivot by 获取价格矩阵和交易量矩阵,pivot by 指定的列将作为矩阵的标签
m1 = exec vol from vt pivot by timestamp, id
m2 = exec price from pt pivot by timestamp, id
// 使用 full join 对齐两个矩阵
m = align(m1, m2, how='aj,fj')
// 计算得到交易金额的矩阵
re = m[0] * m[1]
re;
label | st1 | st2 | st3 |
---|---|---|---|
09:00:00 | 39560 | ||
09:00:01 | |||
09:00:02 | 29625 | ||
09:00:03 | |||
09:00:05 | |||
09:00:08 | 35748 |