【问题标题】:kdb/q -- cumulative sum by symbol, but with a capkdb/q -- 按品种累积总和,但有上限
【发布时间】:2020-04-25 16:04:18
【问题描述】:

例如在下表中,我想在表的“val”列上运行累积和,按符号列分组。但我想通过“cap”列中的值来限制累积总和。如果累积总和超过上限,我将其限制在该值。对于下一个值,我会将其添加到上限值之上:

示例(以及更好的图片格式)。我得到输入日期、符号、val、cap,我想在“cumval”列中产生输出。

date        sym     val  cap cumval
-----------------------------------
2020.01.01  AAPL    100  200 100
2020.01.02  AAPL    100  200 200
2020.01.03  AAPL    100  200 200
2020.01.04  AAPL    -100 200 100
2020.01.01  MSFT    100  300 100
2020.01.02  MSFT    100  300 200
2020.01.03  MSFT    100  300 300
2020.01.04  MSFT    100  400 400

【问题讨论】:

    标签: kdb


    【解决方案1】:

    您需要使用自定义累积来实现您的结果。内置的sums 函数使用二进制累加器\。要添加上限逻辑,您需要使用ternary scan accumulator。以下将工作{z&x+y}\。第一个参数是初始值,在您的情况下为零。第二个参数是累计值,第三个参数是上限值。

    q)show t:([]date:2020.01.01 2020.01.02 2020.01.03 2020.01.04 2020.01.01 2020.01.02 2020.01.03 2020.01.04;sym:`AAPL`AAPL`AAPL`AAPL`MSFT`MSFT`MSFT`MSFT;val:100 100 100 -100 100 100 100 100;cap:200 200 200 200 300 300 300 400)
    date       sym  val  cap
    ------------------------
    2020.01.01 AAPL 100  200
    2020.01.02 AAPL 100  200
    2020.01.03 AAPL 100  200
    2020.01.04 AAPL -100 200
    2020.01.01 MSFT 100  300
    2020.01.02 MSFT 100  300
    2020.01.03 MSFT 100  300
    2020.01.04 MSFT 100  400
    q)update cumval:{z&x+y}\[0;val;cap] by sym from t
    date       sym  val  cap cumval
    -------------------------------
    2020.01.01 AAPL 100  200 100
    2020.01.02 AAPL 100  200 200
    2020.01.03 AAPL 100  200 200
    2020.01.04 AAPL -100 200 100
    2020.01.01 MSFT 100  300 100
    2020.01.02 MSFT 100  300 200
    2020.01.03 MSFT 100  300 300
    2020.01.04 MSFT 100  400 400
    

    【讨论】:

      猜你喜欢
      • 2021-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-11
      • 1970-01-01
      • 1970-01-01
      • 2019-01-23
      • 2019-02-15
      相关资源
      最近更新 更多