1

我试图找到最快的解决方案来迭代每行 Open High Low Close 数据并计算当前行的高点和大于或等于原始行的下一个高点之间存在多少行。这是一个简短的代码示例,我认为它很好地解释了它(我试图找到 的最终值_next):

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

我想我需要在lambda里面使用一个函数,apply但我似乎无法正确使用它。几天来一直试图解决这个问题,并希望得到任何建议!

使用这些数据,函数应该返回[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) 是迄今为止最快的方法。

4

2 回答 2

1

using list comprehension and get 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
于 2020-07-18T07:59:17.487 回答
0

根据我的理解,我们可以从当前行中得到所有值的减法,然后得到上tri,argmax当值大于0时得到索引最大值

样本 :

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])
于 2020-07-18T02:37:08.230 回答