본문 바로가기
C.W.K.
Stream
Lesson 04 of 06 · published

Type Drift — 물리기 전에 잡기

~10 min · validation, drift, monitoring

Level 0구경꾼
0 XP0/47 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

Type drift 가 silent killer

어제 잘 돌던 파이프라인이 오늘 깨져. 코드는 한 줄도 안 바꿨는데 — upstream source 가 조용히 type 을 바꾼 거야. 흔한 모양들:

  • 줄곧 숫자였던 ID column 이 string ('12345') 으로 오기 시작해.
  • 날짜 column 의 포맷이 YYYY-MM-DD 에서 DD/MM/YYYY 로 바뀌어.
  • 한 번도 null 이 없던 column 에 null 이 흘러들기 시작해.
  • 평범한 텍스트였던 자유 입력 필드에 JSON 이 담겨 오기 시작해.
  • 통화 필드가 "123.45" 에서 "$123.45" 나 "123,45" 로 변해.

두 겹의 방어

  1. 게이트에서. Schema 검증 (Pandera/GX) 이 drift 가 생긴 바로 그날 잡아 — downstream consumer 눈에 띄기 전에.
  2. At rest 로. 이번 run 의 profile 을 지난주 것과 비교하는 "profile diff" 를 스케줄로 돌려 — 그 제약에 대한 검증을 미처 안 써 놨어도 drift 가 경고로 떠올라.

Code

Profile-diff: 두 run 사이 drift 탐지·python
import pandas as pd

def profile_diff(prev: pd.DataFrame, curr: pd.DataFrame, *, tol: float = 0.05) -> dict:
    '''Tolerance 넘게 null rate 또는 unique count drift 한 column 의 dict.'''
    drift = {}
    for col in set(prev.columns) & set(curr.columns):
        prev_null = prev[col].isna().mean()
        curr_null = curr[col].isna().mean()
        if abs(prev_null - curr_null) > tol:
            drift[col] = {'kind': 'null_rate',
                          'prev': round(prev_null, 4),
                          'curr': round(curr_null, 4)}
            continue
        prev_uniq = prev[col].nunique()
        curr_uniq = curr[col].nunique()
        if prev_uniq and abs(prev_uniq - curr_uniq) / prev_uniq > tol:
            drift[col] = {'kind': 'cardinality',
                          'prev': prev_uniq, 'curr': curr_uniq}
    # Schema diff (추가/제거 column)
    drift['__added__']   = sorted(set(curr.columns) - set(prev.columns))
    drift['__removed__'] = sorted(set(prev.columns) - set(curr.columns))
    return drift

External links

Exercise

같은 데이터 source 의 스냅샷 두 개 (어제 + 오늘) 를 가져와 profile_diff 함수를 돌리고 뭐가 흘러갔는지 봐. Slack 알림을 받을 만한 drift 신호 하나 (예: 어떤 column 의 null rate 가 0.5% 에서 8% 로 점프) 를 골라서, 그 알림 메시지에 뭘 담을지 설계해 봐.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.