Clarify intraday suppression headlines
This commit is contained in:
@@ -312,6 +312,38 @@ def test_intraday_meteorology_suppressed_cloud_rain_case():
|
|||||||
assert any(item["direction"] == "suppress" for item in payload["signal_contributions"])
|
assert any(item["direction"] == "suppress" for item in payload["signal_contributions"])
|
||||||
|
|
||||||
|
|
||||||
|
def test_intraday_meteorology_structural_cap_does_not_claim_taf_cloud_rain():
|
||||||
|
payload = _build_intraday_meteorology(
|
||||||
|
{
|
||||||
|
"local_time": "11:30",
|
||||||
|
"temp_symbol": "°C",
|
||||||
|
"current": {"temp": 39.0, "max_so_far": 39.0},
|
||||||
|
"deb": {"prediction": 40.4},
|
||||||
|
"probabilities": {"distribution": [{"value": 42, "probability": 0.35}]},
|
||||||
|
"peak": {"first_h": 12, "last_h": 16, "status": "before"},
|
||||||
|
"deviation_monitor": {"direction": "cold", "severity": "strong", "current_delta": -1.4},
|
||||||
|
"vertical_profile_signal": {
|
||||||
|
"heating_setup": "suppressed",
|
||||||
|
"suppression_risk": "medium",
|
||||||
|
"summary_zh": "边界层混合偏弱,午后上修需要后续观测确认。",
|
||||||
|
},
|
||||||
|
"taf": {
|
||||||
|
"signal": {
|
||||||
|
"available": True,
|
||||||
|
"suppression_level": "low",
|
||||||
|
"disruption_level": "low",
|
||||||
|
"summary_zh": "TAF 在峰值窗口暂未提示明显云雨压温。",
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
assert "结构信号压制" in payload["headline"]
|
||||||
|
assert "TAF 云雨层暂未构成主压温理由" in payload["headline"]
|
||||||
|
assert "存在云雨或结构压制" not in payload["headline"]
|
||||||
|
assert any(item["label"] == "TAF 云雨扰动" and item["direction"] == "support" for item in payload["signal_contributions"])
|
||||||
|
|
||||||
|
|
||||||
def test_intraday_meteorology_handles_sparse_observations():
|
def test_intraday_meteorology_handles_sparse_observations():
|
||||||
payload = _build_intraday_meteorology(
|
payload = _build_intraday_meteorology(
|
||||||
{
|
{
|
||||||
|
|||||||
+19
-2
@@ -1320,6 +1320,11 @@ def _build_intraday_meteorology(data: Dict[str, Any]) -> Dict[str, Any]:
|
|||||||
|
|
||||||
taf_suppression = str(taf_signal.get("suppression_level") or "").lower()
|
taf_suppression = str(taf_signal.get("suppression_level") or "").lower()
|
||||||
taf_disruption = str(taf_signal.get("disruption_level") or "").lower()
|
taf_disruption = str(taf_signal.get("disruption_level") or "").lower()
|
||||||
|
taf_has_cloud_rain_cap = taf_suppression in {"medium", "high"} or taf_disruption in {
|
||||||
|
"medium",
|
||||||
|
"high",
|
||||||
|
}
|
||||||
|
structural_cap = False
|
||||||
if taf_signal.get("available") or taf_suppression:
|
if taf_signal.get("available") or taf_suppression:
|
||||||
available_layers += 1
|
available_layers += 1
|
||||||
if taf_suppression == "high" or taf_disruption == "high":
|
if taf_suppression == "high" or taf_disruption == "high":
|
||||||
@@ -1405,8 +1410,20 @@ def _build_intraday_meteorology(data: Dict[str, Any]) -> Dict[str, Any]:
|
|||||||
headline_en = "The peak window has passed; the read now shifts toward confirming the final high rather than chasing further upside."
|
headline_en = "The peak window has passed; the read now shifts toward confirming the final high rather than chasing further upside."
|
||||||
confidence = "high" if available_layers >= 2 else "medium"
|
confidence = "high" if available_layers >= 2 else "medium"
|
||||||
elif suppress_score >= support_score + 2:
|
elif suppress_score >= support_score + 2:
|
||||||
headline = "峰值存在云雨或结构压制,当前更偏防守高温上修。"
|
structural_cap = any(
|
||||||
headline_en = "Cloud/rain or structural suppression is capping the peak; defend against aggressive high-temperature upside for now."
|
signal.get("direction") == "suppress"
|
||||||
|
and signal.get("label") in {"边界层结构", "站网对比", "日内节奏"}
|
||||||
|
for signal in signals
|
||||||
|
)
|
||||||
|
if taf_has_cloud_rain_cap and structural_cap:
|
||||||
|
headline = "峰值同时存在 TAF 云雨扰动和结构压制,当前更偏防守高温上修。"
|
||||||
|
headline_en = "Both TAF cloud/rain disruption and structural signals are capping the peak; defend against aggressive high-temperature upside for now."
|
||||||
|
elif taf_has_cloud_rain_cap:
|
||||||
|
headline = "TAF 提示峰值窗口有云雨扰动,当前更偏防守高温上修。"
|
||||||
|
headline_en = "TAF flags cloud/rain disruption near the peak window; defend against aggressive high-temperature upside for now."
|
||||||
|
else:
|
||||||
|
headline = "峰值主要受结构信号压制,TAF 云雨层暂未构成主压温理由。"
|
||||||
|
headline_en = "The peak is mainly capped by structural signals; TAF cloud/rain is not the primary suppression reason for now."
|
||||||
confidence = "high" if available_layers >= 3 else "medium"
|
confidence = "high" if available_layers >= 3 else "medium"
|
||||||
elif support_score >= suppress_score + 2:
|
elif support_score >= suppress_score + 2:
|
||||||
headline = "峰值仍有上修空间,后续重点看峰值窗口内报文能否继续抬升。"
|
headline = "峰值仍有上修空间,后续重点看峰值窗口内报文能否继续抬升。"
|
||||||
|
|||||||
Reference in New Issue
Block a user