加速熊猫数据帧迭代

Pro*_*ogR 5 python numpy pandas

我有一个带有日期和值的数据框,

 Date     Price
Jun 30    95.60
Jun 29    94.40
Jun 28    93.59
Jun 27    92.04
Jun 24    93.40
Jun 23    96.10
Jun 22    95.55
Jun 21    95.91
Jun 20    95.10
Jun 17    95.33
Jun 16    97.55
Jun 15    97.14
Jun 14    97.46
Jun 13    97.34
Jun 10    98.83
Jun 9     99.65
Jun 8     98.94
Jun 7     99.03
Jun 6     98.63
Jun 3     97.92
Jun 2     97.72
Run Code Online (Sandbox Code Playgroud)

有一个函数可以遍历 dateframe,

indic_up = [False, False,False, False]
i = 4
while i+4 <= df.index[-1]:
    if (df.get_value(i, 'value') > df.get_value(i-1, 'value')) or
        (df.get_value(i, 'value') > df.get_value(i-2, 'value')) or
        (df.get_value(i, 'value') > df.get_value(i-3, 'value')) or
        (df.get_value(i, 'value') > df.get_value(i-4, 'value')):indic_up.append(True)
    else:indic_up.append(False)
    i = i+1
Run Code Online (Sandbox Code Playgroud)

这个函数的逻辑是如果value今天大于昨天,前天或之前,那么它是trueor false。这个函数对我来说似乎很慢,所以我如何重写这个函数

for index, row in df.iterrows():
row['a'], index
Run Code Online (Sandbox Code Playgroud)

或者

for idx in df.index:
df.ix[idx, 'a'], idx
Run Code Online (Sandbox Code Playgroud)

或者我可以通过将数据帧转换为 numpy 数组来实现更快吗?

Div*_*kar 2

我们Scipy也邀请吧!

想法:通过计算该间隔中的最小值并与当前元素进行比较4,将当前元素与先前的值进行比较。如果匹配,我们基本上所有的比较都失败了,因此选择False。因此,从代码角度来说,只需将当前元素与该区间内的最小值进行比较即可。这就是scipy它的用武之地minimum_filter

执行 :

from scipy.ndimage.filters import minimum_filter

# Extract values from relevant column into a NumPy array for further procesing
A = df['value'].values

# Look for no match with interval-ed min & look for NOT matching for True as o/p
indic_up_out = A != minimum_filter(A,footprint=np.ones((5,)),origin=2)

# Set first four as False because those would be invalid with a 5 elem runway
indic_up_out[:4] = 0
Run Code Online (Sandbox Code Playgroud)