Fix issues 3
This commit is contained in:
@@ -6,7 +6,8 @@ Main training service that uses the repository pattern for data access
|
||||
from typing import Dict, List, Any, Optional
|
||||
import uuid
|
||||
import structlog
|
||||
from datetime import datetime
|
||||
from datetime import datetime, date, timezone
|
||||
from decimal import Decimal
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
import json
|
||||
import numpy as np
|
||||
@@ -37,10 +38,26 @@ logger = structlog.get_logger()
|
||||
|
||||
def make_json_serializable(obj):
|
||||
"""Convert numpy/pandas types, datetime, and UUID objects to JSON-serializable Python types"""
|
||||
import uuid
|
||||
from decimal import Decimal
|
||||
from datetime import datetime, date
|
||||
|
||||
# Handle None values
|
||||
if obj is None:
|
||||
return None
|
||||
|
||||
# Handle basic datetime types first (most common)
|
||||
if isinstance(obj, datetime):
|
||||
return obj.isoformat()
|
||||
elif isinstance(obj, date):
|
||||
return obj.isoformat()
|
||||
|
||||
# Handle pandas timestamp types
|
||||
if hasattr(pd, 'Timestamp') and isinstance(obj, pd.Timestamp):
|
||||
return obj.isoformat()
|
||||
|
||||
# Handle numpy datetime types
|
||||
if hasattr(np, 'datetime64') and isinstance(obj, np.datetime64):
|
||||
return pd.Timestamp(obj).isoformat()
|
||||
|
||||
# Handle numeric types
|
||||
if isinstance(obj, (np.integer, pd.Int64Dtype)):
|
||||
return int(obj)
|
||||
elif isinstance(obj, (np.floating, pd.Float64Dtype)):
|
||||
@@ -51,19 +68,36 @@ def make_json_serializable(obj):
|
||||
return obj.tolist()
|
||||
elif isinstance(obj, pd.DataFrame):
|
||||
return obj.to_dict('records')
|
||||
elif isinstance(obj, Decimal):
|
||||
return float(obj)
|
||||
|
||||
# Handle UUID types
|
||||
elif isinstance(obj, uuid.UUID):
|
||||
return str(obj)
|
||||
elif hasattr(obj, '__class__') and 'UUID' in str(obj.__class__):
|
||||
# Handle any UUID-like objects (including asyncpg.pgproto.pgproto.UUID)
|
||||
return str(obj)
|
||||
elif isinstance(obj, Decimal):
|
||||
return float(obj)
|
||||
|
||||
# Handle collections recursively
|
||||
elif isinstance(obj, dict):
|
||||
return {k: make_json_serializable(v) for k, v in obj.items()}
|
||||
elif isinstance(obj, list):
|
||||
elif isinstance(obj, (list, tuple)):
|
||||
return [make_json_serializable(item) for item in obj]
|
||||
else:
|
||||
elif isinstance(obj, set):
|
||||
return [make_json_serializable(item) for item in obj]
|
||||
|
||||
# Handle other common types
|
||||
elif isinstance(obj, (str, int, float, bool)):
|
||||
return obj
|
||||
|
||||
# Last resort: try to convert to string
|
||||
else:
|
||||
try:
|
||||
# For any other object, try to convert to string
|
||||
return str(obj)
|
||||
except Exception:
|
||||
# If all else fails, return None
|
||||
return None
|
||||
|
||||
|
||||
class EnhancedTrainingService:
|
||||
|
||||
Reference in New Issue
Block a user