[Pandas] interpolate
Pandas interpolate, 결측치 보간, Series interpolate
정의
interpolate() 는 NaN 을 주변 값을 사용해 보간 으로 채운다. 시계열, 측정 데이터의 작은 결측을 자연스럽게 채울 때 유용.
기본
s.interpolate() # 기본 linear
s.interpolate(method='polynomial', order=2)
s.interpolate(method='time') # index 가 DatetimeIndex 일 때
s.interpolate(method='spline', order=3)
linear 보간 예
python
import pandas as pd
import numpy as np
s = pd.Series([1, np.nan, np.nan, 4, np.nan, 6])
print('original :', s.tolist())
print('interpolate :', s.interpolate().tolist()) 결과
original : [1.0, nan, nan, 4.0, nan, 6.0]
interpolate : [1.0, 2.0, 3.0, 4.0, 5.0, 6.0]| index | original | interpolate |
|---|---|---|
| 0 | 1.0 | 1.0 |
| 1 | NaN | 2.0 |
| 2 | NaN | 3.0 |
| 3 | 4.0 | 4.0 |
| 4 | NaN | 5.0 |
| 5 | 6.0 | 6.0 |
1 → 4 사이의 NaN 2 개를 직선 보간으로 2, 3 으로 채움.
다양한 method
| method | 설명 |
|---|---|
linear (기본) | 직선 보간 |
time | 시간 간격 가중 (DatetimeIndex 필요) |
index | index 값을 X축으로 |
nearest | 가장 가까운 값 |
polynomial | 다항식 (order 필요) |
spline | 스플라인 (order 필요, scipy 의존) |
pchip, akima | 비단조 스플라인 |
from_derivatives | 기울기 기반 |
time-based 보간
ts = pd.Series([1, np.nan, np.nan, 10],
index=pd.date_range('2024-01-01', periods=4, freq='D'))
ts.interpolate() # 균등 간격 가정 → [1, 4, 7, 10]
ts.interpolate(method='time') # 같은 결과 (간격이 균일하므로)
# 불균등 시계열
ts2 = pd.Series([1, np.nan, 10],
index=pd.to_datetime(['2024-01-01', '2024-01-02', '2024-01-10']))
ts2.interpolate() # 균등 가정 → [1, 5.5, 10]
ts2.interpolate(method='time') # 시간 거리 가중 → [1, 2.0, 10]
time method 가 실제 거리 기반이라 더 자연스럽다.
양 끝의 NaN
s = pd.Series([np.nan, np.nan, 1, 2, np.nan, np.nan])
s.interpolate()
# [NaN, NaN, 1.0, 2.0, NaN, NaN] ← 양 끝은 못 채움
s.interpolate(limit_direction='both')
# [1.0, 1.0, 1.0, 2.0, 2.0, 2.0]
limit_direction='backward' / 'forward' / 'both' 로 한 방향 채우기 가능.
limit (연속 NaN 개수 제한)
s.interpolate(limit=2)
# 연속 NaN 2 개까지만 채움, 그 이상은 NaN 유지
사용 시 주의
1. 잘못된 method 선택
- outlier 가 많은 경우: linear 가 outlier 사이로 보간해 이상해질 수 있음
- 시계열:
timemethod 가 더 자연스러움 (불규칙 간격) - 곡선 트렌드: spline 또는 polynomial
2. interpolate 가 만능은 아님
# 연속 NaN 이 너무 많을 때
[1, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, NaN, 10]
# linear 보간하면 너무 큰 가정
데이터 특성에 따라 보간 자체가 부적절할 수 있음.
3. method=‘time’ 인데 datetime index 아님 → 오류
s.interpolate(method='time') # TypeError if not DatetimeIndex
💬 댓글