Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
根据标准在KDB中标记前N个天数的值?_Kdb - Fatal编程技术网

根据标准在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
值的公司

希望这有帮助

凯文