Q/KDB中如何逐行仅基于当前行与前一行应用公式?
我来帮你搞定kdb+里这个逐行计算的问题!你的需求是按sym分组后,每行都计算当前行和前一行的price之和对吧?咱们一步步来解决:
核心思路
你要的其实是分组后的滑动窗口求和(窗口大小为2),kdb+里有两种常用方式实现,一种是用内置的高效函数,另一种是手动用Scan操作符\来实现逐行迭代逻辑。
方法1:用msum(最简洁高效)
kdb+的msum(移动求和)函数专门处理这类固定窗口的滚动计算,指定窗口大小为2就能直接得到每行的结果:
select rollingSum: 2 msum price by sym from data
- 小细节:每个
sym的第一行因为没有前一行,结果会是null。如果想让第一行直接返回自身的price,可以改成0N 2 msum price,这样第一行取当前值,从第二行开始计算两行之和。
方法2:用Scan操作符\手动实现
如果你想基于Scan的逐行迭代特性来写,可以结合fby分组,对每个sym的price序列,用Scan来跟踪前一行的值,再和当前行相加:
select rollingSum: {prev, prev+x}\[(); price] by sym from data
如果希望第一行不返回null,而是自身的price,可以调整初始值和逻辑:
select rollingSum: {if[count x=0; :y]; x+y}\[0; price] by sym from data
不过要注意,这种手动实现的效率不如内置的msum,如果数据集很大,优先用第一种方法。
为什么你原来的语句只返回单个数据点?
你之前写的select sum price from data where i=(last;i)fby sym,其实是只取每个sym组的最后两行求和,所以每个组只返回一个结果,而不是每行都输出。要实现逐行计算,需要对每个组的每一行应用窗口逻辑,而不是只筛选最后两行。
内容的提问来源于stack exchange,提问作者Fomalhaut -C
相关产品推荐
相关产品推荐

