这是我想做的事情:
关于这个DF:
df = pd.DataFrame(columns=['Entry', 'Exit'], data=np.array([[257, 259],
[259, 260],
[270, 271],
[271, 273],
[272, 274],
[305, 305],
[317, 320],
[323, 326],
[324, 326],
[325, 328],
[326, 329],
[335, 337]]), index=[3509, 3511, 3522, 3523, 3524, 3557, 3569, 3575, 3576, 3577, 3578, 3587])
我希望标记每一行(稍后将其用作掩码),其中“Entry”值高于当前行之前的任何“Exit”值。但只考虑该条件尚未为True的行的“退出”值。
我提出的第一个想法并不能真正完成这项工作,因为它忽略了第二个条件:
df['NoTradeFirst'] = np.where(df.Entry < df.Exit.cummax().shift(1), 1, 0)
所以我想出了以下功能:
def find_no_trade_bars(s):
last = 0
no_trades = list()
for entry, exit in s.items():
if entry >= last:
last = exit
else:
no_trades.append(entry)
return(no_trades)
no_trades = find_no_trade_bars(df[['Entry', 'Exit']].set_index('Entry').Exit)
df['ReallyNoTrade'] = np.where(df.Entry.isin(no_trades), 1, 0)
调用时会产生以下DF:
正如预期的那样'NoTradeFirst'几乎正确,除了'Entry'326应该是0而不是1,因为之前的行'Exit'应该被忽略,因为前一行的条件已经为真。
我确定有一些方法可以做到这一点,可能是使用.groupby()或一些滚动功能,但我无法自己弄明白。
所以希望有人知道如何做到这一点大熊猫/ numpy方式。我的主要目标是获得潜在的性能提升。
谢谢!
马