gpt4 book ai didi

kdb - 在特定条件下对 kdb 中的数据进行分组

转载 作者:行者123 更新时间:2023-12-03 22:09:03 26 4
gpt4 key购买 nike

我有一个名为 raw 的主数据框,如下所示:
tab:([]date:2018.02.05 2018.02.05 2018.02.06 2018.02.06;time:01:30:25.000 02:30:45.000 04:15:15.000 02:15:15.000;vol:50 55 64 12; name:`A`B`B`A)

date           time         vol     name   
2018.02.05 1:30:25 50 A
2018.02.05 2:30:45 55 B
2018.02.06 4:15:15 64 B
2018.02.06 2:15:15 12 A

我需要根据以下条件创建一个新表:

在两个特定日期之间,我需要在两小时内查找名称 B 的累积 vol 为 100 的时间。

我认为应该工作的逻辑:按时间升序排列数据。将所有 vol by name= `B 添加到 (time[i]: time[i]+2hrs) 内的时间。如果 cum vol > 100,则返回时间间隔和相应的日期。继续 i +1 。我是 kdb 的新手,所以我在实现它时遇到了困难。

示例输出:
time1          time2         date1         date2
1:30:00 3:30:00 2018.02.05 2018.02.05
23:00:00 1:00:00 2018.02.05 2018.02.06

对此的任何线索表示赞赏。谢谢

最佳答案

我相信使用 aj 可以解决您的问题

最初正如您所指出的,该表应按时间排序

`time xasc `tab;

然后,应使用 sums 创建卷的累积总和
tab:update cumvol:sums vol by name from tab

然后使用 aj - 获取每次不在 2 小时内的卷的累积总和。
aj[`name`time;tab;select time:time+02:00,name,cumvol2:cumvol from tab]

然后我们可以执行 cumvol - cumvol2 来获得每 2 小时内的总体积
tab:select time, name, runningvol:cumvol-0^cumvol2 from 
aj[`name`time;tab;select time:time+02:00,name,cumvol2:cumvol from tab]

然后简单的select语句就可以得到cumvol大于100的次数
select time,time+02:00 from tab where runningvol>100

可以对此添加的改进是在 aj 中的第二个表上添加分组属性。
对此的另一个改进是将日期和时间格式化为单个时间戳或日期时间。

可以在此处找到有关函数 aj 和 sums 的更多信息:

http://code.kx.com/q/ref/joins/#aj-aj0-asof-join

http://code.kx.com/q/ref/arith-integer/#sums

关于kdb - 在特定条件下对 kdb 中的数据进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49047381/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com