kdb / q - накопленная сумма по символу, но с заглушкой - PullRequest
0 голосов
/ 25 апреля 2020

Например, в приведенной ниже таблице я хочу запустить накопленную сумму в столбце «val» таблицы, сгруппированной по столбцу символов. но я хочу ограничить совокупную сумму значением в столбце "cap". Если совокупная сумма превышает предельное значение, я просто ограничиваю это значение. И к следующему значению я добавлю его до верхнего значения:

Пример (и лучший формат на рисунке). Мне дают ввод даты, sym, 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

enter image description here

1 Ответ

2 голосов
/ 25 апреля 2020

Вам нужно будет использовать собственный накопитель для достижения вашего результата. Встроенная функция sums использует двоичный аккумулятор \. Для добавления заглушки logi c вам понадобится аккумулятор троичного сканирования . Следующее будет работать {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
...