我希望在pandas DataFrame上创建一个retention函数,它在数据的分组部分上运行累积函数。在
我想做一些类似于Rplyr包所做的事情
假设我有一些虚拟数据:
df = pd.DataFrame({'x' : np.repeat(np.arange(1,11), 5),
'y': np.tile(np.arange(1,6), 10)} )
这给了我们(仅显示10行第一行):
^{pr2}$在本例中,“x”是我要分组的列,“y”是我要运行函数的列。在
该函数是一个保留函数,它将某个因子应用于前一个和,并将其添加到当前值。在代码形式中,函数应该是这样的(可能是更好的方法):
def retention(x, r):
n = len(x)
D = np.zeros(n)
D[0] = x[0]
for i in range(1,n):
D[i] = r*D[i - 1] +x[i]
return D
不过,我希望函数本质上是在一个新的x值的开始处重新开始。在
结果应该如下所示:
x y
0 1 1
1 1 2.25
2 1 3.5625
3 1 4.890625
4 1 6.22265625
5 2 1
6 2 2.25
7 2 3.5625
8 2 4.890625
9 2 6.22265625
我需要足够灵活的解决方案,以便我可以按任意数量的列进行分组,并且组的长度可变。在
我试过好几种方法,但都没有找到解决办法。在
例如,这不起作用:
grouped = df.groupby('x')
grouped.apply(lambda x: retention(df['y'],.25))
注意:在使用plyr包之前,我已经在R中完成了此操作:
retention = function(x , r) {
n =length(x)
D = rep(0, n)
D[1] = x[1]
for (i in 2:n) {
D[i]=r*D[i-1] + x[i]
}
return(D)
}
x = rep(1:10, each = 5)
y = rep(1:5, 10)
df = data.frame(x,y)
ddply(df, .(x), summarize, y = retention (y, .25))
有趣的问题。 看起来你的衰变因子,如果这么说的话,是0.25,以下两个步骤可以达到预期效果(打印前10个观察结果,结果称为
z
):基本上,使用}将结果放在一起。在
numpy.convolve
完成累积和运算(带因子)。剩下的是直接的:只需groupby
将数据分组,应用convolve
,然后{相关问题 更多 >
编程相关推荐