posterior.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. """后验 rov_diff / vov_diff 的共享语义与格式化。"""
  2. from __future__ import annotations
  3. from decimal import Decimal
  4. from typing import Any
  5. # real_rov_7d / real_vov_7d 字段存的是相对全局基线的 diff,不是绝对 ROV/VOV。
  6. POSTERIOR_EFFECT_ACCEPTABLE_FLOOR = -0.2
  7. def classify_posterior_effect(avg: Decimal | float | int | None) -> str | None:
  8. """将 rov_diff / vov_diff 映射为效果档位。"""
  9. if avg is None:
  10. return None
  11. value = float(avg)
  12. if value > 0:
  13. return "效果非常好"
  14. if value >= POSTERIOR_EFFECT_ACCEPTABLE_FLOOR:
  15. return "可接受"
  16. return "效果不佳"
  17. def _format_score(avg: Decimal | float | int | None) -> str:
  18. if avg is None:
  19. return "—"
  20. value = float(avg)
  21. if value >= 100:
  22. return f"{value:.0f}"
  23. if value >= 1:
  24. return f"{value:.2f}"
  25. return f"{value:.4f}"
  26. def format_posterior_value(avg: Decimal | float | int | None) -> str:
  27. """格式化单条后验 diff 值(无样本数),附带效果档位说明。"""
  28. if avg is None:
  29. return "—"
  30. effect = classify_posterior_effect(avg)
  31. base = _format_score(avg)
  32. return f"{base} [{effect}]" if effect else base
  33. def format_posterior_dim_with_count(
  34. avg: Decimal | float | int | None,
  35. count: int | None,
  36. ) -> str:
  37. """格式化后验 diff 指标,附带效果档位说明。"""
  38. sample_count = int(count or 0)
  39. if sample_count <= 0:
  40. return "—"
  41. effect = classify_posterior_effect(avg)
  42. base = f"{_format_score(avg)}(n={sample_count})"
  43. return f"{base} [{effect}]" if effect else base
  44. def format_posterior_pair(
  45. rov_avg: Any,
  46. rov_count: int | None,
  47. vov_avg: Any,
  48. vov_count: int | None,
  49. ) -> str:
  50. """格式化 ROV/VOV diff 对。"""
  51. rov_text = format_posterior_dim_with_count(rov_avg, rov_count)
  52. vov_text = format_posterior_dim_with_count(vov_avg, vov_count)
  53. if rov_text == "—" and vov_text == "—":
  54. return "后验 diff 暂无样本"
  55. return f"rov_diff={rov_text} vov_diff={vov_text}"