HOWTO · Python

Python에서 NumPy 배열의 이동 평균

이 튜토리얼은 파이썬에서 numpy 배열의 이동 평균을 계산하는 방법을 보여줍니다.

이 페이지의 내용

이동 평균은 특정 간격으로 데이터의 평균을 계산하여 시계열 데이터를 연구하는 데 자주 사용됩니다. 단기 변동을 완화하고 데이터의 추세를 연구하는 데 사용됩니다. 단순 이동 평균은 주가 추세를 연구하는 동안 많이 사용됩니다.

가중 이동 평균은 이전 데이터보다 최근 데이터에 더 중점을 둡니다.

아래 그래프는 이동 평균에 대한 더 나은 이해를 제공합니다.

단순 이동 평균

이 튜토리얼에서는 Python에서 numpy 배열의 이동 평균을 구현하는 방법에 대해 설명합니다.

numpy.convolve방법을 사용하여 NumPy 배열에 대한 이동 평균 계산

convolve()함수는 신호 처리에 사용되며 두 배열의 선형 컨볼 루션을 반환 할 수 있습니다. 각 단계에서 수행되는 작업은 배열과 현재 창 사이의 내적을 취하고 그 합계를 취하는 것입니다.

다음 코드는 사용자 정의 함수에서이를 구현합니다.

import numpy as np


def moving_average(x, w):
    return np.convolve(x, np.ones(w), "valid") / w


data = np.array([10, 5, 8, 9, 15, 22, 26, 11, 15, 16, 18, 7])

print(moving_average(data, 4))

출력:

[ 8.    9.25 13.5  18.   18.5  18.5  17.   15.   14.  ]

scipy.convolve방법을 사용하여 NumPy 배열에 대한 이동 평균 계산

scipy.convolve()함수도 같은 방식으로 사용할 수 있습니다. 조금 더 빠르다고 가정합니다. numpy 모듈을 사용하여 이동 평균을 계산하는 또 다른 방법은cumsum()함수를 사용하는 것입니다. 배열의 누적 합계를 계산합니다. 이것은 이동 평균을 계산하는 매우 간단한 비가 중 방법입니다.

다음 코드는이 함수를 사용하여 이동 평균을 반환합니다.

def moving_average(a, n):
    ret = np.cumsum(a, dtype=float)
    ret[n:] = ret[n:] - ret[:-n]
    return ret[n - 1 :] / n


data = np.array([10, 5, 8, 9, 15, 22, 26, 11, 15, 16, 18, 7])

print(moving_average(data, 4))

출력:

[ 8.    9.25 13.5  18.   18.5  18.5  17.   15.   14.  ]

bottleneck모듈을 사용하여 이동 평균 계산

bottleneck모듈은 빠른 numpy 메소드의 컴파일입니다. 이 모듈에는 일부 데이터의 이동 평균을 반환 할 수있는move_mean()함수가 있습니다.

예를 들면

import bottleneck as bn
import numpy as np


def rollavg_bottlneck(a, n):
    return bn.move_mean(a, window=n, min_count=None)


data = np.array([10, 5, 8, 9, 15, 22, 26, 11, 15, 16, 18, 7])

print(rollavg_bottlneck(data, 4))

출력:

[  nan   nan   nan  8.    9.25 13.5  18.   18.5  18.5  17.   15.   14.  ]

시간 창 간격이 4이므로 이동 평균을 계산할 수 없기 때문에 처음에 세 개의 nan 값이 있습니다.

pandas모듈을 사용하여 이동 평균 계산

시계열 데이터는 대부분pandas DataFrame과 연관됩니다. 따라서 라이브러리는 이러한 데이터에 대해 서로 다른 계산을 수행 할 수 있도록 잘 갖추어져 있습니다.

아래와 같이rolling()mean()함수를 사용하여 시계열 데이터의 이동 평균을 계산할 수 있습니다.

import pandas as pd
import numpy as np

data = np.array([10, 5, 8, 9, 15, 22, 26, 11, 15, 16, 18, 7])

d = pd.Series(data)

print(d.rolling(4).mean())

출력:

0       NaN
1       NaN
2       NaN
3      8.00
4      9.25
5     13.50
6     18.00
7     18.50
8     18.50
9     17.00
10    15.00
11    14.00
dtype: float64

먼저 numpy 배열을 시계열 객체로 변환 한 다음rolling()함수를 사용하여 롤링 창에서 계산을 수행하고mean()함수를 사용하여 이동 평균을 계산합니다.

여기서도 시간 창 간격이 4이기 때문에 이동 평균을 계산할 수 없기 때문에 처음에 세 개의 nan 값이 있습니다.