【问题标题】:KDB marginal percentagesKDB 边际百分比
【发布时间】:2014-08-12 17:10:24
【问题描述】:

考虑一下表格 T,当它被制成表格时,它看起来像这样:

select sum Qty by Flag1,Flag2 from T

Flag1 Flag2 Qty
`Sunny `Hot 20
`Sunny `Cold 40
`Rainy `Hot 60
`Rainy `Cold 80

1) 是否有一种巧妙的方法可以计算落入每个桶 (0.1,0.2,0.3,0.4) 的总数量的总比例?显然可以做类似的事情

select Qty % sum Qty from select sum Qty by Flag1,Flag2 from T

但是有没有办法一口气做到这一点(即只有一个 select/exec 语句),因为如果你对很多变量都这样做,这可能会有点麻烦?

2) 现在假设我想创建一个列,该列具有 Qty 的相对分数,但被 Flag1 边缘化。如何创建下表?

Flag1 Flag2 Qty FracByFlag1
`Sunny `Hot 20  0.333
`Sunny `Cold 40 0.667
`Rainy `Hot 60 0.429
`Rainy `Cold 80 0.571

【问题讨论】:

    标签: kdb


    【解决方案1】:

    1)我认为在除法时分别对列的数量求和是最简单的:

    update (sum Qty) % sum T[`Qty] by Flag1, Flag2 from T
    

    2) fby 正是您所追求的:

    update FracByFlag1: Qty % (sum;Qty) fby Flag1 from T
    

    【讨论】:

      【解决方案2】:

      我认为您必须权衡“漂亮”与高效且易于阅读的好处。双重选择可能只是更好的方法。

      一个有趣的扩展是:如果您需要查看基于不同标志的不同子比率,但都在同一个表中(并且在单个选择中),该怎么办?下面的解决方案可以实现这一点,但我再次强调这种方法效率非常低 - 只是为了“漂亮”而展示它

      q)T:([] Flag1:`Sunny`Sunny`Sunny`Sunny`Rainy`Rainy`Rainy`Rainy;Flag2:`Hot`Hot`Cold`Cold`Hot`Hot`Cold`Cold;Qty:10 10 20 20 30 30 40 40);
      q)
      q)T
      Flag1 Flag2 Qty
      ---------------
      Sunny Hot   10
      Sunny Hot   10
      Sunny Cold  20
      Sunny Cold  20
      Rainy Hot   30
      Rainy Hot   30
      Rainy Cold  40
      Rainy Cold  40
      
      q)myGroup:{@[;raze g] raze s%sum each s:sum each flip each y g:group x}
      q)
      q)select Flag1,Flag2,sum'[Qty],both:sum'[Qty]%sum raze Qty,f1:myGroup[Flag1;Qty],f2:myGroup[Flag2;Qty] from `Flag1`Flag2 xgroup T
      Flag1 Flag2 Qty both f1        f2
      ----------------------------------------
      Sunny Hot   20  0.1  0.3333333 0.25
      Sunny Cold  40  0.2  0.6666667 0.3333333
      Rainy Hot   60  0.3  0.4285714 0.75
      Rainy Cold  80  0.4  0.5714286 0.6666667
      

      【讨论】:

      • 我同意我认为您必须权衡“漂亮”与高效且易于阅读的好处。双选可能是更好的方法。 最短的代码并不总是意味着高效或用户友好。
      【解决方案3】:

      您可能需要考虑将其设为函数式表单查询

      more info on functional form here

      q)t:([]f1:raze 2#'`s`r; f2:4#`h`c; qty:20 40 60 80)
      q)p:{![x;();y;enlist[`pct]!enlist (%;z;(sum;z))]}
      q)p[t;0b;`qty]
      f1 f2 qty pct
      -------------
      s  h  20  0.1
      s  c  40  0.2
      r  h  60  0.3
      r  c  80  0.4
      q)p[t;enlist[`f1]!enlist `f1;`qty]
      f1 f2 qty pct      
      -------------------
      s  h  20  0.3333333
      s  c  40  0.6666667
      r  h  60  0.4285714
      r  c  80  0.5714286
      

      【讨论】:

      • 我认为您在第一个查询中错过了“group by”子句。这里的问题是我们想要总和数量(按组)与总数量(表)的比率。我不确定我们是否可以使用一个 select/exec 语句来做到这一点,除非我们单独计算整个表的总和数量并在查询中使用它.
      • 啊,我假设 t 已经提供了组总和,并且他想要的只是 1 个函数,该函数足够通用,可以计算构成给定分组的百分比(即 @987654324 @ 代表整个表格,enlist[`f1]!enlist `f1 代表 f1 的组。
      猜你喜欢
      • 1970-01-01
      • 2015-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2012-09-05
      • 1970-01-01
      相关资源
      最近更新 更多