fix(prediction): pair_trawl pool 에 sog/cog 계산된 궤적 사용 (A-1 후속)

버그: 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).
수정 후 재검증 예정.
This commit is contained in:
htlee 2026-04-16 09:27:42 +09:00
부모 1a065840bd
커밋 6c08d831d0

파일 보기

@ -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