如何加快熊猫系列的“衰减”填充功能?

时间:2019-10-16 02:34:03

标签: python pandas performance

我想加快“衰减”正向填充函数的以下实现,该函数用最后一个非零值乘以衰减因子alpha ** (t-T)(其中0<alpha<1和{{1})填充零值}是到最后一个非零值的距离:

(t-T)

但是由于使用纯python for循环,这太慢了。无论如何,是否可以通过def decay_series(s): decay_fac = 0.9 for i in range(1, len(s)): if abs(s.iloc[i]) < 1e-6: s.iloc[i] = s.iloc[i - 1] * decay_fac return s s = pd.Series([0,0, 1, 2, 0,0,1,0,0,1]) s Out[24]: 0 0 1 0 2 1 3 2 4 0 5 0 6 1 7 0 8 0 9 1 dtype: int64 decay_series(s) Out[25]: 0 0.00 1 0.00 2 1.00 3 2.00 4 1.80 5 1.62 6 1.00 7 0.90 8 0.81 9 1.00 dtype: float64 的本机组件的一些巧妙应用来加快速度?不幸的是,似乎pandasfillna方法不支持应用自定义用户方法。

1 个答案:

答案 0 :(得分:3)

使用mask进行广播

(s.mask(s.eq(0)).ffill() * decay_fac ** s.groupby(s.ne(0).cumsum()).cumcount()).fillna(0)

0    0.00
1    0.00
2    1.00
3    2.00
4    1.80
5    1.62
6    1.00
7    0.90
8    0.81
9    1.00
dtype: float64

timings

9.62毫秒vs 10000行的1.12秒

%timeit (s.mask(s.eq(0)).ffill() * 0.9 ** s.groupby(s.ne(0).cumsum()).cumcount()).fillna(0)
9.62 ms ± 206 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

%timeit decay_series(s)
1.12 s ± 161 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)