| import numpy as np |
| import pandas as pd |
| import logging |
|
|
| logger = logging.getLogger(__name__) |
|
|
| def convert_numpy_types(obj): |
| """ |
| Recursively convert NumPy types to standard Python types for JSON serialization. |
| """ |
| if isinstance(obj, (np.int_, np.intc, np.intp, np.int8, |
| np.int16, np.int32, np.int64, np.uint8, |
| np.uint16, np.uint32, np.uint64)): |
| return int(obj) |
| elif isinstance(obj, (np.float_, np.float16, np.float32, np.float64)): |
| return float(obj) |
| elif isinstance(obj, (np.ndarray,)): |
| return obj.tolist() |
| elif isinstance(obj, dict): |
| return {k: convert_numpy_types(v) for k, v in obj.items()} |
| elif isinstance(obj, list): |
| return [convert_numpy_types(i) for i in obj] |
| elif isinstance(obj, (pd.Timestamp, pd.DatetimeIndex)): |
| return str(obj) |
| return obj |
|
|
| def log_object_types(obj, prefix="", depth=0, max_depth=3): |
| """ |
| Log the types of keys and values in a dictionary or list to help debug serialization issues. |
| """ |
| if depth > max_depth: |
| return |
|
|
| indent = " " * depth |
| if isinstance(obj, dict): |
| for k, v in obj.items(): |
| logger.error(f"{indent}{prefix}Key: {k} ({type(k)}), Value Type: {type(v)}") |
| if isinstance(v, (dict, list)): |
| log_object_types(v, prefix=f"{k}.", depth=depth+1, max_depth=max_depth) |
| elif isinstance(obj, list): |
| for i, v in enumerate(obj[:5]): |
| logger.error(f"{indent}{prefix}Index: {i}, Value Type: {type(v)}") |
| if isinstance(v, (dict, list)): |
| log_object_types(v, prefix=f"[{i}].", depth=depth+1, max_depth=max_depth) |
|
|