列式元组(columnar tuple)

New in version 2.00.9.

概述

列式元组是一种特殊的元组类型,列式元组的元素可以是标量也可以是向量,且其值的类型必须保持一致。列式元组的取数规则和数组向量一致。

2.00.9 版本后,DolphinDB 支持将列式元组存储为表的一列(分布式表暂不支持)。

创建列式元组

通过函数 setColumnarTuple! 可以将一个普通元组转换成列式元组。

通过函数 isColumnarTuple 可以判断一个元组是否为列式元组。

$ tp = [[1.3,2.5,2.3], [4.1,5.3], 6.3]
$ isColumnarTuple(tp)
false

$ tp.setColumnarTuple!()
$ isColumnarTuple(tp)
true

访问列式元组

普通元组按索引取出的是对应下标的元素值,而列式元组和数组向量则是返回每个元素对应下标的值组成的向量。

$ tp = [[1.3,2.5,2.3], [4.1,5.3], 6.3]
$ ctp = [[1.3,2.5,2.3], [4.1,5.3], 6.3].setColumnarTuple!()
$ av = array(DOUBLE[], 0, 20).append!([[1.3,2.5,2.3], [4.1,5.3], 6.3])

// 按索引取数
$ tp[0]
[1.3,2.5,2.3]

$ ctp[0]
[1.3,4.1,6.3]

$ av[0]
[1.3,4.1,6.3]

按 slice 取数时(即 x[start:end]),若 slice 范围超过了列式元组中元素的长度,会自动填充空值。

当元素类型不为 STRING, SYMBOL 且 slice 的 end 不为空时,列式元组 slice 后的返回结果是一个数组向量,否则返回的仍然时列式元组。

//按 slice 取数
$ a = ctp[0:3]
$ a
[[1.3,2.5,2.3],[4.1,5.3,00F],[6.3,6.3,6.3]]

$ b = ctp[0:]
$ b
([1.3,2.5,2.3],[4.1,5.3],6.3)

和数组向量一致,若要单独取出每个元素的值可以通过 row 函数实现。

$ ctp.row(0)
[1.3,2.5,2.3]

追加数据到列式元组

$ ctp = [[1.3,2.5,2.3], [4.1,5.3], 6.3].setColumnarTuple!()
$ ctp.append!([3.3,2.1])
$ ctp
([1.3,2.5,2.3],[4.1,5.3],6.3,[3.3,2.1])

列式元组按行计算

$ ctp = [[1.3,2.5,2.3], [4.1,5.3], 6.3].setColumnarTuple!()
$ rowSum(ctp)
[6.1,9.4,6.3]

创建一个列为列式元组的内存表

创建内存表时,DolphinDB 支持将元素不等长的普通元组存储为列式元组。

$ sym = `st1`st2`st3
$ price = [[3.1,2.5,2.8], [3.1,3.3], [3.2,2.9,3.3]]
$ t = table(sym, price)
$ t;

sym price
--- -------------
st1 [3.1,2.5,2.8]
st2 [3.1,3.3]
st3 [3.2,2.9,3.3]

注意:对于元素等长的普通元组,必须调用 setColumnarTuple!() 转换为列式元组 。

$ id = 1 2 3
$ val = [[1,2,3], [4,5,6],[7,8,9]]
$ table(id, val)
id  col1    col2    col3
1   1       4       7
2   2       5       8
3   3       6       9

$ table(id, val.setColumnarTuple!())
id val
-- -------
1  [1,2,3]
2  [4,5,6]
3  [7,8,9]