Jak obliczyć średnie kroczące w pythonie


Średnia ruchoma to technika, którą można zastosować do wygładzenia danych szeregów czasowych, aby zredukować „szum” w danych i ułatwić identyfikację wzorców i trendów.

Ideą średniej ruchomej jest wzięcie średniej z kilku poprzednich okresów w celu uzyskania „średniej kroczącej” dla danego okresu.

W tym samouczku wyjaśniono, jak obliczyć średnie ruchome w języku Python.

Przykład: średnie kroczące w Pythonie

Załóżmy, że mamy poniższą tabelę przedstawiającą całkowitą sprzedaż określonej firmy w 10 okresach:

 x = [50, 55, 36, 49, 84, 75, 101, 86, 80, 104]

Metoda 1: Użyj funkcji cumsum().

Jednym ze sposobów obliczenia średniej ruchomej jest użycie funkcji cumsum():

 import numpy as np

#define moving average function
def moving_avg(x, n):
    cumsum = np.cumsum(np.insert(x, 0, 0)) 
    return (cumsum[n:] - cumsum[:-n]) / float(n)

#calculate moving average using previous 3 time periods
n = 3
moving_avg(x, n):

array([47, 46.67, 56.33, 69.33, 86.67, 87.33, 89, 90])

Oto jak zinterpretować wynik:

  • Średnia krocząca trzeciego okresu wynosi 47. Obliczana jest jako średnia z trzech pierwszych okresów: (50+55+36)/3 = 47 .
  • Średnia ruchoma dla czwartego okresu wynosi 46,67. Oblicza się to jako średnią z trzech poprzednich okresów: (55+36+49)/3 = 46,67 .

I tak dalej.

Metoda 2: Użyj pand.

Innym sposobem obliczenia średniej ruchomej jest napisanie funkcji opartej na pandach:

 import pandas as pd

#define array to use and number of previous periods to use in calculation
x = [50, 55, 36, 49, 84, 75, 101, 86, 80, 104]
n=3

#calculate moving average
pd.Series(x).rolling(window=n).mean().iloc[n-1:].values

array([47, 46.67, 56.33, 69.33, 86.67, 87.33, 89, 90])

Ta metoda daje dokładnie takie same wyniki jak poprzednia metoda, ale zwykle działa szybciej na większych tablicach.

Należy pamiętać, że można również określić dowolną liczbę poprzednich okresów do wykorzystania w obliczeniach średniej ruchomej. Na przykład możesz preferować użycie n=5:

 #use 5 previous periods to calculate moving average
n=5

#calculate moving average
pd.Series(x).rolling(window=n).mean().iloc[n-1:].values

array([54.8, 59.8, 69., 79., 85.2, 89.2])

Im więcej okresów użyjesz do obliczenia średniej ruchomej, tym bardziej „wygładzona” będzie linia średniej ruchomej.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *