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)