KDB/Q中的行之间的差异

KDB/Q中的行之间的差异,kdb,Kdb,我是KDB/Q新手,有一个关于两个不一定相邻的行之间的差异的问题 我只有一张表,如下所示: q)tickers:`ibm`bac`dis`gs`ibm`gs`dis`bac q)pxs:100 50 30 250 110 240 45 48 q)dates:2013.05.01 2013.01.05 2013.02.03 2013.02.11 2013.06.17 2013.06.21 2013.04.24 2013.01.06 q)trades:([tickers;dates];pxs) q

我是KDB/Q新手,有一个关于两个不一定相邻的行之间的差异的问题

我只有一张表,如下所示:

q)tickers:`ibm`bac`dis`gs`ibm`gs`dis`bac
q)pxs:100 50 30 250 110 240 45 48
q)dates:2013.05.01 2013.01.05 2013.02.03 2013.02.11 2013.06.17 2013.06.21 2013.04.24 2013.01.06

q)trades:([tickers;dates];pxs)
q)trades
tickers dates     | pxs
------------------| ---
ibm     2013.05.01| 100
bac     2013.01.05| 50
dis     2013.02.03| 30
gs      2013.02.11| 250
ibm     2013.06.17| 110
gs      2013.06.21| 240
dis     2013.04.24| 45
bac     2013.01.06| 48
我希望能够在表中有另一列存储当前和以前价格之间的差异,或者有另一个结构类似的结构。结果需要回答的关键问题是,与上一次记录价格相比,股票变化了多少

到目前为止,我已经尝试了以下几点:

select tickers, dates, pxs - pxs(dates bin (exec dates from trades where tickers = trades.tickers)) from trades
这根本不起作用。当然,这是因为尝试进行类似SQL的查询,并且有一种面向行的思维方式

下面是一个备受追捧的答案示例:

q)trades: do magic with trades
q)trades
tickers dates     | pxs | delta
------------------| --- | -----
ibm     2013.05.01| 100 | 0
bac     2013.01.05| 50  | 0
dis     2013.02.03| 30  | 0
gs      2013.02.11| 250 | 0
ibm     2013.06.17| 110 | 10
gs      2013.06.21| 240 | -10
dis     2013.04.24| 45  | 15
bac     2013.01.06| 48  | -2
谢谢你的帮助, Dan

如果您这样做:

select pxs by dates,tickers from table
您将有一个复杂的pxs列,它是特定日期和股票代码的价格列表。然后可以应用增量:

select deltas pxs by dates,tickers from table
这将给你带来跑步的不同。第一个值是原始pxs,因此需要将第一个值更新为0

编辑

只要重新阅读并查看您的结果,您就需要重新加入原始交易表,如果您这样做:

select pxs by dates,tickers from table
q)update delta:{0,1_deltas x}pxs by tickers from trades
   tickers dates     | pxs delta
   ------------------| ---------
   ibm     2013.05.01| 100 0
   bac     2013.01.05| 50  0
   dis     2013.02.03| 30  0
   gs      2013.02.11| 250 0
   ibm     2013.06.17| 110 10
   gs      2013.06.21| 240 -10
   dis     2013.04.24| 45  15
   bac     2013.01.06| 48  -2
您将有一个复杂的pxs列,它是特定日期和股票代码的价格列表。然后可以应用增量:

select deltas pxs by dates,tickers from table
这将给你带来跑步的不同。第一个值是原始pxs,因此需要将第一个值更新为0

编辑


只要重新阅读并查看您的结果,您就需要重新加入原始交易表

更新日期,pxs,delta:0N,-1_pxs-1_pxs,由交易中的股票报价器进行

q)update delta:{0,1_deltas x}pxs by tickers from trades
   tickers dates     | pxs delta
   ------------------| ---------
   ibm     2013.05.01| 100 0
   bac     2013.01.05| 50  0
   dis     2013.02.03| 30  0
   gs      2013.02.11| 250 0
   ibm     2013.06.17| 110 10
   gs      2013.06.21| 240 -10
   dis     2013.04.24| 45  15
   bac     2013.01.06| 48  -2
请查看其工作原理: 从交易中按票证选择pxs 创建包含以下行的表:票证和列表pxs。 因此,在每一行中,我们都有一个列表:

tickers| pxs -------| ------- bac | 50 48 dis | 30 45 gs | 250 240 ibm | 100 110 现在我们必须应用函数来计算delta。上面提到的最佳函数:delta,但我的版本大致相同


如果我们选择-那么我们将有一个带有标记器的表| pxs列表| Delta列表,但我们是否使用更新。。通过,然后它将分组值解组。

更新日期,pxs,delta:0N,-1_pxs-1_pxs,由交易中的报价器进行

请查看其工作原理: 从交易中按票证选择pxs 创建包含以下行的表:票证和列表pxs。 因此,在每一行中,我们都有一个列表:

tickers| pxs -------| ------- bac | 50 48 dis | 30 45 gs | 250 240 ibm | 100 110 现在我们必须应用函数来计算delta。上面提到的最佳函数:delta,但我的版本大致相同


如果我们选择-那么我们将有一个带有标记器的表| pxs列表| Delta列表,但我们是否使用更新。。到,然后将分组值解组。

使用prev函数可以获得相同的结果。值得强调的一点是,prev会自动将null 0N添加为第一个元素。这一点很重要,因为我们没有以前的可用信息,但是,添加0作为第一个元素表明没有任何更改;尽管这取决于您希望如何处理第一条记录

q)update delta:pxs-prev[pxs] by tickers from trades
tickers dates     | pxs delta
------------------| ---------
ibm     2013.05.01| 100
bac     2013.01.05| 50
dis     2013.02.03| 30
gs      2013.02.11| 250
ibm     2013.06.17| 110 10
gs      2013.06.21| 240 -10
dis     2013.04.24| 45  15
bac     2013.01.06| 48  -2
使用增量获得相同的结果0N而不是0


使用prev函数可以得到相同的结果。值得强调的一点是,prev会自动将null 0N添加为第一个元素。这一点很重要,因为我们没有以前的可用信息,但是,添加0作为第一个元素表明没有任何更改;尽管这取决于您希望如何处理第一条记录

q)update delta:pxs-prev[pxs] by tickers from trades
tickers dates     | pxs delta
------------------| ---------
ibm     2013.05.01| 100
bac     2013.01.05| 50
dis     2013.02.03| 30
gs      2013.02.11| 250
ibm     2013.06.17| 110 10
gs      2013.06.21| 240 -10
dis     2013.04.24| 45  15
bac     2013.01.06| 48  -2
使用增量获得相同的结果0N而不是0


一些解释你答案的措辞会使这成为一个有用的答案;简单地输入代码并不是真正的重点,因为它不能有效地进行教学。谢谢你的回答,也非常有用。用一些措辞解释你的答案会使这成为一个有用的答案;简单地键入代码并不是真正的重点,因为它不能有效地进行教学。谢谢你的回答,也非常有用。谢谢你的回答谢谢你的回答澄清内联匿名函数{0,1_deltas x}:逗号是列表联接运算符,1_u表示从deltas结果中删除第一个条目。由于调用函数时不使用“或each”,因此该函数仅使用整列数据调用一次。如果删除0,1_u,第一个增量将为100,这通常是不希望的行为。为了澄清内联匿名函数{0,1_udeltas x}:逗号是列表联接运算符,1_u表示从deltas结果中删除第一个条目。由于调用函数时不使用“或each”,因此该函数仅使用整列数据调用一次。如果删除0,1_u,第一个增量将为100,这通常是不希望出现的行为。