gpt4 book ai didi

python - 计算过程中 cumprod 的裁剪值

转载 作者:行者123 更新时间:2023-12-05 03:22:19 24 4
gpt4 key购买 nike

假设我有以下数据框

x = pd.DataFrame({'value': [1.0, 1.1, 1.1, 1.1, 1.2, 1.0, 0.9, 1.9, 1.7, 0.8, 0.5, 0.3]})

并且我想计算累积乘积,而该值不会低于 1.0 或高于 3.0

如果我只是做累积乘积 (x.cumprod()),我最终会得到

       value
0 1.000000
1 1.100000
2 1.210000
3 1.331000
4 1.597200
5 1.597200
6 1.437480
7 2.731212
8 4.643060
9 3.714448
10 1.857224
11 0.557167

但是我想做的是这样的

def mycumprod(series, start, low, high):
values = []
last_value = start
for value in series.values:
last_value = last_value * value
if last_value < low:
last_value = low
elif last_value > high:
last_value = high
values.append(last_value)
return pd.Series(values)

其中,在累积乘积期间,我防止值低于 low 或高于 high

调用 mycumprod(x['value'], 1.0, 1.0, 3.0) 导致以下系列

0     1.000000
1 1.100000
2 1.210000
3 1.331000
4 1.597200
5 1.597200
6 1.437480
7 2.731212
8 3.000000
9 2.400000
10 1.200000
11 1.000000
dtype: float64

有没有办法在 Pandas 中高效地做到这一点?

我用了this solution过去用于 cumsum,但我不知道如何将其应用于 cumprod。

感谢您提供的任何帮助!

最佳答案

这种类型的计算很难/不可能使用 pandas/numpy 进行矢量化,但您可以使用 numba :

@njit
def mycumprod_numba(values, start, low, high):
products = np.empty_like(values)
last_value = start
for i in range(len(values)):
last_value *= values[i]
if last_value < low:
last_value = low
elif last_value > high:
last_value = high
products[i] = last_value
return products

对于 1000 个元素 (pd.DataFrame({'value': np.random.rand(1_000) * 2})) 我得到了大约 15 倍的加速:

%timeit mycumprod(x['value'], 1.0, 1.0, 3.0)
# 534 µs ± 6.34 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit pd.Series(mycumprod_numba(x['value'].to_numpy(), 1.0, 1.0, 3.0))
# 36.7 µs ± 630 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)

关于python - 计算过程中 cumprod 的裁剪值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72728456/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com