Python 对超过阈值的行进行数据帧搜索

Python 对超过阈值的行进行数据帧搜索,python,pandas,Python,Pandas,我有一个数字数据框架,如下所示: Day High Low 01/01/01 200 100 02/01/01 210 100 03/01/01 190 110 每行,我根据一些公式动态生成高目标和低目标: Day High Low High-Target Low-Target 01/01/

我有一个数字数据框架,如下所示:

Day          High         Low      
01/01/01     200          100      
02/01/01     210          100      
03/01/01     190          110      
每行,我根据一些公式动态生成高目标和低目标:

Day          High         Low      High-Target  Low-Target
01/01/01     200          100      300          70
02/01/01     210          100      315          70
03/01/01     190          110      285          77
每天,我想知道,高目标(未来高目标>高目标)是先被后续高点击中,还是先被后续低点越过低目标(低目标<未来低目标)?请注意,这是在每天的基础上-我想在每一行的结果上标注“高目标命中率优先”或“低目标命中率优先”

为了更清楚地说明这一点,让我们根据后续数据标记前三天

Day          High         Low      High-Target  Low-Target   Hit First
01/01/01     200          100      300          70           HIGH
02/01/01     210          100      315          70           LOW
03/01/01     190          110      285          77           HIGH

04/01/01     310          120
05/01/01     310          65
06/01/01     300          120
因此,对于01/01,在第二天(05/01)达到70的目标之前,在04/01天超过了300的目标。因此,首先超过了高目标

对于02/01,高目标315未被越过,但低目标70在05/01被越过,因此低目标首先被越过

对于03/01,在05/01越过77的低目标之前,在04/01超过了285的高目标。因此,首先越过了高目标

最有效的方法是什么?我正在考虑使用
.apply
搜索整个数据帧,也许还可以比较
ids
,看看哪个目标首先被击中


要明确的是,我有3000天的整个数据框架。“后续数据”-我只是指本系列的后期。

.apply
确实可以在这里使用,带有一个自定义函数(需要引用整个数据帧
df

def get_hit_first(行):
#获取后续行的临时视图
temp=df.loc[行名称:].iloc[1:]
#查找与条件匹配的第一行
压头=温度[(温度高>=行[“高目标])|(温度低0:
如果head.iloc[0].High>=行['High-Target']:
返回“高”
其他:
返回“低”
df['Hit First']=df.apply(get_Hit_First,axis=1)

不过,这可能不是最理想的解决方案,因为比较是在所有后续行上执行的。

必须每行检查每个后续行;因此对于01/01,它必须检查数据帧结束前的所有天数,除非它发现一个值超过任何一个阈值
def get_hit_first(row):
    # Get a temporary view on the subsequent rows
    temp = df.loc[row.name:].iloc[1:]
    # Find the first row matching the criteria
    head = temp[(temp.High >= row['High-Target'])|(temp.Low <= row['Low-Target'])]\
        .head(1)

    if len(head) > 0:
        if head.iloc[0].High >= row['High-Target']:
            return 'HIGH'
        else:
            return 'LOW'

 df['Hit First'] = df.apply(get_hit_first, axis=1)