시계열 분석은 연속된 시간의 데이터를 다루기 때문에,
연산 효율성 + 구조적 데이터 관리 능력이 중요하다.
이 두 가지를 가능하게 해주는 핵심 도구가 바로 NumPy와 Pandas다.
pip install numpy pandas matplotlib
환경 구성이 끝났다면, Python 코드에서 다음처럼 불러온다.
import numpy as np
import pandas as pd
파이썬 리스트는 유연하지만, 대용량 연산에 비효율적이다.
NumPy는 동일 타입 데이터를 한 번에 처리할 수 있는 ndarray 구조를 제공한다.
mylist = [1, 2, 3]
arr = np.array(mylist)
print(type(arr)) # <class 'numpy.ndarray'>
중첩 리스트로 2D 배열(행렬) 생성
mymatrix = np.array([[1,2,3], [4,5,6], [7,8,9]])
mymatrix.shape # (3,3)
| 함수 | 설명 | 예시 |
|---|---|---|
np.arange(start, stop, step) | 정수 범위 생성 | np.arange(0,10,2) → [0,2,4,6,8] |
np.zeros(shape) | 0으로 채운 배열 | np.zeros((3,3)) |
np.ones(shape) | 1로 채운 배열 | np.ones((2,4)) |
np.linspace(start, stop, num) | 일정 간격으로 나눈 배열 | np.linspace(0,10,5) |
np.eye(n) | 단위 행렬 생성 | np.eye(3) |
NumPy의 강점:
배열 전체에 스칼라 연산을 브로드캐스팅 할 수 있다.
arr = np.ones(5)
arr * 10 # [10. 10. 10. 10. 10.]
NumPy는 np.random 모듈로 다양한 난수 샘플링을 지원한다.
np.random.rand(3) # 균등 분포 (0~1)
np.random.randn(3) # 표준 정규분포 (μ=0, σ=1)
np.random.randint(1, 100, 5) # 1~99 정수 5개
시드(seed) 설정으로 재현 가능한 결과 확보:
np.random.seed(42)
np.random.rand(3)
arr = np.arange(25)
ranarr = np.random.randint(0, 50, 10)
arr.reshape(5,5) # 형태 변경
ranarr.max(), ranarr.min() # 최대·최소값
ranarr.argmax(), ranarr.argmin() # 인덱스 위치
arr.dtype # 데이터 타입
arr = np.arange(0,11)
arr[1:5] # [1,2,3,4]
arr[:5] # 처음부터 4까지
arr[5:] # 5부터 끝까지
NumPy의 슬라이싱은 원본 참조(pass-by-reference) 방식이다.
복사본이 필요하면 .copy()를 사용한다.
slice_arr = arr[0:5]
slice_arr[:] = 99
arr # 원본도 변경됨
arr_copy = arr.copy()
arr_2d = np.array([[5,10,15],
[20,25,30],
[35,40,45]])
arr_2d[1] # 두 번째 행
arr_2d[1,1] # 25
arr_2d[:2,1:] # [[10,15],[25,30]]
arr = np.arange(1,11)
arr[arr > 4] # [5,6,7,8,9,10]
이는 Pandas의 조건 필터링(df[df['col']>x])과 같은 원리다.
NumPy는 브로드캐스팅된 연산을 수행한다.
arr = np.arange(0,10)
arr + arr # 요소별 덧셈
arr * 2 # 스칼라 곱
arr ** 2 # 제곱
0으로 나누기 경고 처리
1 / arr # 경고 발생, NaN/inf로 대체
| 함수 | 설명 | 예시 |
|---|---|---|
np.sqrt(arr) | 제곱근 | np.sqrt([4, 9, 16]) → [2., 3., 4.] |
np.log(arr) | 로그 | np.log([1, e, e**2]) → [0., 1., 2.] |
np.sin(arr) | 사인 | np.sin([0, π/2, π]) → [0., 1., 0.] |
np.exp(arr) | 지수 | np.exp([0, 1, 2]) → [1., 2.718..., 7.389...] |
arr = np.arange(1,13).reshape(3,4)
arr.sum() # 전체 합
arr.mean() # 평균
arr.sum(axis=0) # 열별 합
arr.sum(axis=1) # 행별 합
axis 값 | 계산 방향 | 결과 |
|---|---|---|
| 0 | 행 기준(세로) | 각 열의 합 |
| 1 | 열 기준(가로) | 각 행의 합 |
NumPy는 Pandas의 데이터 구조의 엔진이다.
Series = NumPy 1차원 배열 + 인덱스DataFrame = 2차원 NumPy 배열 + 컬럼 이름NumPy 개념을 이해하면 Pandas의 인덱싱, 조건 선택, 브로드캐스팅, 통계 집계 등 모든 동작이 직관적으로 연결된다.
np.arange()와 np.linspace()의 차이를 설명할 수 있는가?axis 개념은 2D 배열에서 어떻게 작동하는가?| 항목 | 주요 내용 |
|---|---|
| NumPy 핵심 기능 | 배열 생성, 브로드캐스팅, 유니버설 함수, 인덱싱 |
| Pandas 전단계 | Series/DataFrame은 NumPy 기반 |
| 시계열 분석 전 준비 | 고속 연산 + 배열 구조 이해 |
| 다음 학습 | Pandas를 활용한 시계열 인덱스, 리샘플링, 이동평균 등 |