根据KDB中每天的间隔数对每行进行分类?

根据KDB中每天的间隔数对每行进行分类?,kdb,Kdb,鉴于下表: 初始表格: shop | time ----------- A | 1000 A | 1100 B | 1130 B | 1131 C | 1132 A | 1133 A | 1134 B | 1230 C | 1232 C | 1400 shop | time | mark Number of times a shop has appeared within an interval. ------

鉴于下表:

初始表格:

shop | time    
-----------
  A  | 1000
  A  | 1100
  B  | 1130
  B  | 1131
  C  | 1132
  A  | 1133
  A  | 1134
  B  | 1230
  C  | 1232
  C  | 1400
   shop | time |  mark  Number of times a shop has appeared within an interval.
   --------------------
 1)  A  | 1000 |   0    [A = 1]
 2)  A  | 1100 |   0    [A = 2]
 3)  B  | 1130 |   0    [A = 2, B = 1]
 4)  B  | 1131 |   0    [A = 2, B = 2]
 5)  C  | 1132 |   0    [A = 2, B = 2, C = 1]
 6)  A  | 1133 |   0    [A = 2, B = 2, C = 1]
 7)  A  | 1134 |   1    [A = 3 (Mark cell), B = 2, C = 1]
 8)  B  | 1230 |   1    [A = 1, B = 3 (Mark cell), C = 1]
 9)  C  | 1232 |   0    [A = 1, B = 1, C = 2]
10)  C  | 1400 |   0    [A = 1, B = 1, C = 0]
结果表:

shop | time    
-----------
  A  | 1000
  A  | 1100
  B  | 1130
  B  | 1131
  C  | 1132
  A  | 1133
  A  | 1134
  B  | 1230
  C  | 1232
  C  | 1400
   shop | time |  mark  Number of times a shop has appeared within an interval.
   --------------------
 1)  A  | 1000 |   0    [A = 1]
 2)  A  | 1100 |   0    [A = 2]
 3)  B  | 1130 |   0    [A = 2, B = 1]
 4)  B  | 1131 |   0    [A = 2, B = 2]
 5)  C  | 1132 |   0    [A = 2, B = 2, C = 1]
 6)  A  | 1133 |   0    [A = 2, B = 2, C = 1]
 7)  A  | 1134 |   1    [A = 3 (Mark cell), B = 2, C = 1]
 8)  B  | 1230 |   1    [A = 1, B = 3 (Mark cell), C = 1]
 9)  C  | 1232 |   0    [A = 1, B = 1, C = 2]
10)  C  | 1400 |   0    [A = 1, B = 1, C = 0]
其中:

  • t
    =1小时

  • n
    =3

对于固定时间间隔
t
,如果
n
t
中有多个事务,请将该行标记为true
1
。否则标记为
0

说明:

shop | time    
-----------
  A  | 1000
  A  | 1100
  B  | 1130
  B  | 1131
  C  | 1132
  A  | 1133
  A  | 1134
  B  | 1230
  C  | 1232
  C  | 1400
   shop | time |  mark  Number of times a shop has appeared within an interval.
   --------------------
 1)  A  | 1000 |   0    [A = 1]
 2)  A  | 1100 |   0    [A = 2]
 3)  B  | 1130 |   0    [A = 2, B = 1]
 4)  B  | 1131 |   0    [A = 2, B = 2]
 5)  C  | 1132 |   0    [A = 2, B = 2, C = 1]
 6)  A  | 1133 |   0    [A = 2, B = 2, C = 1]
 7)  A  | 1134 |   1    [A = 3 (Mark cell), B = 2, C = 1]
 8)  B  | 1230 |   1    [A = 1, B = 3 (Mark cell), C = 1]
 9)  C  | 1232 |   0    [A = 1, B = 1, C = 2]
10)  C  | 1400 |   0    [A = 1, B = 1, C = 0]
  • 第1行到第2行,A
    t
    内进行两次交易

  • 第3行到第4行,B
    t
    内进行两次交易

  • 第5行,C有它的第一个事务

  • 第6行,A进行另一个事务,但单元格未标记为-此事务与第一个事务之间的间隔超过
    t
    (1000->1133)

  • 第7行,行标记为A
    t
    (1100->1133->1134)中有
    n
    事务

  • 第8行,行标记为B
    t
    中有
    n
    交易(1130->1131->1230)

  • 第9行和第10行,C进行两次交易,但当间隔超过
    t
    (1132->1232-->1400)时未标记

此外,这将每天刷新(格式
yyyyymmdd
中包含一列
DealDate

本质上,这模拟了每个商店的一个队列,其中推到堆栈中的每个项目都将根据队列中的项目数量进行标记,最后一个项目超出弹出的间隔

我如何在KDB中用Q实现这一点?日期和时间戳按降序排列

您可以使用:

q)table:([]shop:`A`A`B`B`C`A`A`B`C`C; time:1000 1100 1130 1131 1132 1133 1134 1230 1232 1400)
q)t:100
q)n:3
q)update mark:t>=(t+1)^time-(n-1)xprev time by shop from table
shop time mark
--------------
A    1000 0
A    1100 0
B    1130 0
B    1131 0
C    1132 0
A    1133 0
A    1134 1
B    1230 1
C    1232 0
C    1400 0
这将计算每个单元格与该商店(
by shop
)在其后面两行(
time-(n-1)xprev time
)出现的单元格之间的时间差

然后,它用大于t的值填充空值,因为我们不希望包含这些单元格(
(t+1)^

然后它检查三个时间中最早的时间是否在当前时间的1小时内,并在其中指定1,这是真的(
t>=

还可以通过包括dealDate的
来为每个日期刷新:

table:([]dealDate:(10#20190704),10#20190705;shop:20#`A`A`B`B`C`A`A`B`C`C; time:20#1000 1100 1130 1131 1132 1133 1134 1230 1232 1400)
q)update mark:t>=(t+1)^time-(n-1)xprev time by dealDate,shop from table
dealDate shop time mark
-----------------------
20190704 A    1000 0
20190704 A    1100 0
20190704 B    1130 0
20190704 B    1131 0
20190704 C    1132 0
20190704 A    1133 0
20190704 A    1134 1
20190704 B    1230 1
20190704 C    1232 0
20190704 C    1400 0
20190705 A    1000 0
20190705 A    1100 0
20190705 B    1130 0
20190705 B    1131 0
20190705 C    1132 0
20190705 A    1133 0
20190705 A    1134 1
20190705 B    1230 1
20190705 C    1232 0
20190705 C    1400 0
您可能希望dealDate列采用日期格式,而不是YYYYMMDD,因为YYYYMMDD可能是一个很长的字段。例如,您可以使用
“D”$string 20190705将20190705转换为2019.07.05数据,从而更改20190705。您可以使用:

q)table:([]shop:`A`A`B`B`C`A`A`B`C`C; time:1000 1100 1130 1131 1132 1133 1134 1230 1232 1400)
q)t:100
q)n:3
q)update mark:t>=(t+1)^time-(n-1)xprev time by shop from table
shop time mark
--------------
A    1000 0
A    1100 0
B    1130 0
B    1131 0
C    1132 0
A    1133 0
A    1134 1
B    1230 1
C    1232 0
C    1400 0
这将计算每个单元格与该商店(
by shop
)在其后面两行(
time-(n-1)xprev time
)出现的单元格之间的时间差

然后,它用大于t的值填充空值,因为我们不希望包含这些单元格(
(t+1)^

然后它检查三个时间中最早的时间是否在当前时间的1小时内,并在其中指定1,这是真的(
t>=

还可以通过包括dealDate的
来为每个日期刷新:

table:([]dealDate:(10#20190704),10#20190705;shop:20#`A`A`B`B`C`A`A`B`C`C; time:20#1000 1100 1130 1131 1132 1133 1134 1230 1232 1400)
q)update mark:t>=(t+1)^time-(n-1)xprev time by dealDate,shop from table
dealDate shop time mark
-----------------------
20190704 A    1000 0
20190704 A    1100 0
20190704 B    1130 0
20190704 B    1131 0
20190704 C    1132 0
20190704 A    1133 0
20190704 A    1134 1
20190704 B    1230 1
20190704 C    1232 0
20190704 C    1400 0
20190705 A    1000 0
20190705 A    1100 0
20190705 B    1130 0
20190705 B    1131 0
20190705 C    1132 0
20190705 A    1133 0
20190705 A    1134 1
20190705 B    1230 1
20190705 C    1232 0
20190705 C    1400 0

您可能希望dealDate列采用日期格式,而不是YYYYMMDD,因为YYYYMMDD可能是一个很长的字段。例如,您可以使用
“D”$string 20190705

Nice将20190705转换为2019.07.05数据,从而更改20190705。需要指出的是,此解决方案要求项目在表中按顺序排序。您可以使用
dealDate
time xasc tableNeat解决方案对表进行排序。如果您考虑降低到目前为止的大小,那么强制时间成为int也是同样值得的。是的,这可以用“U”$string 1232来完成,但是您还必须更改解决方案,使t:60而不是nice。需要指出的是,此解决方案要求项目在表中按顺序排序。您可以使用
dealDate
time xasc tableNeat解决方案对表进行排序。如果您考虑降低到目前为止的大小,那么强制时间变为int也是同样值得的。是的,这可以用“U”$string 1232来完成,但是您还必须更改解决方案,以便改为t:60