diff --git a/prediction/models/result.py b/prediction/models/result.py index 9792351..e1680a5 100644 --- a/prediction/models/result.py +++ b/prediction/models/result.py @@ -56,29 +56,41 @@ class AnalysisResult: def to_db_tuple(self) -> tuple: import json + + def _f(v: object) -> float: + """numpy float → Python float 변환.""" + return float(v) if v is not None else 0.0 + + def _i(v: object) -> int: + """numpy int → Python int 변환.""" + return int(v) if v is not None else 0 + + # features dict 내부 numpy 값도 변환 + safe_features = {k: float(v) for k, v in self.features.items()} if self.features else {} + return ( - self.mmsi, + str(self.mmsi), self.timestamp, - self.vessel_type, - self.confidence, - self.fishing_pct, - self.cluster_id, - self.season, - self.zone, - self.dist_to_baseline_nm, - self.activity_state, - self.ucaf_score, - self.ucft_score, - self.is_dark, - self.gap_duration_min, - self.spoofing_score, - self.bd09_offset_m, - self.speed_jump_count, - self.cluster_size, - self.is_leader, - self.fleet_role, - self.risk_score, - self.risk_level, - json.dumps(self.features), + str(self.vessel_type), + _f(self.confidence), + _f(self.fishing_pct), + _i(self.cluster_id), + str(self.season), + str(self.zone), + _f(self.dist_to_baseline_nm), + str(self.activity_state), + _f(self.ucaf_score), + _f(self.ucft_score), + bool(self.is_dark), + _i(self.gap_duration_min), + _f(self.spoofing_score), + _f(self.bd09_offset_m), + _i(self.speed_jump_count), + _i(self.cluster_size), + bool(self.is_leader), + str(self.fleet_role), + _i(self.risk_score), + str(self.risk_level), + json.dumps(safe_features), self.analyzed_at, )