如何使用更快的pandas-only方法替换这种慢速过滤功能?

时间:2017-02-13 10:20:49

标签: python pandas numpy optimization dataframe

这是我想做的事情:

关于这个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:

DataFrame Result

正如预期的那样'NoTradeFirst'几乎正确,除了'Entry'326应该是0而不是1,因为之前的行'Exit'应该被忽略,因为前一行的条件已经为真。

我确定有一些方法可以做到这一点,可能是使用.groupby()或一些滚动功能,但我无法自己弄明白。

所以希望有人知道如何做到这一点大熊猫/ numpy方式。我的主要目标是获得潜在的性能提升。

谢谢!

0 个答案:

没有答案