Python Pandas cumsum with shift n

Oct 01 2020

A yapmanın etkili bir yolu olup olmadığını (döngülerden kaçınma) serie.cumsum()ama n kayması ile bilmek istiyorum .

Aynı şekilde sizin serie.cumsum()tersini serie.diff(1)aradığım gibi görüyorsunuz diff(n)(uygun bir tersi için başlangıç ​​değerlerine ihtiyacınız olduğunu biliyorum, ancak basitlik için burada onları görmezden geliyorum)cumsum_shift

Bir for döngüsü ile daha açık bir şekilde uygulamak (bundan kaçınmak istediğim):

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

Bu kod shift = 1, s.cumsum()pandalar yönteminin yaptığı ile tamamen aynıdır , ancak elbette pandalar yöntemi bunu C kodunda yapar (sanırım) bu nedenle çok daha hızlıdır (elbette her zaman s.cumsum()pandalar yöntemini kullanmalı ve bunu bir for ile uygulamamalısınız. döngü).

O halde sorum şu : cumsum_shiftPandas yöntemleriyle for döngüsünden kaçınmanın yolu ne olabilir ?

Düzenle 1

Bir girdi ve çıktı örneği eklemek

Şununla ararsanız:

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

Bu girdi cumsum_shift(s.diff(3), shift = 3, init_values = [1,2,3])ile çıktı yine orijinal seridir s. 3'ün kaymasına dikkat edin, bu sadece cumsum()örneğin s.diff(3).cumsum()orijinali kurtarmaz 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

Ancak, başlangıç ​​değerlerinin önemli olmadığını, sürekli bir farkın sorun olmadığını vurgulamama izin verin. Bir for döngüsü kullanmak zorunda kalmadan kaydırılmış farklı serilerin toplamını nasıl gerçekleştireceğimi bilmek istiyorum

Aynı şekilde, a diff()ve sonra a cumsum()yaparsanız, orijinal olanı başlangıç ​​değerine geri alırsınız:

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

Böyle bir şeyi yapmanın akıllıca bir yolu olup olmadığını bilmek isterim s.diff(n).cumsum(n)ki, bazı sabit başlangıç ​​değerlerine kadar doğru bir şey döndürür.

DÜZENLEME 2 - Hareketli Ortalamayı Ters Çevir

"Kaydırılmış cumsum" uygulamasını düşündüğümde, fonksiyonumu kullanarak yanıtladığım hareketli bir ortalamanın nasıl tersine çevrileceğine dair diğer soruyu SO'da buldum ve burada sorduğum şeyi daha fazla açıklığa kavuşturduğunu düşünüyorum.cumsum_shift

Yanıtlar

1 Elif Oct 01 2020 at 21:34

Pandalar yöntemini rolling.sum () arasında sum ile birlikte kullanabilirsiniz:

s.rolling(shift).sum()

Ancak, NaN değerlerini kaydırmaya kadar orijinal df ile doldurmak isteyebilirsiniz.