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",逗号前后不能有空格或其他符号。

注:

leftright 指定的矩阵必须包含 byRow 指定的对齐标签,且标签的数据类型需要兼容。目前支持以下类型的标签:整型、浮点型、时间类型、STRING 类型、SYMBOL 类型。其中 INT, SHORT, LONG, CHAR 互相兼容, FLOAT 和 DOUBLE 类型互相兼容,STRING 和 SYMBOL 类型也互相兼容。

view 布尔值,默认值是 true,表示生成原矩阵的一个视图(浅拷贝),若原数据发生改变,视图的数据也会相应变化。若为 false,则生成一个新的矩阵(深拷贝)。

详情

按照 how 指定的方法,将 leftright 根据 byRow 指定的行/列标签进行对齐。返回一个长度为2的元组,其元素分别为两个矩阵按标签对齐后的对象。
注:
  • 返回矩阵不保留输入矩阵的属性,如:输入索引矩阵,返回非索引矩阵。
  • 通过函数 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