我想知道是否有一种有效的方法(避免循环)来进行serie.cumsum()
,但 shift n 。
您可以像查看serie.cumsum()
的倒数一样查看serie.diff(1)
,我正在寻找diff(n)
的倒数(我知道对于正确的倒数,您需要初始值,但对于简单起见,我在这里忽略了它们),可以称为cumsum_shift
使用 for循环(我希望避免)来更明确地实现它:
def cumsum_shift(s, shift = 1, init_values = [0]):
s_cumsum = pd.Series(np.zeros(len(s)))
for i in range(shift):
s_cumsum.iloc[i] = init_values[i]
for i in range(shift,len(s)):
s_cumsum.iloc[i] = s_cumsum.iloc[i-shift] + s.iloc[i]
return s_cumsum
此shift = 1
代码与s.cumsum()
pandas方法完全相同,但是 pandas方法当然是用C代码完成的(我猜),所以更快(当然,您应该始终使用s.cumsum()
pandas方法,而不要自己使用for循环来实现它。)
我的问题是
如何cumsum_shift
避免使用pandas方法进行for循环?
添加输入和输出示例
如果通过以下方式调用它:
s = pd.Series([1,10,100,2,20,200,5,50,500])
s.diff(3)
out[26] 0 NaN
1 NaN
2 NaN
3 1.0
4 10.0
5 100.0
6 3.0
7 30.0
8 300.0
dtype: float64
使用此输入,cumsum_shift(s.diff(3), shift = 3, init_values = [1,2,3])
的输出仍然是原始系列s
。请注意,将3移位,仅使用cumsum()
,例如s.diff(3).cumsum()
将无法恢复原始的s
:
cumsum_shift(s.diff(3), shift = 3, init_values= [1,10,100])
out[27]
0 1.0
1 10.0
2 100.0
3 2.0
4 20.0
5 200.0
6 5.0
7 50.0
8 500.0
dtype: float64
但是让我强调一下,初始值并不重要,恒定的差异不是问题。我想知道如何在不使用for循环的情况下执行移位后的意向累积
与先执行diff()
然后执行cumsum()
的方法相同,您将原始值恢复为初始值:
s = pd.Series([1,10,100,2,20,200,5,50,500])
s.diff().cumsum()
out[28]
0 NaN
1 9.0
2 99.0
3 1.0
4 19.0
5 199.0
6 4.0
7 49.0
8 499.0
dtype: float64
我想知道是否有某种聪明的方式来做类似s.diff(n).cumsum(n)
的事情,但它可以返回正确的初始值。
编辑2-反转移动平均线
想到“移位的累计金额”的应用时,我发现other question in SO是如何使用我的cumsum_shift
函数回答的如何反转移动平均线的,我认为它澄清了我在这里要问的问题