Numpy Rolling - 파이썬에서 롤링 평균 계산하기
Published on
데이터 분석 영역에서 특히 시계열 데이터를 다룰 때 롤링 통계량을 계산하는 능력은 중요한 기술입니다. 이를 위한 주요 도구는 파이썬의 넘파이 라이브러리이며, 특히 넘파이 롤링 함수입니다. 이 함수를 사용하여 롤링 평균과 같은 다양한 롤링 통계량을 계산할 수 있습니다. 그렇다면 이 함수는 어떻게 작동하며 어떻게 효과적으로 사용할 수 있을까요?
넘파이 롤링은 지정된 크기의 이동 창을 데이터 전체에서 적용하는 기능입니다. 이는 특히 시계열 분석에서 유용하며, 종종 단기적인 변동을 완화하여 장기적인 추세를 더 잘 볼 수 있게 해줍니다. 이 기사에서는 넘파이 롤링의 세부 사항을 살펴보고, 구문, 다양한 창 크기에서의 사용 방법, 2D 배열에 적용하는 방법 및 필터 사용 방법 등을 다룰 것입니다.
Pandas 데이터프레임에서 코드 없이 빠르게 데이터 시각화를 생성하고 싶나요?
PyGWalker는 시각화와 함께 탐색적 데이터 분석을 위한 파이썬 라이브러리입니다. PyGWalker (opens in a new tab)는 판다스 데이터프레임 (그리고 폴라로 데이터프레임)을 Tableau 스타일의 사용자 인터페이스로 변환하여 주피터 노트북 데이터 분석 및 데이터 시각화 워크플로우를 단순화할 수 있습니다.
넘파이 롤링 이해하기
넘파이 롤링은 배열에 이동 창을 적용하고 해당 창의 데이터에 함수를 적용하는 기능입니다. 창은 배열을 따라 움직이고 함수는 각 단계에서 새로운 창에 적용됩니다. 창의 크기는 사용자가 지정하며 배열의 크기보다 작거나 같은 정수일 수 있습니다.
넘파이의 롤링 함수의 구문은 다음과 같습니다:
numpy.rolling(window)
여기서 window
는 이동 창의 크기입니다. 이는 배열의 연속된 요소들 중 창에 포함될 요소의 개수를 지정하는 정수입니다.
예를 들어, 1D 배열이 있고 크기 3의 롤링 평균을 계산하려면 다음 코드를 사용할 수 있습니다:
import numpy as np
# 1D 배열 생성
data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
# 크기 3의 롤링 평균 계산
rolling_mean = np.rolling(3).mean(data)
print(rolling_mean)
이는 다음 배열을 출력합니다:
array([nan, nan, 2., 3., 4., 5., 6., 7., 8.])
처음 두 값은 창 크기 3을 채우기에 충분한 이전 값이 없기 때문에 nan
입니다. 세 번째 값은 2이며, 첫 세 값의 평균 (1, 2, 3)은 2입니다. 이하 같은 방식으로 계속됩니다.
넘파이 롤링과 넘파이 롤 비교하기
넘파이 롤링과 넘파이 롤은 비슷해 보일 수 있지만, 서로 다른 목적을 가지고 있습니다. 넘파이 롤은 배열의 요소를 지정된 축을 따라 이동시키고, 배열의 다른 쪽으로 요소를 래핑하여 이동시킵니다. 반면, 넘파이 롤링은 배열에 이동 창을 적용하고 해당 창의 데이터에 함수를 적용합니다.
예를 들어, 다음과 같은 1D 배열이 있다고 가정해 봅시다:
import numpy as np
# 1D 배열 생성
data = np.array([1, 2, 3, 4, 5])
# 넘파이 롤을 사용하여 요소를 오른쪽으로 2개 이동시킴
rolled_data = np.roll(data, 2)
print(rolled_data)
이는 다음 배열을 출력합니다:
array([4, 5, 1, 2, 3])
보시다시피, 요소들은 오른쪽으로 두 칸 이동하였으며, 끝에서 밀려난 요소는 배열의 시작 부분으로 랩핑되었습니다.
2D 배열에 넘파이 롤링 적용하기
넘파이 롤링은 2D 배열에도 적용할 수 있습니다. 이 경우 이동 창은 배열의 각 행 또는 열(지정된 축에 따라)에 적용되며, 함수는 창 내의 데이터에 적용됩니다.
예를 들어, 크기 3인 이동 창으로 행을 따라 2D 배열의 롤링 평균을 계산하려면 다음 코드를 사용할 수 있습니다:
import numpy as np
# 2D 배열 생성
data = np.array([[1, 2, 3, 4, 5], [6, 7, 8, 9, 10], [11, 12, 13, 14, 15]])
# 행을 따라 크기 3의 롤링 평균 계산
rolling_mean = np.rolling(3, axis=1).mean(data)
print(rolling_mean)
이는 다음 2D 배열을 출력합니다:
array([[nan, nan, 2., 3., 4.],
[nan, nan, 7., 8., 9.],
[nan, nan, 12., 13., 14.]])
각 행의 처음 두 값은 해당 행에서 이전 값이 충분하지 않기 때문에 nan
입니다. 첫 번째 행의 세 번째 값은 2이며, 행의 첫 세 값의 평균 (1, 2, 3)은 2입니다. 이하 같은 방식으로 계속됩니다.
넘파이 롤링과 필터 사용하기
넘파이 롤링은 이동 창 내의 데이터에 필터를 적용할 수도 있습니다. 이는 데이터를 평활화하거나 이상치를 제거하는 데 유용할 수 있습니다.
예를 들어, 크기 3인 이동 창으로 롤링 중간값(평균보다 이상치에 덜 민감한 값)을 계산하려면 다음 코드를 사용할 수 있습니다:
import numpy as np
# 1D 배열 생성
data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
# 크기 3인 이동 창으로 롤링 중간값 계산
rolling_median = np.rolling(3).median(data)
print(rolling_median)
이는 다음 배열을 출력합니다:
array([nan, nan, 2., 3., 4., 5., 6., 7., 8.])
첫 번째 두 값은 nan
인 이유는 이전 값만큼의 값이 부족해서 사이즈 3인 창을 채울 수 없기 때문입니다. 세 번째 값은 첫 세 값(1, 2, 3)의 중간값이 2이기 때문에 2입니다.
Numpy Rolling을 시계열 데이터에 적용하기
Numpy rolling의 가장 일반적인 사용 사례 중 하나는 시계열 데이터 분석입니다. 시계열 데이터는 보통 규칙적인 간격으로 시간에 따라 수집된 데이터 포인트의 시퀀스입니다. Numpy rolling을 사용하면 시계열 데이터에서 롤링 통계량을 계산하여 동향과 패턴에 대한 통찰력을 제공할 수 있습니다.
시계열 데이터에 numpy rolling을 적용하기 위해서는 먼저 데이터가 올바르게 포맷되어 있는지 확인해야 합니다. 일반적으로 시계열 데이터는 1차원 배열이나 2차원 배열의 열로 나타내어지며, 각 요소는 특정 시간에 대한 데이터 포인트를 나타냅니다. 원하는 형식으로 시계열 데이터를 가지고 있으면 numpy rolling을 사용하여 롤링 통계량을 계산할 수 있습니다.
예를 들어, 지난 일년 동안 도시의 일일 온도를 기록하는 시계열 데이터셋이 있다고 가정해봅시다. 우리는 일일 변동을 완화시키고 장기적인 온도 동향을 파악하기 위해 7일간의 롤링 평균 온도를 계산하고 싶습니다. 다음과 같이 할 수 있습니다:
import numpy as np
# 매일 온도 값을 가진 1차원 배열 'temperature'가 있다고 가정한다
# 7일간의 롤링 평균 온도를 계산한다
rolling_avg = np.rolling(7).mean(temperature)
print(rolling_avg)
rolling_avg
배열에는 7일간의 롤링 평균 온도 값이 포함됩니다. 각 값은 7일 천창에서의 평균 온도를 나타내어 시간에 따른 전반적인 온도 동향을 관찰할 수 있습니다.
시계열 데이터에 numpy rolling을 적용함으로써, 계절성을 식별하거나 이상 현상을 감지하거나 미래 동향을 예측하는 등의 가치 있는 통찰력을 얻을 수 있습니다. 이는 금융, 기후, 주식 시장 분석 등 다양한 분야에서 시간 종속적인 패턴을 분석하고 이해하는 데 강력한 도구를 제공합니다.
Numpy Rolling을 활용한 축 조작
Numpy rolling을 사용하면 2차원 배열의 행이나 열을 따라 이동 창을 적용할 뿐만 아니라 축을 조작하는 유연성도 제공합니다. 이 기능은 다차원 배열과 특정 차원을 따라 계산을 수행할 때 특히 유용합니다.
예를 들어, 다양한 위치와 시간 기간에 걸친 월간 온도 측정을 나타내는 3차원 배열이 있다고 가정해봅시다. 우리는 시간 축을 따라 각 위치에 대한 롤링 평균 온도를 계산하려고 합니다. 다음과 같이 numpy rolling을 사용하여 이를 달성할 수 있습니다:
import numpy as np
# (num_locations, num_time_periods, num_months) 모양의 3차원 배열 'temperature'가 있다고 가정한다
# 시간 축을 따라 롤링 평균 온도를 계산한다
rolling_avg = np.rolling(3, axis=1).mean(temperature)
print(rolling_avg)
이 예제에서는 axis=1
로 지정하여 시간 축을 따라 이동 창을 적용하도록 합니다. 결과인 rolling_avg
배열에는 각 위치에 대한 롤링 평균 온도 값이 포함되며, 배열의 원래 모양을 유지합니다.
Numpy rolling을 사용하여 축을 조작함으로써 다차원 데이터에서 특정 차원을 따라 롤링 계산을 수행할 수 있으므로, 고차원 데이터에서 의미 있는 정보를 분석하고 추출할 수 있습니다.
데이터 분석을 위한 Numpy Rolling 최적화
대용량 데이터셋을 사용하거나 numpy rolling을 사용하여 복잡한 계산을 수행할 때는 최적화가 중요합니다. 효율적인 계산과 처리 시간을 보장하기 위해 numpy rolling을 최적화하기 위한 몇 가지 팁을 제공합니다:
-
dtype 지정: 배열을 생성하거나 데이터를 numpy에 로드할 때 적절한 데이터 타입(
dtype
)을 지정하세요. 올바른 데이터 타입을 사용하면 메모리를 절약할 수 있을 뿐만 아니라 계산 속도도 향상됩니다. -
적절한 창 크기 사용: 데이터와 분석 요구에 따라 창 크기를 조정하세요. 작은 창 크기는 더 상세한 통찰력을 제공하지만 잡음에 민감할 수 있으며, 큰 창 크기는 변동을 완화하지만 단기적인 패턴을 놓칠 수 있습니다.
-
벡터화 연산 활용: Numpy는 벡터화 연산을 위해 설계되었으며, 이는 성능을 크게 향상시킬 수 있는 기능입니다. 반복문이나 이터레이션 계산을 사용하는 대신 numpy의 내장 함수와 연산을 활용하여 계산을 수행해보세요.
-
병렬화 고려: 시스템이 병렬 컴퓨팅을 지원한다면 numpy rolling 계산을 병렬화하는 옵션을 탐색해보세요. 병렬화는 계산을 여러 개의 코어나 프로세서에 분산시켜 대용량 데이터셋에 대한 처리 시간을 단축시킬 수 있습니다.
이러한 최적화 기술을 따르면 numpy rolling 계산의 성능을 향상시키고 데이터 분석의 전체적인 잠재력을 발휘할 수 있습니다.
자주 묻는 질문
numpy rolling에 대한 일반적인 질문과 답변을 알아보겠습니다:
-
numpy rolling이란 무엇인가요? numpy rolling은 배열에 대해 롤링 통계량을 계산할 수 있도록 도와주는 numpy 라이브러리의 함수입니다. 이는 데이터에 이동 창을 적용하고 창에 대해 지정된 함수를 수행합니다. 이는 특히 시계열 분석에 유용하며 데이터의 변동을 완화하는데 사용됩니다.
-
numpy를 사용하여 롤링 통계량을 계산하는 방법은 무엇인가요? numpy를 사용하여 롤링 통계량을 계산하려면
numpy.rolling()
함수를 사용하고, 창 크기와 창에 적용할 원하는 함수 (예: 평균, 중앙값)를 지정하면 됩니다. 이 함수는 배열을 반복 순회하며 각 창에 지정된 함수를 적용합니다. -
numpy의 rolling 함수의 구문은 어떻게 되나요? numpy의 rolling 함수의 구문은
numpy.rolling(window, axis=0)
와 같습니다. 여기서window
는 이동 창의 크기이고axis
(선택사항)는 롤링 연산을 수행할 축을 지정합니다. 이 함수는 평균, 중앙값 등과 같은 여러 함수를 적용할 수 있는 롤링 창 객체를 반환합니다.