fix(data-quality): alias 중복으로 예측 산출이 전량 중단되던 문제 — 완전동일행만 흡수, 정체성 충돌은 유지 - #68
fix(data-quality): alias 중복으로 예측 산출이 전량 중단되던 문제 — 완전동일행만 흡수, 정체성 충돌은 유지#68choigod1023 wants to merge 1 commit into
Conversation
`attach_standardization_metadata` 는 `item_alias_candidates_v0.3.parquet` 에 local_item_key 가 하나라도 겹치면 예외를 던져 `stock_predictions.csv` 자체가 만들어지지 않았다. 실측하면 505,720행 중 중복은 51키 102행(0.02%)이고, 성격이 둘로 갈린다. - 읽어들이는 3개 컬럼이 완전히 같은 단순 중복 43행 - 남는 의미 충돌 8키 16행 — 전부 "분류행 1 + unresolved/UNCLASSIFIED 1" 8건 전수를 확인했고 서로 다른 분류가 맞붙는 경우는 0건이었다. unresolved 행은 정체성을 담고 있지 않으므로, 분류행을 남겨도 제품 정체성이 유실되지 않는다. 따라서 두 가지만 완화한다. 1. 읽는 컬럼 전체가 동일한 행은 중복이므로 제거 2. 분류행 1개 + placeholder 인 키는 분류행을 남긴다 (placeholder 만 있는 키는 하나를 남겨 키가 사라지지 않게 한다) 서로 다른 분류가 둘 이상인 키는 진짜 정체성 충돌이므로 **여전히 예외**를 내고 상류에서 고쳐야 한다. `item_alias_to_product_v1.parquet` 쪽은 성격이 다르다. 중복 51키 중 49키가 representative_item_id 자체가 다르고 완전 동일행은 0행이라, 같은 방식으로 흡수하면 실제로 제품 하나가 사라진다. 그쪽은 손대지 않았다. 수정 후 예측이 완주해 stock_predictions.csv 163,229행, stock_backtest_predictions.csv 605,437행이 산출됐다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-10 신규 PR 검토결론: 완전 동일행만 축약하고 실제 충돌은 막는 방향은 맞지만, 현재 placeholder 판정은 의미값을 임의로 선택할 수 있어 병합 전 수정이 필요합니다. 관련 테스트 6개와 통합 브랜치 전체 244개 테스트는 통과했습니다. Blocking 1:
|
Description
attach_standardization_metadata가 alias 중복 하나에도 예외를 던져stock_predictions.csv자체가 만들어지지 않았습니다. 수정 후 예측이 완주했습니다.#66리뷰에서 지적하신 "완전 동일행만 제거하고 semantic conflict 는 quarantine" 원칙을 그대로 적용했습니다. 제가 앞서standardized_history.py에 넣으려던 일괄drop_duplicates는 철회했습니다 — 지적이 맞았습니다.두 파일의 성격이 다릅니다
전수 실측 결과입니다.
item_alias_candidates_v0.3.parquetitem_alias_to_product_v1.parquet이 PR 은 앞쪽만 다룹니다. 뒤쪽은
representative_item_id자체가 다른 서로 다른 제품이라 흡수하면 하나가 사라집니다. 손대지 않았습니다.앞쪽 8건 전수 확인
의미 충돌 8키를 전부 열어봤고, 예외 없이 "분류행 1개 + unresolved/UNCLASSIFIED 1개" 였습니다.
unresolved/UNCLASSIFIED행은 품목에 대해 아무것도 주장하지 않습니다. 분류행을 남겨도 유실되는 정체성이 없습니다.조치
두 가지만 완화하고 나머지는 그대로 막습니다.
3번을 남긴 것이 핵심입니다. 진짜 충돌은 계속 시끄럽게 실패합니다.
작성 중 2번의 함정을 테스트가 잡았습니다. 처음 구현은 충돌 키의 placeholder 를 전부 지워서 placeholder 만 있는 키가 통째로 사라졌습니다. 테스트를 먼저 쓰지 않았으면 조용히 넘어갔을 결함입니다.
테스트
tests/test_data_quality.py신규 6건입니다.실행 결과
To Reviewer
normalization_status == "unresolved"그리고item_group_id_candidate == "UNCLASSIFIED"두 조건을 모두 만족할 때만 placeholder 로 봅니다. 더 좁혀야 한다면 알려주세요.item_normalization이 같은 local_item_key 를 두 번 만들지 않는 게 맞습니다. 이 PR 은 소비자 쪽 방어이고, 상류 수정은 별도 이슈로 빼는 게 좋을지 판단 부탁드립니다.item_alias_to_product_v1.parquet의 49키 정체성 충돌은 이 PR 범위 밖입니다. quarantine 설계가 필요하면 별도로 올리겠습니다.Type
PR Checklist