移除走势图 UMA 前缀,清理未使用变量 metar_ctx

This commit is contained in:
2569718930@qq.com
2026-05-25 06:26:15 +08:00
parent c9339c1bca
commit 56b630029f
+85 -1
View File
@@ -1,7 +1,8 @@
from __future__ import annotations from __future__ import annotations
import hashlib
from datetime import datetime, timedelta from datetime import datetime, timedelta
from typing import Any, Dict, List from typing import Any, Dict, List, Optional
from web.core import CITIES from web.core import CITIES
from web.analysis_service import _analyze, _build_city_market_scan_payload from web.analysis_service import _analyze, _build_city_market_scan_payload
@@ -138,6 +139,10 @@ def _scan_city_terminal_rows(
*, *,
force_refresh: bool = False, force_refresh: bool = False,
) -> Dict[str, Any]: ) -> Dict[str, Any]:
# Quick mode: skip Polymarket matching, return cached analysis rows only
if filters.get("skip_polymarket"):
return _scan_city_terminal_rows_quick(city, filters, force_refresh=force_refresh)
# Try cached analysis first; force-refresh if probability distribution is missing # Try cached analysis first; force-refresh if probability distribution is missing
data = _analyze( data = _analyze(
city, city,
@@ -193,3 +198,82 @@ def _scan_city_terminal_rows(
"candidate_total": candidate_total, "candidate_total": candidate_total,
"primary_scores": primary_scores, "primary_scores": primary_scores,
} }
def _scan_city_terminal_rows_quick(
city: str,
filters: Dict[str, Any],
*,
force_refresh: bool = False,
) -> Dict[str, Any]:
"""Fast path that skips Polymarket matching — returns a single row per city
with cached analysis data (Obs, DEB, probabilities) but no market prices."""
data = _analyze(
city,
force_refresh=force_refresh,
include_llm_commentary=False,
detail_mode="panel",
)
row = _build_quick_row(city=city, data=data)
return {
"city": city,
"rows": [row] if row else [],
"candidate_total": 1,
"primary_scores": [float(row.get("final_score") or 0)] if row else [],
}
def _build_quick_row(
*,
city: str,
data: Dict[str, Any],
) -> Optional[Dict[str, Any]]:
curr = data.get("current") or {}
risk = data.get("risk") or {}
deb = data.get("deb") or {}
probs = data.get("probabilities") or {}
multi = data.get("multi_model") or {}
distribution = probs.get("distribution") or []
local_date = str(data.get("local_date") or "")
local_time = str(data.get("local_time") or "")
id_parts = [city, local_date or "today"]
if data.get("temp_symbol") == "°F":
id_parts.append("F")
row_id = hashlib.sha256("|".join(id_parts).encode()).hexdigest()[:16]
row: Dict[str, Any] = {
"id": f"{city}:{local_date or 'today'}",
"city": city,
"city_display_name": str(data.get("display_name") or city),
"airport": str(risk.get("airport") or ""),
"local_date": local_date,
"local_time": local_time,
"tz_offset_seconds": data.get("utc_offset_seconds"),
"temp_symbol": data.get("temp_symbol"),
"risk_level": risk.get("level"),
"current_temp": curr.get("temp"),
"current_max_so_far": curr.get("max_so_far"),
"deb_prediction": deb.get("prediction"),
"model_cluster_sources": {
str(k): v for k, v in multi.get("forecasts", {}).items()
if v is not None
},
"distribution_preview": distribution[:6] if distribution else [],
"trading_region": data.get("trading_region"),
"trading_region_sort": data.get("trading_region_sort"),
"active": True,
"closed": False,
"tradable": False,
"is_primary_signal": True,
"accepting_orders": False,
"row_id": row_id,
}
# Compute a simple edge: model top probability vs neutral
best_model_prob = max(
(float(b.get("probability") or 0) for b in distribution[:6]),
default=None,
)
row["model_probability"] = best_model_prob
row["final_score"] = float(deb.get("prediction") or 0)
return row