熊猫数据框搜索超过阈值的行

时间:2018-08-05 17:24:16

标签: 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/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的目标。因此,首先超过了HIGH目标。

对于02/01,未突破315的高目标,但在05/01突破了70的低目标,因此首先突破了LOW目标。

对于03/01,在04/01上超过了285的高目标,然后在05/01上越过了77的低目标。因此,HIGH目标首先被突破。

最有效的方法是什么?我当时在考虑使用.apply来搜索整个数据帧,也许想比较ids来看看哪个目标首先被命中。

要明确-我拥有3000天的整个数据帧。所谓“后续数据”,是指系列中的较晚日期。

1 个答案:

答案 0 :(得分:1)

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

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)

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