微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python – 具有滞后值的条件乘积的Pandas cumsum?

我试图获得一个累积总和,根据另一个变量的乘积和总和的滞后值而变化(听起来有点像数学乱码,我知道……请耐心等待我)

这是示例设置:

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
>>> 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐