我有一个包含日期和值的数据框,
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
有一个遍历日期框的函数,
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
这个函数的逻辑是,如果今天的值
大于昨天、前天或那之前,则为true
或false
。
这个函数对我来说似乎很慢,所以我怎么能像这样重写这个函数
for index, row in df.iterrows():
row['a'], index
或
for idx in df.index:
df.ix[idx, 'a'], idx
或者我可以通过将数据帧转换为 numpy 数组来实现更快的速度吗?
最佳答案
让我们也邀请 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
关于python - 加速 Pandas 数据框迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38211408/