Python熊猫cumsum的n偏移

时间:2020-10-01 12:34:36

标签: python python-3.x pandas

我想知道是否有一种有效的方法(避免循环)来进行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循环?

编辑1

添加输入和输出示例

如果通过以下方式调用它:

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函数回答的如何反转移动平均线的,我认为它澄清了我在这里要问的问题

1 个答案:

答案 0 :(得分:1)

您可以在总和中使用pandas方法rolling.sum()

s.rolling(shift).sum()

不过,您可能要用原始df填充NaN值直到移位。

相关问题