我有一张桌子
t
作为
q)trades: ([]
signalTime: 2024.01.05 2024.01.12 2024.01.19 2024.01.25 2024.02.02 2024.02.09 2024.02.16 2024.02.23 2024.03.01 2024.03.07;
exitTime: 2024.01.25 2024.02.01 2024.02.08 2024.02.15 2024.02.22 2024.02.29 2024.03.07 2024.03.14 2024.03.21 2024.03.28
);
signalTime exitTime
----------------------
2024.01.05 2024.01.25
2024.01.12 2024.02.01
2024.01.19 2024.02.08
2024.01.25 2024.02.15
2024.02.02 2024.02.22
2024.02.09 2024.02.29
2024.02.16 2024.03.07
2024.02.23 2024.03.14
2024.03.01 2024.03.21
2024.03.07 2024.03.28
我只想保留其干预日期(在
signalTime
和 exitTime
之间)不与任何其他交易(行)重叠的交易。或者,在任何给定日期内应该只有一笔交易。预期输出应该是
signalTime exitTime
----------------------
2024.01.05 2024.01.25
2024.02.02 2024.02.22
2024.02.23 2024.03.14
虽然我能够使用
do
循环构思解决方案,但我如何以更高效、更惯用的 q
来实现这一点?
这是我使用
do
循环解决方案的微弱尝试,尽管它并不完全正确。
removeOverlappingTrades:{[t]
n: count t;
accept: n#0b;
accept[0]: 1b;
lastExitTime: t[`exitTime][0];
do[n-1; {[t;lastExitTime;accept;x]
i: x+1; // Current index
if[t[`signalTime][i] >= lastExitTime;
accept[i]: 1b;
lastExitTime: t[`exitTime][i];
];
}[t;lastExitTime;accept] each til n-1];
t where accept
};
此逻辑返回的行具有一些未出现在任何其他行中的日期:
//Extract unique dates and rows associated
q)r:ungroup select row:i,dates:signalTime + til each 1+exitTime-signalTime from trades
//Filter on dates that only appear on one row
q)r:select distinct row from r where 1=(count;row) fby dates
q)r
row
---
0
9
//Extract the rows from the input table
q)trades r`row
signalTime exitTime
---------------------
2024.01.05 2024.01.25
2024.03.07 2024.03.28