Python - 迭代 pandas DataFrame 直到满足条件,然后继续迭代直到满足不同的条件

Python - iterate over pandas DataFrame until condition is met, then continue iterating until a different condition is met

我有一个如下形式的 pandas DataFrame (new_df):

index   open      high      low       close       buy     sell    sl_price    tp_price
9124    1.12593   1.12690   1.12340   1.12519     0.0     0.0       
9125    1.12519   1.12714   1.12401   1.12542     1.0     0.0     1.11289     1.13794
9126    1.12542   1.12551   1.12462   1.12477     0.0     0.0       
9127    1.12477   1.12504   1.12390   1.12395     0.0     0.0       
9128    1.12395   1.12450   1.12326   1.12392     0.0     0.0       
9129    1.12392   1.12554   1.12050   1.12077     0.0     0.0       
9130    1.12077   1.12201   1.11085   1.12068     0.0     0.0       
9131    1.12068   1.12160   1.11860   1.11957     0.0     0.0       

'open' 'high' 'low' 'close' 列都是价格。 'buy' 和 'sell' 列包含 0 或 1。'sl_price' 和 'tp_price' 是 nan,除非 'buy' = 1 或 'sell' = 1,那么它们也是价格。

我想遍历'buy'列,直到看到一个1,此时我想记录关联的sl_price和tp_price,然后逐行往下,如果我第一次看到一个小于 'sl_price' 的 'low' 值,我想将 -1 附加到名为 long_trades 的空白列表中。但是如果我第一次看到一个大于 'tp_price' 的 'high' 值,我想将 1 添加到 long_trades 列表中。无论这 2 个条件中的哪个先满足,我想将 1 或 -1 附加到 long_trades 列表,然后让程序返回搜索 'buy' = 1,并再次重复该过程。

可以安全地假设这两个条件(低 < sl_price 和高 > tp_price)永远不会同时满足(行)。

我希望这是有道理的。希望我在下面的尝试可以澄清我正在尝试做的事情。我想答案将是 for/while 循环的一些组合,但我无法理解逻辑。

这是我想出的:

long_trades = []

for i in range(len(new_df['buy'])):
    
    trade_on = False
    
    if new_df['buy'][i] == 1:
        trade_on = True
        sl, tp = new_df['sl_price'][i], new_df['tp_price'][i]
        
        while trade_on == True:

            if new_df['low'][i] < sl:
                long_trades.append(-1)
                trade_on = False
            
            if new_df['high'][i] > tp:
                long_trades.append(1)
                trade_on = False

但是当我 运行 这个控制台永远 运行 并且 long_trades 列表永远不会填充并且我必须停止控制台中断。我认为它陷入了无限循环,但我看不出是怎么回事。

感谢您的宝贵时间!

您的代码卡在了 while 循环中,因为它从不更新 i 所以您只是一遍又一遍地检查同一行。

        while trade_on == True:
            # code gets stuck here because i isn't updated

            if new_df['low'][i] < sl:
                long_trades.append(-1)
                trade_on = False
            
            if new_df['high'][i] > tp:
                long_trades.append(1)
                trade_on = False

因此,我们可以像这样显式地使用循环和中断:

        for j in range(i, len(new_df['buy'])):          
            # I am assuming here you want to go back to the row
            # where you first encountered a 1 after this loop

            if new_df['low'][j] < sl:
                long_trades.append(-1)
                break
            
            if new_df['high'][j] > tp:
                long_trades.append(1)
                break