有条件的四个单元以内

conditional within four units

我没有正确使用我的条件语句,不知道我是否需要 while 循环或 for 循环而不是我正在尝试的。我的代码想要做的是查看前四行的 tlbl 值,如果 tl > Upperbl < Lower 那么我们需要确保 (current_row['difference'] > 0) & (row_minus1['difference'] < 0).

第一步是检查 or 语句,意思是 row_minus1['tl'] > Upper or...row_minus4['tl'] > Upper...or row_minus4['bl'] < Lower,然后检查 (current_row['difference'] > 0) & (row_minus1['difference'] < 0) 条件。

for i in range(len(data)):
    # do something
    current_row = data.iloc[i,:]
    row_minus1 = data.iloc[i-1,:]
    row_minus2 = data.iloc[i-2,:]
    row_minus3 = data.iloc[i-3,:]
    row_minus4 = data.iloc[i-4,:]

    if ((current_row['difference'] > 0) & (row_minus1['difference'] < 0)) & 
      (((row_minus1['tl'] > Upper) or (row_minus1['bl'] < Lower) )) or
      ((row_minus2['tl'] > Upper) or (row_minus2['bl'] < Lower) )) or 
      ((row_minus3['tl'] > Upper) or (row_minus3['bl'] < Lower) )) or
      ((row_minus4['top_line'] > Upper) or (row_minus4['bl'] < Lower) ))) :

从你的问题中不清楚,究竟是哪里出了问题。

首先。我认为您的第一行中的括号数量有问题 if

if ((current_row['difference'] > 0) & (row_minus1['difference'] < 0))

开-开-关-开-关-关

3 - 3 = 0. 所以最后关闭的 barcket 出错了

其次。如果 i<3,则存在逻辑问题。假设 i=0,所以你得到 data.iloc[0-1]。我想那不是你想要的。如果你想跳过前 4 个项目,你可以只更改第一行

for i in range(4, len(data)):

在这种情况下,负索引不会有问题。

第三。在python中&是按位与。对于布尔值,它工作正常,但最好用 and.

替换

第四。您可以简化条件检查,使用向量与标量比较

data.iloc[i-4:i].loc[:, 't1'] > Upper

这将为您提供一系列 True|False 值。您需要检查其中任何一项是否为真,这是由 .any()

完成的

第五。在 python 中,变量名以小写开头,因此最好将变量重命名为 lower, upper

所以我们归结为那个代码

for i in range(4, len(data)):
    current_row = data.iloc[i, :]
    previous_row = data.iloc[i-1, :]

    if ((current_row['difference'] > 0) and
        (previous_row['difference'] < 0) and (
            (data.iloc[i-4:i].loc[:, 'tl'] > upper).any() or
            (data.iloc[i-4:i].loc[:, 'bl'] < lower).any())):
        do_what_you_need