gpt4 book ai didi

python - 具有滞后值(value)的条件产品的 Pandas cumsum?

转载 作者:太空宇宙 更新时间:2023-11-03 14:22:20 31 4
gpt4 key购买 nike

我正在尝试获得根据另一个变量的乘积和总和的滞后值而变化的累积和(我知道这听起来有点像数学胡言乱语.. 请耐心等待)

这是示例设置:

import pandas as pd
df = pd.DataFrame([1,1,1.004878,1,1.043394],columns=['xx'])
df['n'] = 1000000.0

组装成:

       xx        n
0 1.000000 1000000
1 1.000000 1000000
2 1.004878 1000000
3 1.000000 1000000
4 1.043394 1000000

现在,我们需要将xx乘以n的滞后值,迭代,然后取这个值的累加和:

cs = pd.Series([0.0] * len(df))
cs[0] = df.ix[0]['n']
for i,e in enumerate(df.iterrows()):
if i == 0: continue
cs[i] = df.ix[i]['xx'] * cs[(i - 1)]

这会产生以下内容:

0    1000000.000000
1 1000000.000000
2 1004878.000000
3 1004878.000000
4 1048483.675932
dtype: float64

问题:在 pandas/numpy 中有没有不需要遍历每一行的方法?如果没有,当您被迫迭代时,是否有任何优化代码的交易技巧?在这种情况下,创造性地制作索引可以提供帮助吗?性能是跨多个数据集的 10000 多行的一个问题。

最佳答案

首先,您的 for 循环可以简化为:

for i in xrange(1, len(df)):
cs[i] = df.ix[i]['xx'] * cs[(i - 1)]

(更多数学乱码)cs[1:] 中的每一项都是 df['xx'] 中所有项的乘积(累积乘积)乘以df

n 列中的第一项
>>> df
xx n
0 1.000000 1000000
1 1.000000 1000000
2 1.004878 1000000
3 1.000000 1000000
4 1.043394 1000000
>>> a = df['xx']
>>> a
0 1.000000
1 1.000000
2 1.004878
3 1.000000
4 1.043394
Name: xx, dtype: float64
>>> a = a.cumprod()
>>> a
0 1.000000
1 1.000000
2 1.004878
3 1.004878
4 1.048484
Name: xx, dtype: float64
>>> a = a * df['n'][0]
>>> a
0 1000000.000000
1 1000000.000000
2 1004878.000000
3 1004878.000000
4 1048483.675932
Name: xx, dtype: float64
>>> np.all(a == cs)
True
>>>

a = df['xx'].cumprod() * df['n'][0]

这不是骗局。这只有效,因为 df['xx'][0] 是 1。如果它是任何其他值,AND cs[0] = df.ix[0]['n'] 不只是一个快捷方式,那么 cumprod 将无法工作。

展开cs的每一项给出

cs[0] = df['n'][0]
cs[1] = df['xx'][1] * df['n'][0]
cs[2] = df['xx'][2] * df['xx'][1] * df['n'][0]
cs[3] = df['xx'][3] * df['xx'][2] * df['xx'][1] * df['n'][0]
cs[4] = df['xx'][4] * df['xx'][3] * df['xx'][2] * df['xx'][1] * df['n'][0]

由于 df['xx'][0] 等于 1 并且 df['xx'][0] * df['n'][0] == df[' n'][0] 然后:

cs[0] = df['xx'][0] * df['n'][0]
cs[1] = df['xx'][1] * df['xx'][0] * df['n'][0]
cs[2] = df['xx'][2] * df['xx'][1] * df['xx'][0] * df['n'][0]
cs[3] = df['xx'][3] * df['xx'][2] * df['xx'][1] * df['xx'][0] * df['n'][0]
cs[4] = df['xx'][4] * df['xx'][3] * df['xx'][2] * df['xx'][1] * df['xx'][0] * df['n'][0]

如果您要稍微更改问题条件,在每次迭代后我需要减去 n 的最后计算值的 0.05%(在下一次迭代之前),cumprod 是否仍然有效?

如果您进行了项目扩展 练习,您应该已经看到新条件导致乘以缩放因子数组的累积乘积。解决它的两种方法 - 都导致在循环中执行的计算产生一些小的浮点错误。同样,您需要将 df['xx'] 中的第一项考虑为一个。

for i in xrange(1, len(df)):
cs[i] = df.ix[i]['xx'] * (.9995 * cs[(i - 1)])

>>> k
array([ 1. , 0.9995, 0.9995, 0.9995, 0.9995])
>>> z = df['xx'] * k
>>> z
0 1.000000
1 0.999500
2 1.004376
3 0.999500
4 1.042872
Name: xx, dtype: float64
>>> z = z.cumprod() * df['n'][0]
>>> cs - z
0 0.000000e+00
1 0.000000e+00
2 0.000000e+00
3 0.000000e+00
4 -1.164153e-10
dtype: float64
>>>
>>> z = df['xx'].cumprod() * df['n'][0]
>>> z *= k.cumprod()
>>> cs - z
0 0.000000e+00
1 0.000000e+00
2 -1.164153e-10
3 0.000000e+00
4 0.000000e+00
dtype: float64
>>>

关于python - 具有滞后值(value)的条件产品的 Pandas cumsum?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25701494/

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