在KDB +中将列作为年份/日期的数据透视表

时间:2018-03-10 11:49:30

标签: kdb

我正在尝试使用简单表

创建一个包含year列的数据透视表
q)growth:([] stock:asc 9#`goog`apple`nokia; year: 9#2015 2016 2017; returns:9?20 )
q)growth
stock year returns
------------------
apple 2015 9
apple 2016 18
apple 2017 17
goog  2015 8
goog  2016 13
goog  2017 17
nokia 2015 12
nokia 2016 12
nokia 2017 2

但是我无法获得正确的结构,它仍然返回一个字典而不是多个year列。

q)exec (distinct growth`year)#year!returns by stock:stock from growth
stock|
-----| ----------------------
apple| 2015 2016 2017!9 18 17
goog | 2015 2016 2017!8 13 17
nokia| 2015 2016 2017!12 12 2
我做错了什么?

2 个答案:

答案 0 :(得分:3)

您需要将年份转换为符号才能将它们用作列标题。在这种情况下,我先更新了growth表,然后执行了数据透视表:

q)exec distinct[year]#year!returns by stock:stock from update `$string year from growth
stock| 2015 2016 2017
-----| --------------
apple| 12   8    10
goog | 1    9    11
nokia| 5    6    1

此外,您可能会发现我已从distinct[year]更改为(distinct growth`year),因为从更新的表中提取year会产生相同的结果。

答案 1 :(得分:2)

KDB中表的列名应该是符号而不是任何其他数据类型。

在您的数据透视表中,'年'的数据类型column是int \ long这是正确的表没有出现的原因。

如果你输入它作为符号,那么它将起作用。

q)growth:([] stock:asc 9#`goog`apple`nokia; year: 9#2015 2016 2017; returns:9?20 )
q)growth:update `$string year from growth
q)exec (distinct growth`year)#year!returns by stock:stock from growth
stock| 2015 2016 2017
-----| --------------
apple| 9    18   17
goog | 8    13   17
nokia| 12   12   2

或者,您可以将数据透视列切换为' stock'而不是' year'并获得一个包含相同原始表的数据透视表。

q)growth:([] stock:asc 9#`goog`apple`nokia; year: 9#2015 2016 2017; returns:9?20 )
q)show exec (distinct growth`stock)#stock!returns by year:year from growth
year| apple goog nokia
----| ----------------
2015| 4     2    4
2016| 5     13   12
2017| 12    6    1