我有一个数字数据的数据框,如下所示:
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天的整个数据帧。所谓“后续数据”,是指系列中的较晚日期。
答案 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)
这可能不是最佳解决方案,因为比较是在所有后续行上执行的。