Python 如何使用一种仅使用更快的方法来替换这种缓慢的过滤功能?

Python 如何使用一种仅使用更快的方法来替换这种缓慢的过滤功能?,python,pandas,numpy,optimization,dataframe,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

以下是我想做的:

关于此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”值的位置(以便以后将其用作掩码)。但只考虑尚未满足该条件的行的“退出”值

我提出的第一个想法不会真正起作用,因为它忽略了第二个条件:

df['NoTradeFirst'] = np.where(df.Entry < df.Exit.cummax().shift(1), 1, 0)
调用时,会产生以下DF:

正如预期的那样,“NoTradeFirst”几乎正确,但“Entry”326除外,它应该是0而不是1,因为前一行的“Exit”应该被忽略,因为前一行的条件已经为true

我确信有某种方法可以做到这一点,可能是使用.groupby()或一些滚动函数,但我自己就是想不出来

所以希望有人知道如何用熊猫/裸体的方式来做这件事。我的主要目标是潜在的绩效提升

谢谢


马可

我认为这不是一个可矢量化的过程,所以努比和熊猫将很难适应。如果你想要一些高效的东西,你可能需要研究一下
itertools
。你想要达到什么目的还不是很清楚。你能给出一个精确的定义吗?当你写“其中‘进入’值高于之前的任何‘退出’值”时,我假设你的意思是“更小”?当您写“但仅考虑该条件尚未为真的行的‘退出’值”时。我假定您指的是尚未根据以前的条件标记的条目(即,不指退出值是否已用于比较)?续:您的数据是否以某种方式结构化?从您的示例和函数中,我假设对于每个数据点
条目,它都很慢,因为它使用了许多
for
循环,如果您能找到
itertools
解决方案,这些循环可能会被c代码所取代。但是稍微挖掘一下,似乎熊猫和itertools不能很好地结合在一起。一般来说,如果元素
out[i]
依赖于
func(In[:i])
,它不是一个可向量化的过程,而是离散的动态过程。有时候,数论救了你,它实际上是一个隐藏的线性过程,但不经常,我很确定在这种情况下不是这样的。
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)