Python Pandas suma z przesunięciem n

Oct 01 2020

Chciałbym wiedzieć, czy istnieje skuteczny sposób (unikanie pętli) na zrobienie a serie.cumsum()ale z przesunięciem n .

W ten sam sposób, w jaki możesz zobaczyć serie.cumsum()odwrotność serie.diff(1), szukam odwrotności diff(n)(wiem, że do prawidłowego odwrotności potrzebujesz wartości początkowych, ale dla uproszczenia je tutaj ignoruję), które można nazwaćcumsum_shift

Bardziej jawnie implementując go za pomocą pętli for (której chciałbym uniknąć):

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

Ten kod shift = 1jest dokładnie taki sam, jak s.cumsum()metoda pandy, ale oczywiście metoda pandy robi to w kodzie C (chyba), więc jest znacznie szybsza (oczywiście zawsze należy używać s.cumsum()metody pandy i nie implementować jej samodzielnie za pomocą for pętla).

Moje pytanie brzmi: Jak można by cumsum_shiftuniknąć pętli for w przypadku metod pandy?

Edytuj 1

Dodanie przykładu wejścia i wyjścia

Jeśli zadzwonisz 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

Z tym wejściem, wynik cumsum_shift(s.diff(3), shift = 3, init_values = [1,2,3])jest ponownie oryginalnej serii s. Zwróć uwagę na przesunięcie o 3, to cumsum()np. s.diff(3).cumsum()Nie przywróciłoby oryginału 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

Ale podkreślę, że początkowe wartości to nic wielkiego, stała różnica nie jest problemem. Chciałbym wiedzieć, jak wykonać sumę przesuniętego zróżnicowanego szeregu bez konieczności używania pętli for

W ten sam sposób, jeśli zrobisz a, diff()a następnie a cumsum(), przywrócisz pierwotną wartość do wartości początkowej:

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

Chciałbym wiedzieć, czy istnieje jakiś sprytny sposób zrobienia czegoś takiego, s.diff(n).cumsum(n)który przywróciłby coś poprawnego do pewnych stałych wartości początkowych.

EDYCJA 2 - Odwróć średnią ruchomą

Myśląc o zastosowaniu "przesuniętej sumy" znalazłem to drugie pytanie w SO, jak odwrócić średnią ruchomą , na którą odpowiedziałem używając mojej cumsum_shiftfunkcji i myślę, że wyjaśnia to więcej o co pytam tutaj

Odpowiedzi

1 Elif Oct 01 2020 at 21:34

Możesz użyć metody pandy rolling.sum () wśród z sumą:

s.rolling(shift).sum()

Jednak możesz chcieć wypełnić wartości NaN aż do przesunięcia oryginalnym df.