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