gpt4 book ai didi

Python Pandas cumsum 移位 n

转载 作者:行者123 更新时间:2023-12-04 03:53:03 26 4
gpt4 key购买 nike

我想知道是否有一种有效的方法(避免循环)来执行 serie.cumsum()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 中执行的code (我猜)所以它要快得多(当然你应该总是使用 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 循环的情况下执行移位差分序列的 cumsum

如果您执行 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 - 反转移动平均线

考虑应用“shifted cumsum”,我发现了这个关于如何反转移动平均线other question in SO,我已经使用我的 cumsum_shift 函数回答了这个问题,我认为它澄清更多我在这里问的问题

最佳答案

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

s.rolling(shift).sum()

然而,您可能希望用原始 df 填充 NaN 值直到移位。

关于Python Pandas cumsum 移位 n,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64155524/

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