diff --git a/bot_listener.py b/bot_listener.py
index 7d4bac80..88e7acc1 100644
--- a/bot_listener.py
+++ b/bot_listener.py
@@ -110,54 +110,7 @@ def analyze_weather_trend(weather_data, temp_symbol, city_name=None):
is_cooling = "降温" in trend_desc
- # === 模型共识评分 ===
- mm_forecasts = weather_data.get("multi_model", {}).get("forecasts", {})
- labeled_forecasts = [(model_name, model_val) for model_name, model_val in mm_forecasts.items() if model_val is not None]
- if mb.get("today_high") is not None: labeled_forecasts.append(("MB", mb["today_high"]))
- if nws.get("today_high") is not None: labeled_forecasts.append(("NWS", nws["today_high"]))
-
- if len(labeled_forecasts) >= 2:
- f_values = [v for _, v in labeled_forecasts]
- consensus_spread = max(f_values) - min(f_values)
- tight_threshold = 1.5 if temp_symbol == "°F" else 0.8
- mid_threshold = 3.0 if temp_symbol == "°F" else 1.5
- parts = " | ".join([f"{name} {val}{temp_symbol}" for name, val in labeled_forecasts])
-
- if consensus_spread <= tight_threshold:
- msg = f"🎯 模型共识:高 ({len(labeled_forecasts)}源) — {parts},极差仅 {consensus_spread:.1f}°,高度一致。"
- elif consensus_spread <= mid_threshold:
- msg = f"⚖️ 模型共识:中 ({len(labeled_forecasts)}源) — {parts},极差 {consensus_spread:.1f}°,有轻微分歧。"
- else:
- highest = max(labeled_forecasts, key=lambda x: x[1])
- lowest = min(labeled_forecasts, key=lambda x: x[1])
- msg = f"⚠️ 模型共识:低 ({len(labeled_forecasts)}源) — {parts},极差 {consensus_spread:.1f}°!{highest[0]} 最高 vs {lowest[0]} 最低。"
-
- # 移交 AI 处理,不再给用户直接显示博弈区间
- ai_features.append(msg)
- elif len(labeled_forecasts) == 1:
- msg = f"📡 仅1个预报源 ({labeled_forecasts[0][0]} {labeled_forecasts[0][1]}{temp_symbol})"
- # 移交 AI 处理,不再给用户直接显示博弈区间
- ai_features.append(msg)
- # === 博弈区间提醒 ===
- if len(labeled_forecasts) >= 2:
- import math
- wu_round = lambda v: math.floor(v + 0.5)
- settlement_vals = sorted(set(wu_round(v) for _, v in labeled_forecasts))
-
- if max_so_far is not None and forecast_high is not None and max_so_far > forecast_high + 0.5:
- actual_settled = wu_round(max_so_far)
- msg = f"🎲 博弈区间:预报已失效!实测最高 {max_so_far}{temp_symbol} → WU {actual_settled}{temp_symbol},温度仍可能波动。"
- elif len(settlement_vals) == 1:
- msg = f"🎲 博弈区间:模型全部指向 {settlement_vals[0]}{temp_symbol} 结算。"
- elif len(settlement_vals) == 2:
- msg = f"🎲 博弈区间:在 {settlement_vals[0]}{temp_symbol} 和 {settlement_vals[1]}{temp_symbol} 之间博弈。"
- elif len(settlement_vals) == 3:
- msg = f"🎲 博弈区间:在 {settlement_vals[0]}{temp_symbol}、{settlement_vals[1]}{temp_symbol}、{settlement_vals[2]}{temp_symbol} 之间博弈。"
- else:
- msg = f"🎲 博弈区间:模型分歧太大,结算还不确定。"
- # 移交 AI 处理,不再给用户直接显示博弈区间
- ai_features.append(msg)
# === 集合预报区间 (去除了啰嗦的预报验证) ===
ensemble = weather_data.get("ensemble", {})
@@ -207,10 +160,15 @@ def analyze_weather_trend(weather_data, temp_symbol, city_name=None):
# 计算每个 WU 整数区间 [N-0.5, N+0.5) 的概率
center = round(mu)
candidates = range(center - 2, center + 3) # 5 个候选整数
+ # 如果已有实测最高温,低于该值的 WU 结算整数不可能出现
+ min_possible_wu = round(max_so_far) if max_so_far is not None else -999
+
probs = {}
for n in candidates:
+ if n < min_possible_wu:
+ continue # 已实测超过此温度,不可能结算在这里
p = _norm_cdf(n + 0.5, mu, sigma) - _norm_cdf(n - 0.5, mu, sigma)
- if p > 0.01: # 只保留概率 > 1% 的
+ if p > 0.01:
probs[n] = p
# 归一化