From 1ab10a9c9039c2194eb33b817f82cbc8d66dc4b2 Mon Sep 17 00:00:00 2001 From: "2569718930@qq.com" <2569718930@qq.com> Date: Sun, 17 May 2026 19:19:12 +0800 Subject: [PATCH] Add MGM hourly support for Ankara models --- tests/test_analysis_ttl.py | 14 +++++++++++++- web/analysis_service.py | 25 +++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 1 deletion(-) diff --git a/tests/test_analysis_ttl.py b/tests/test_analysis_ttl.py index 17b45de1..a84f356c 100644 --- a/tests/test_analysis_ttl.py +++ b/tests/test_analysis_ttl.py @@ -1,4 +1,4 @@ -from web.analysis_service import _analysis_ttl_for_city +from web.analysis_service import _analysis_ttl_for_city, _mgm_hourly_high from web.core import CACHE_TTL @@ -10,3 +10,15 @@ def test_high_frequency_airport_cities_use_one_minute_analysis_cache(): def test_non_high_frequency_city_keeps_default_analysis_cache_ttl(): assert _analysis_ttl_for_city("new york") == CACHE_TTL + + +def test_mgm_hourly_high_fills_turkish_model_support(): + assert _mgm_hourly_high( + { + "hourly": [ + {"time": "2026-05-17T10:00:00Z", "temp": 18.0}, + {"time": "2026-05-17T11:00:00Z", "temp": 21.5}, + {"time": "2026-05-17T12:00:00Z", "temp": None}, + ] + } + ) == 21.5 diff --git a/web/analysis_service.py b/web/analysis_service.py index 9621ca4d..d7049cdc 100644 --- a/web/analysis_service.py +++ b/web/analysis_service.py @@ -67,6 +67,20 @@ HIGH_FREQ_AIRPORT_ANALYSIS_CITIES = { "chongqing", "wuhan", } + + +def _mgm_hourly_high(mgm: Dict[str, Any]) -> Optional[float]: + hourly = mgm.get("hourly") if isinstance(mgm, dict) else [] + if not isinstance(hourly, list): + return None + values = [] + for row in hourly: + if not isinstance(row, dict): + continue + value = _sf(row.get("temp")) + if value is not None: + values.append(value) + return max(values) if values else None _ANALYSIS_CACHE_STATS_LOCK = threading.Lock() _ANALYSIS_CACHE_STATS: Dict[str, Any] = { "total_requests": 0, @@ -2015,11 +2029,14 @@ def _analyze( if om_today is None: nws_high = _sf(raw.get("nws", {}).get("today_high")) mgm_high = _sf(mgm.get("today_high")) if mgm else None + mgm_hourly_high = _mgm_hourly_high(mgm) fallback_high = ( nws_high if nws_high is not None else mgm_high if mgm_high is not None + else mgm_hourly_high + if mgm_hourly_high is not None else max_so_far if max_so_far is not None else cur_temp @@ -2051,8 +2068,11 @@ def _analyze( if nws_high is not None: current_forecasts["NWS"] = nws_high mgm_high = _sf(mgm.get("today_high")) if mgm else None + mgm_hourly_high = _mgm_hourly_high(mgm) if mgm_high is not None: current_forecasts["MGM"] = mgm_high + elif mgm_hourly_high is not None: + current_forecasts["MGM Hourly"] = mgm_hourly_high # ── 6. DEB fusion ── deb_val, deb_weights = None, "" @@ -2874,6 +2894,7 @@ def _analyze_summary(city: str, force_refresh: bool = False) -> Dict[str, Any]: om_today = _sf(maxtemps[0]) if maxtemps else None nws_high = _sf((nws or {}).get("today_high")) if isinstance(nws, dict) else None mgm_high = _sf((mgm or {}).get("today_high")) if isinstance(mgm, dict) else None + mgm_hourly_high = _mgm_hourly_high(mgm) if om_today is None: fallback_high = ( @@ -2881,6 +2902,8 @@ def _analyze_summary(city: str, force_refresh: bool = False) -> Dict[str, Any]: if nws_high is not None else mgm_high if mgm_high is not None + else mgm_hourly_high + if mgm_hourly_high is not None else max_so_far if max_so_far is not None else cur_temp @@ -2898,6 +2921,8 @@ def _analyze_summary(city: str, force_refresh: bool = False) -> Dict[str, Any]: current_forecasts["NWS"] = nws_high if mgm_high is not None: current_forecasts["MGM"] = mgm_high + elif mgm_hourly_high is not None: + current_forecasts["MGM Hourly"] = mgm_hourly_high if hko_forecast is not None: current_forecasts["HKO"] = _sf(hko_forecast) current_forecasts = {