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.