【问题标题】:kdb how to calculate rolling countkdb如何计算滚动计数
【发布时间】:2017-05-16 09:05:05
【问题描述】:

假设我有一个包含时间戳和类型的事件表。

t1, 'b'
t2, 'x'
t3, 's'
t4, 'b'

我怎样才能得到一个滚动计数,这样它会给我一个包含所有时间戳的列表和最多 taht ts 的事件的累积数量,有点像 sums 的计数版本

for example for 'b' I d like a table

't1', 1
't2', 1
't3', 1
't4', 2

【问题讨论】:

    标签: kdb


    【解决方案1】:

    这是一种方法,尽管可能有一种更聪明的方法来使用总和:

    //table definition
    tab:([]a:`t1`t2`t3`t4;b:"bxsb")
    
    //rolling sum of 1 by column b
    update sums count[i]#1 by b from tab 
    

    结果:

    a  b x
    ------
    t1 b 1
    t2 x 1
    t3 s 1
    t4 b 2
    

    如果您想替换 b,您只需将 b: 放在 sums 前面。

    【讨论】:

      【解决方案2】:

      一种方式:

      q)t:([]p:asc 4?.z.p+til 1000;t:`b`x`s`b)
      q)asc `p xcols ungroup select p,til count i by t from t
      p                             t x
      ---------------------------------
      2017.05.16D09:42:48.259062090 b 0
      2017.05.16D09:42:48.259062585 x 0
      2017.05.16D09:42:48.259062683 s 0
      2017.05.16D09:42:48.259062858 b 1
      

      Ps:请注意,我已经从 0 开始序列,就好像说“我在这一行之前有 0 个事件”,而不是按照您的示例从 1 开始。它与您的请求“到该 ts 的事件数”有关。如果您需要 1,只需添加 1 '1+til count i'。还要确保您的时间已排序,以便在开始序列时有意义。

      【讨论】:

        【解决方案3】:

        如下表t

        q)show t: ([]ts:.z.t - desc "u"$(til 4);symb:`b`x`z`b)
        ts           symb
        -----------------
        09:46:56.384 b
        09:47:56.384 x
        09:48:56.384 z
        09:49:56.384 b
        

        使用向量条件:

        q)select ts, cum_count:sums ?[symb=`b;1;0] from t
        ts           cum_count
        ----------------------
        09:46:56.384 1
        09:47:56.384 1
        09:48:56.384 1
        09:49:56.384 2
        

        相同,但函数以symb为参数:

        q){select ts, cum_count:sums ?[symb=x;1;0] from t}[`b]
        ts           cum_count
        ----------------------
        09:46:56.384 1
        09:47:56.384 1
        09:48:56.384 1
        09:49:56.384 2
        

        事实上,您不需要条件向量,因为您可以直接对布尔值求和:

        q){select ts, cum_count:sums symb=x from t}[`b]
        ts           cum_count
        ----------------------
        09:46:56.384 1
        09:47:56.384 1
        09:48:56.384 1
        09:49:56.384 2
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-26
          相关资源
          最近更新 更多