본문으로 건너뛰기
김신건의 로그

[Pandas] expanding / ewm

· 수정 · 📖 약 1분 · 347자/단어 #python #pandas #expanding #ewm #window #time-series
Pandas expanding, Pandas ewm, 지수가중이동평균

정의

Pandas rolling 외의 윈도우 연산.

  • expanding() : 시작부터 현재까지 누적 윈도우
  • ewm() : exponentially weighted (지수 가중)

expanding

s.expanding().mean()           # 시작부터 현재까지 평균
s.expanding().sum()            # = cumsum
s.expanding(min_periods=5).std()
python
import pandas as pd
s = pd.Series([10, 20, 30, 40, 50])
print('mean:', s.expanding().mean().tolist())
print('std :', s.expanding().std().round(2).tolist())
결과
mean: [10.0, 15.0, 20.0, 25.0, 30.0]
std : [nan, 7.07, 10.0, 12.91, 15.81]
indexsexpanding mean
01010
12015
23020
34025
45030

rolling 과 달리 윈도우 크기가 무한히 커진다.

ewm, 지수 가중

s.ewm(alpha=0.3).mean()
s.ewm(span=10).mean()
s.ewm(halflife=5).mean()
s.ewm(com=4).mean()
파라미터의미
alpha직접 가중치 (0 < α ≤ 1)
span평균적 윈도우 크기 (α = 2/(span+1))
halflife가중치가 절반이 되는 거리
comcenter of mass (α = 1/(1+com))

alpha 가 클수록 최근 값에 가중.

python
import pandas as pd
s = pd.Series([1, 2, 3, 4, 5, 6, 7, 8])
print('span=3 ewm:', s.ewm(span=3).mean().round(2).tolist())
print('span=7 ewm:', s.ewm(span=7).mean().round(2).tolist())
결과
span=3 ewm: [1.0, 1.67, 2.43, 3.27, 4.17, 5.12, 6.09, 7.06]
span=7 ewm: [1.0, 1.57, 2.18, 2.81, 3.45, 4.11, 4.78, 5.46]

span=3 이 작아서 최근 값에 더 빨리 반응, span=7 은 smoother.

ewm 의 수식

지수 감쇠 가중. 모든 과거 값을 고려하지만 가중치가 지수적으로 감소.

rolling vs expanding vs ewm

항목윈도우가중치
rolling(n)고정 n같음
expanding()1 → ∞같음
ewm(span=n)사실상 무한지수 감쇠

자주 쓰는 패턴

누적 평균 / 표준편차

df['avg_so_far'] = df['x'].expanding().mean()
df['std_so_far'] = df['x'].expanding().std()

ML 의 online 통계, 게임 점수 누적 평균 등.

지수 이동 평균 (EMA)

df['ema_short'] = df['close'].ewm(span=12, adjust=False).mean()
df['ema_long'] = df['close'].ewm(span=26, adjust=False).mean()
df['macd'] = df['ema_short'] - df['ema_long']

금융 지표 MACD.

Bollinger Bands

ma = df['close'].rolling(20).mean()
std = df['close'].rolling(20).std()
df['upper'] = ma + 2 * std
df['lower'] = ma - 2 * std

(rolling 기반)

시계열 smoothing

df['smoothed'] = df['signal'].ewm(span=10).mean()
# noise 줄이기

adjust 옵션

s.ewm(span=3, adjust=True).mean()    # 기본, 더 정확한 평균
s.ewm(span=3, adjust=False).mean()   # 재귀식 사용 (online 계산용)
  • adjust=True : 시작 부분의 가중치도 보정
  • adjust=False : 단순 재귀 (실시간 처리에 적합)

함정

1. expanding 의 첫 N 개

s.expanding(min_periods=5).std()
# 처음 4 개는 NaN

표본 크기가 작으면 표준편차가 불안정.

2. ewm 의 가중치 합

adjust=False 면 초기 가중치 합이 1 미만, bias 발생 가능.

3. groupby 결합

df['ema'] = df.groupby('user')['x'].transform(
    lambda s: s.ewm(span=10).mean()
)

apply 보다 transform 권장 (원본 shape 유지).

참고

이 글의 용어 (3개)
[Pandas] cumsum / cummax / cummin / cumprodpandas
정의 누적 (cumulative) 연산. 각 위치까지의 누적 결과를 반환, 결과 길이는 원본과 동일. | 함수 | 의미 | |:---|:---| | | 누적 합 | | | 누적 …
[Pandas] resamplepandas
정의 는 시계열 데이터를 다른 빈도 (월별, 일별, 시간별 등) 로 재샘플링하면서 집계한다. 의 시계열 버전. DatetimeIndex (또는 으로 datetime 컬럼) 이 필…
[Pandas] rolling / expandingpandas
정의 - : 고정 크기 슬라이딩 윈도우 (이동 평균 등) - : 시작부터 누적 윈도우 (cumulative) - : 지수 가중 이동 평균 시각화 rolling 기본 <CodeWi…

이 개념을 다룬 위키 페이지 (1)

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기