From 77b7a09843c25276ac9193db8131d3c828d26378 Mon Sep 17 00:00:00 2001
From: "2569718930@qq.com" <2569718930@qq.com>
Date: Fri, 27 Feb 2026 14:30:54 +0800
Subject: [PATCH] fix: show WU rounding intervals in probability, weight DEB
70% over ensemble 30%
---
bot_listener.py | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/bot_listener.py b/bot_listener.py
index ee644e7d..cabc540c 100644
--- a/bot_listener.py
+++ b/bot_listener.py
@@ -179,11 +179,13 @@ def analyze_weather_trend(weather_data, temp_symbol, city_name=None):
# 用 P10/P90 反推标准差: P10 = median - 1.28*sigma, P90 = median + 1.28*sigma
sigma = (ens_p90 - ens_p10) / 2.56
if sigma < 0.1: sigma = 0.1 # 防止除以零
- mu = ens_median # 以集合中位数为中心
- # 如果 DEB 融合值或多模型均值存在,用它们微调中心
+ # 分布中心:以 DEB/多模型中位数为主锚(权重 70%),集合中位数为辅(30%)
+ # 因为集合中位数经常偏保守,不如确定性模型和 DEB 融合值可靠
if forecast_median is not None:
- mu = (ens_median + forecast_median) / 2 # 取集合中位数和模型中位数的均值
+ mu = forecast_median * 0.7 + ens_median * 0.3
+ else:
+ mu = ens_median
# 简化的正态 CDF (不依赖 scipy)
def _norm_cdf(x, m, s):
@@ -203,12 +205,12 @@ def analyze_weather_trend(weather_data, temp_symbol, city_name=None):
if total_p > 0:
probs = {k: v / total_p for k, v in probs.items()}
- # 格式化输出(按概率从高到低排列)
+ # 格式化输出(按概率从高到低排列,显示区间)
sorted_probs = sorted(probs.items(), key=lambda x: x[1], reverse=True)
- prob_parts = [f"{int(t)}{temp_symbol}({p*100:.0f}%)" for t, p in sorted_probs[:4]]
+ prob_parts = [f"{int(t)}{temp_symbol} [{t-0.5}~{t+0.5}) {p*100:.0f}%" for t, p in sorted_probs[:4]]
if prob_parts:
prob_str = " | ".join(prob_parts)
- insights.append(f"🎲 结算概率:{prob_str}")
+ insights.append(f"🎲 结算概率 (μ={mu:.1f}):{prob_str}")
ai_features.append(f"🎲 数学概率分布:{prob_str}")
# === 实测已超预报 & 趋势输出 ===