diff --git a/prediction/models/result.py b/prediction/models/result.py index bb7a69c..ae439e7 100644 --- a/prediction/models/result.py +++ b/prediction/models/result.py @@ -70,8 +70,24 @@ class AnalysisResult: """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 {} + # features dict 내부 numpy 값도 변환 (재귀적 처리) + # int/float/bool/str/None/list/dict 모두 허용 (JSON 호환 타입만 유지) + def _sanitize(v): + if v is None or isinstance(v, (str, bool)): + return v + if isinstance(v, (int, float)): + return float(v) if isinstance(v, float) else int(v) + if isinstance(v, dict): + return {str(k): _sanitize(val) for k, val in v.items()} + if isinstance(v, (list, tuple)): + return [_sanitize(x) for x in v] + # numpy 스칼라 등은 float 변환 시도, 실패 시 str + try: + return float(v) + except (TypeError, ValueError): + return str(v) + + safe_features = _sanitize(self.features) if self.features else {} return ( str(self.mmsi),