align

New in version 1.30.20.

语法

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 指定的方法,将 left 和 right 根据 byRow 指定的行/列标签进行对齐。返回一个长度为2的元组,其元素分别为两个矩阵按标签对齐后的对象。

注意:

  • 返回矩阵不保留输入矩阵的属性,如:输入索引矩阵,返回非索引矩阵。

  • 通过函数 rename! 设置普通矩阵的标签;通过 exec + pivot by 也会生成以 pivot by 指定列为标签的矩阵。

背景

在 1.30.20 版本前,用户需要通过索引矩阵和索引序列来支持矩阵的对齐运算,其标签必须是严格递增的。索引矩阵和索引序列在进行二元运算时,系统会自动以 “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

16

19

20

12

15

16

14

17

18

$ 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