我有一张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
};
1 个回答