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 로 변경.
  • 이전엔 non-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 를 경고로 surface.

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 함수 돌려서 drift 한 거 봐. Slack 알림 받을 만한 drift 신호 (예: column null rate 가 0.5% 에서 8% 로 뜀) 하나 골라서 알림 메시지에 뭐 들어갈지 설계.

Progress

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

댓글 0

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

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