有条件的四个单元以内
conditional within four units
我没有正确使用我的条件语句,不知道我是否需要 while 循环或 for 循环而不是我正在尝试的。我的代码想要做的是查看前四行的 tl
或 bl
值,如果 tl > Upper
或 bl < 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
我没有正确使用我的条件语句,不知道我是否需要 while 循环或 for 循环而不是我正在尝试的。我的代码想要做的是查看前四行的 tl
或 bl
值,如果 tl > Upper
或 bl < 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