列式元组(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]