utils.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. """
  2. 工具函数模块
  3. """
  4. import numpy as np
  5. import pandas as pd
  6. def convert_to_native_types(obj):
  7. """递归地将 numpy/pandas 类型转换为 Python 原生类型,以便 JSON 序列化"""
  8. if isinstance(obj, (np.integer, np.int_, np.intc, np.intp, np.int8,
  9. np.int16, np.int32, np.int64, np.uint8, np.uint16,
  10. np.uint32, np.uint64)):
  11. return int(obj)
  12. elif isinstance(obj, (np.floating, np.float64, np.float16, np.float32, np.float64)):
  13. return float(obj)
  14. elif isinstance(obj, (np.bool_, np.bool)):
  15. return bool(obj)
  16. elif isinstance(obj, (np.ndarray, pd.Series)):
  17. return obj.tolist()
  18. elif isinstance(obj, pd.DataFrame):
  19. return obj.to_dict('records')
  20. elif isinstance(obj, dict):
  21. return {key: convert_to_native_types(value) for key, value in obj.items()}
  22. elif isinstance(obj, (list, tuple)):
  23. return [convert_to_native_types(item) for item in obj]
  24. elif isinstance(obj, (str, int, float, bool, type(None))):
  25. return obj
  26. else:
  27. try:
  28. return str(obj)
  29. except Exception:
  30. return obj
  31. def ensure_native_type(value, target_type=float, decimal_places=2):
  32. """确保值为 Python 原生类型,并保留指定小数位数"""
  33. if isinstance(value, (np.integer, np.floating)):
  34. converted = target_type(value)
  35. if target_type == float and decimal_places is not None:
  36. return round(converted, decimal_places)
  37. return converted
  38. if isinstance(value, float) and decimal_places is not None:
  39. return round(value, decimal_places)
  40. return value