【发布时间】:2019-01-06 18:13:18
【问题描述】:
我非常了解如何利用 pandas 和 numpy 对整列数据进行矢量化操作。但是,我遇到了一种我似乎无法矢量化的情况。当计算涉及利用前一行的值来计算当前行时,我必须退回到 for 循环。
这种东西可以矢量化吗?这是我的意思的一个简单示例:
# Test set of 20 random integers
df = pd.DataFrame({'base': [15, 16, 2, 16, 14,
1, 18, 18, 4, 7,
4, 18, 19, 13, 16,
11, 1, 8, 1, 9]})
# Empty array to hold calculated values
calc_data = np.empty((20, 1))
period = 14
for idx, value in enumerate(df.base):
# Seeding the first element of the calculated array
if idx == 0:
calc_data[idx] = 5
else:
calc_data[idx] = (calc_data[idx - 1] * (period - 1) + df.base.iloc[idx]) / period
# Adding the column to the dataframe
df['calculated'] = calc_data
print(df)
输出:
base calculated
0 15 5.000000
1 16 5.785714
2 2 5.515306
3 16 6.264213
4 14 6.816769
5 1 6.401286
6 18 7.229765
7 18 7.999068
8 4 7.713420
9 7 7.662461
10 4 7.400857
11 18 8.157939
12 19 8.932372
13 13 9.222916
14 16 9.706994
15 11 9.799351
16 1 9.170826
17 8 9.087196
18 1 8.509539
19 9 8.544572
【问题讨论】:
-
我不认为你可以矢量化它
-
我认为这是不可能的。矢量化的整个想法是一次对整个系列/数据帧应用操作。如果一行的值取决于前一行的计算值,则不可能同时执行 2+ 个。
-
谢谢佩德罗,我担心可能是这种情况,这也是我对矢量化的理解。我希望我遗漏了一些明显的东西。
-
您唯一的机会是将
ufunc与accumulate方法一起使用,例如cumsum。
标签: python pandas numpy vectorization