Pandas:找到最近的更高的高点(OHLC)

Pandas: find nearest higher high (OHLC)

我试图找到最快的解决方案来遍历每一行开高低收数据,并计算出当前行的最高价和下一个大于或等于原始高价的高价之间存在多少行。这是一个简短的代码示例,我认为它解释得很好(我试图找到 _next 的最终值):

for i in df.index:
    while df.loc[i, 'high'] > df.loc[_next, 'high']:
         _next += 1

我想我需要在 apply 中使用一个 lambda 函数,但我似乎做不好。几天来一直在努力解决这个问题,希望得到任何建议!

使用这个数据,函数应该return[2, 0, 0, 3, 1, 0, 0]

d = {'high': [1.2, 1.1, 1.1, 1.4, 1.3, 1.2, 1.3]}
df = pd.DataFrame(data=d)


    high   rows_to_higher_high
0   1.2    2
1   1.1    0
2   1.1    0
3   1.4    3
4   1.3    1
5   1.2    0
6   1.3    0

编辑:itertuples(name=None, index=True) 是迄今为止最快的方法。

根据我的理解,我们可以从当前行减去所有值,然后得到上部的 tri ,当值大于 0[=13= 时,用 argmax 得到索引 max ]

样本:

s
0    1
1    2
2    1
3    3
4    1
5    1
6    5
dtype: int64

解决方案:

np.clip(np.triu((s.values-s.values[:,None])>0,0).argmax(1)-np.arange(len(s)),a_min=0, a_max=None)
array([1, 2, 1, 3, 2, 1, 0])

使用 list comprehension 并得到 index to list

In [166]: d = {'high': [1.2, 1.1, 1.1, 1.4, 1.3, 1.2, 1.3]}

In [167]: df = pd.DataFrame(data=d)

In [168]: df['rows_to_higher_high']=[(df['high'].values[i+1:]>=val).tolist().index(True) if True in (df['high'].values[i+1:]>=val).tolist() else le
     ...: n((df['high'].values[i+1:]>=val).tolist())  for i, val in enumerate(df['high'].values)]

In [169]: df
Out[169]:
   high  rows_to_higher_high
0   1.2                    2
1   1.1                    0
2   1.1                    0
3   1.4                    3
4   1.3                    1
5   1.2                    0
6   1.3                    0