根据标准在KDB中标记前N个天数的值?
初始表格根据标准在KDB中标记前N个天数的值?,kdb,Kdb,初始表格 company time value ------------------------- a 00:00:15.000 100 a 00:00:30.000 100 b 00:01:00.000 100 a 00:01:10.000 100 a 00:01:15.000 100 a 00:01:20.000 300 a 00:01:25.000 100 b
company time value
-------------------------
a 00:00:15.000 100
a 00:00:30.000 100
b 00:01:00.000 100
a 00:01:10.000 100
a 00:01:15.000 100
a 00:01:20.000 300
a 00:01:25.000 100
b 00:01:30.000 400
a 00:01:50.000 100
a 00:02:00.000 100
a 00:00:03.000 200
company time value x
--------------------------------
a 00:00:15.000 100 0 (First event A).
a 00:00:30.000 100 15 (30 - 15 / 2 events).
b 00:01:00.000 100 0 (First event of company B).
a 00:01:10.000 100 55/3 = 18.33 (1:10 - 0:15 / 3 events).
a 00:01:15.000 100 60/4 = 15 (1:15 - 0:15 / 4 events).
a 00:01:20.000 300 0 (Different value).
a 00:01:25.000 100 55/4 = 13.75 (01:25 - 0:30 / 4 events).
b 00:01:30.000 400 0 (Different value and company).
a 00:01:50.000 100 40/4 = 10 (01:50 - 01:10 / 4 events).
a 00:02:00.000 100 50/5 = 10 (02:00 - 01:10 / 5 events).
a 00:03:00.000 200 0 (Different value).
让t
=1小时。
对于每一行,我想回顾一下时间
进入t
的条目将形成一个时间窗口。我想获得max(时间窗口)-min(时间窗口)/事件数)
例如,如果现在是12:00
,总共有五个事件,12:00、11:50、11:40、11:30、10:30
,其中四个落在t
窗口中,即12:00、11:50、11:40、11:30
,结果将是12:00-11:30/4
此外,窗口应仅考虑具有相同值和公司名称的行
结果表
company time value
-------------------------
a 00:00:15.000 100
a 00:00:30.000 100
b 00:01:00.000 100
a 00:01:10.000 100
a 00:01:15.000 100
a 00:01:20.000 300
a 00:01:25.000 100
b 00:01:30.000 400
a 00:01:50.000 100
a 00:02:00.000 100
a 00:00:03.000 200
company time value x
--------------------------------
a 00:00:15.000 100 0 (First event A).
a 00:00:30.000 100 15 (30 - 15 / 2 events).
b 00:01:00.000 100 0 (First event of company B).
a 00:01:10.000 100 55/3 = 18.33 (1:10 - 0:15 / 3 events).
a 00:01:15.000 100 60/4 = 15 (1:15 - 0:15 / 4 events).
a 00:01:20.000 300 0 (Different value).
a 00:01:25.000 100 55/4 = 13.75 (01:25 - 0:30 / 4 events).
b 00:01:30.000 400 0 (Different value and company).
a 00:01:50.000 100 40/4 = 10 (01:50 - 01:10 / 4 events).
a 00:02:00.000 100 50/5 = 10 (02:00 - 01:10 / 5 events).
a 00:03:00.000 200 0 (Different value).
任何帮助都将不胜感激。如果有帮助的话,我问了一个类似的问题,效果非常好:
表查询
([] company:`a`a`b`a`a`a`a`b`a`a`a; time: 00:00:15.000 00:00:30.000 00:01:00.000 00:01:10.000 00:01:15.000 00:01:20.000 00:01:25.000 00:01:30.000 00:01:50.000 00:02:00.000 00:03:00.000; v: 100 100 100 100 100 300 100 400 100 100 200)
如果您的表格是按时间排序的,那么下面的解决方案将为您提供所需的结果。如果尚未使用
xasc
,您也可以按时间对表进行排序
我还修改了该表,使时间具有不同的小时值
q) t:([] company:`a`a`b`a`a`a`a`b`a`a`a; time: 00:15:00.000 00:30:00.000 01:00:00.000 01:10:00.000 01:15:00.000 01:20:00.000 01:25:00.000 01:30:00.000 01:50:00.000 02:00:00.000 03:00:00.000; v: 100 100 100 100 100 300 100 400 100 100 200)
q) f:{(`int$x-x i) % 60000*1+til[count x]-i:x binr x-01:00:00}
q) update res:f time by company,v from t
您可以修改函数f
来更改时间窗口值。或者更改f
,将其作为输入参数
说明:
我们通过公司将时间向量、值传递给函数f
。它从每个时间值中减去1小时,然后使用binr
从输入时间向量中获得1小时窗口范围内第一个时间项的索引
q) i:x binr x-01:00:00
q) 0 0 0 0 1 2 2
然后,它使用输出的索引来计算总计数。这里我将计数乘以60000,因为时间差是以毫秒为单位的,因为它将其转换为int
q) 60000*1+til[count x]-i
q) 60000 120000 180000 240000 240000 240000 300000
最后,我们减去每个值的最小和最大时间,然后除以上述计数。由于时间向量是有序的(升序),输入时间向量可以用作最大值,最小值位于i
引用的索引处
q) (`int$x-x i) % 60000*1+til[count x]-i
如果您的表格是按时间排序的,那么下面的解决方案将为您提供所需的结果。如果尚未使用
xasc
,您也可以按时间对表进行排序
我还修改了该表,使时间具有不同的小时值
q) t:([] company:`a`a`b`a`a`a`a`b`a`a`a; time: 00:15:00.000 00:30:00.000 01:00:00.000 01:10:00.000 01:15:00.000 01:20:00.000 01:25:00.000 01:30:00.000 01:50:00.000 02:00:00.000 03:00:00.000; v: 100 100 100 100 100 300 100 400 100 100 200)
q) f:{(`int$x-x i) % 60000*1+til[count x]-i:x binr x-01:00:00}
q) update res:f time by company,v from t
您可以修改函数f
来更改时间窗口值。或者更改f
,将其作为输入参数
说明:
我们通过公司将时间向量、值传递给函数f
。它从每个时间值中减去1小时,然后使用binr
从输入时间向量中获得1小时窗口范围内第一个时间项的索引
q) i:x binr x-01:00:00
q) 0 0 0 0 1 2 2
然后,它使用输出的索引来计算总计数。这里我将计数乘以60000,因为时间差是以毫秒为单位的,因为它将其转换为int
q) 60000*1+til[count x]-i
q) 60000 120000 180000 240000 240000 240000 300000
最后,我们减去每个值的最小和最大时间,然后除以上述计数。由于时间向量是有序的(升序),输入时间向量可以用作最大值,最小值位于i
引用的索引处
q) (`int$x-x i) % 60000*1+til[count x]-i
您可能希望使用以下工具:
q)update x:((time-time[time binr time-01:00:00])%60000)%count each v where each time within/:flip(time-01:00:00;time) by company,v from t
company time v x
---------------------------------
a 00:15:00.000 100 0
a 00:30:00.000 100 7.5
b 01:00:00.000 100 0
a 01:10:00.000 100 18.33333
a 01:15:00.000 100 15
a 01:20:00.000 300 0
a 01:25:00.000 100 13.75
b 01:30:00.000 400 0
a 01:50:00.000 100 10
a 02:00:00.000 100 10
a 03:00:00.000 200 0
它使用time binr time-01:00:00
获取每次前1小时的最小时间索引
然后(time-time[time binr time-01:00:00])%60000
以分钟为单位给出每次的时间范围(即时间-分钟时间)
计算每个v,其中每个时间在/:flip(time-01:00:00;time)
给出此范围内的行数
将二者分开并按公司实施,v
仅将其应用于具有相同公司
和v
值的公司
希望这有帮助
Kevin您可能希望使用以下命令:
q)update x:((time-time[time binr time-01:00:00])%60000)%count each v where each time within/:flip(time-01:00:00;time) by company,v from t
company time v x
---------------------------------
a 00:15:00.000 100 0
a 00:30:00.000 100 7.5
b 01:00:00.000 100 0
a 01:10:00.000 100 18.33333
a 01:15:00.000 100 15
a 01:20:00.000 300 0
a 01:25:00.000 100 13.75
b 01:30:00.000 400 0
a 01:50:00.000 100 10
a 02:00:00.000 100 10
a 03:00:00.000 200 0
它使用time binr time-01:00:00
获取每次前1小时的最小时间索引
然后(time-time[time binr time-01:00:00])%60000
以分钟为单位给出每次的时间范围(即时间-分钟时间)
计算每个v,其中每个时间在/:flip(time-01:00:00;time)
给出此范围内的行数
将二者分开并按公司实施,v
仅将其应用于具有相同公司
和v
值的公司
希望这有帮助
凯文