From 6c08d831d0874bbd56e8137e4c2e13b7c2d63594 Mon Sep 17 00:00:00 2001 From: htlee Date: Thu, 16 Apr 2026 09:27:42 +0900 Subject: [PATCH] =?UTF-8?q?fix(prediction):=20pair=5Ftrawl=20pool=20?= =?UTF-8?q?=EC=97=90=20sog/cog=20=EA=B3=84=EC=82=B0=EB=90=9C=20=EA=B6=A4?= =?UTF-8?q?=EC=A0=81=20=EC=82=AC=EC=9A=A9=20(A-1=20=ED=9B=84=EC=86=8D)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 버그: vessel_store._tracks 는 raw_sog 만 보유 → _trajectory_similarity 가 sog/cog 컬럼 부재로 항상 0 반환 → candidates=0. df_targets(select_analysis_targets 결과, 412* 전체 8k+ 에 sog/cog 계산) 를 mmsi 별로 groupby 하여 pool_tracks dict 생성. base 확장 필터의 sog 컬럼도 동일하게 적용. 첫 사이클 로그: base=512, pool=54825 → candidates=0 (2026-04-16 09:25). 수정 후 재검증 예정. --- prediction/scheduler.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/prediction/scheduler.py b/prediction/scheduler.py index de27e68..7032046 100644 --- a/prediction/scheduler.py +++ b/prediction/scheduler.py @@ -212,9 +212,19 @@ def run_analysis_cycle(): pt_sub_registered: set[str] = set() # TODO: fishery_code=PT-S 구분 base_mmsis: set[str] = {c['mmsi'] for c in classifications} base_mmsis |= pt_registered + # pool_tracks: 중국 전체 8k+ 선박의 sog/cog 계산된 궤적 + # df_targets 는 select_analysis_targets() 에서 이미 전체 412* 에 sog/cog 계산 + # (vessel_store._tracks 는 raw_sog 만 보유해 _trajectory_similarity 가 동작 안 함) + pool_tracks: dict = {} + try: + for mmsi_val, grp in df_targets.groupby('mmsi'): + pool_tracks[str(mmsi_val)] = grp.reset_index(drop=True) + except Exception as e: + logger.warning('pool_tracks 생성 실패, vessel_dfs fallback: %s', e) + pool_tracks = dict(vessel_dfs) + # 조업 속력대(1.5~5.0kn)에서 움직이는 모든 중국 선박을 base로 확장. # classifications 500척만으로는 bbox 기점이 부족해 실제 공조 페어를 놓침. - pool_tracks = getattr(vessel_store, '_tracks', {}) or vessel_dfs for mmsi, df in pool_tracks.items(): if not mmsi.startswith('412'): continue