Files
PolyWeather/src/data_collection/city_risk_profiles.py
T

198 lines
6.2 KiB
Python

# Polymarket 城市温度市场 - 数据偏差风险档案
# 基于 METAR 机场站与市区实际温度的系统性差异
CITY_RISK_PROFILES = {
# 🔴 高危城市 - 数据偏差大,容易误判
"seoul": {
"risk_level": "high",
"risk_emoji": "🔴",
"icao": "RKSI",
"airport_name": "仁川国际机场",
"distance_km": 48.8,
"elevation_diff_m": 0,
"typical_bias_f": 5.8,
"bias_direction": "机场靠海偏暖,市区内陆更冷",
"warning": "距离太远,根本不是同一个天气区",
"season_notes": None,
},
"chicago": {
"risk_level": "high",
"risk_emoji": "🔴",
"icao": "KORD",
"airport_name": "O'Hare 国际机场",
"distance_km": 25.3,
"elevation_diff_m": 42,
"typical_bias_f": 4.0,
"bias_direction": "密歇根湖效应:风向变化时湖边vs内陆可差10°F+",
"warning": "冬天温差最不稳定",
"season_notes": "冬季",
},
# 🟡 中危城市 - 存在系统偏差,需注意
"ankara": {
"risk_level": "medium",
"risk_emoji": "🟡",
"icao": "LTAC",
"airport_name": "Esenboğa 机场",
"distance_km": 24.5,
"elevation_diff_m": 65,
"typical_bias_f": 2.0,
"bias_direction": "机场海拔更高",
"warning": "内陆高原城市,昼夜温差大(可达15°C+)",
"season_notes": "下午最高温时偏差会放大",
},
"london": {
"risk_level": "low",
"risk_emoji": "🟢",
"icao": "EGLC",
"airport_name": "London City 机场",
"distance_km": 12.7,
"elevation_diff_m": 4,
"typical_bias_f": 0.5,
"bias_direction": "河水调节效应:泰晤士河 Royal Docks 使得夏天偏凉,冬天偏暖",
"warning": "极端天气日(热浪/寒潮)偏差会显著放大",
"season_notes": None,
},
"dallas": {
"risk_level": "medium",
"risk_emoji": "🟡",
"icao": "KDAL",
"airport_name": "Dallas Love Field 机场",
"distance_km": 11.2,
"elevation_diff_m": 0,
"typical_bias_f": 1.1,
"bias_direction": "比 DFW 更接近市中心,数据更准",
"warning": "城市热岛效应在夏季午后会使温度略高于郊区",
"season_notes": None,
},
"buenos aires": {
"risk_level": "medium",
"risk_emoji": "🟡",
"icao": "SAEZ",
"airport_name": "Ezeiza 国际机场",
"distance_km": 28.1,
"elevation_diff_m": 0,
"typical_bias_f": 1.2,
"bias_direction": "夏天城区可比郊区高2-3°C",
"warning": "距离远但地形平坦,偏差稳定可预测",
"season_notes": "夏季",
},
# 🟢 低危城市 - 数据相对靠谱
"toronto": {
"risk_level": "low",
"risk_emoji": "🟢",
"icao": "CYYZ",
"airport_name": "Pearson 国际机场",
"distance_km": 19.6,
"elevation_diff_m": 0,
"typical_bias_f": 0.3,
"bias_direction": None,
"warning": "冬季湖效应偶尔炸裂",
"season_notes": "冬季",
},
"new york": {
"risk_level": "low",
"risk_emoji": "🟢",
"icao": "KLGA",
"airport_name": "LaGuardia 机场",
"distance_km": 14.5,
"elevation_diff_m": 0,
"typical_bias_f": 0.7,
"bias_direction": "相比 JFK 更靠近曼哈顿",
"warning": "东河水汽可能在春季产生微小的降温效果",
"season_notes": None,
},
"seattle": {
"risk_level": "low",
"risk_emoji": "🟢",
"icao": "KSEA",
"airport_name": "Sea-Tac 国际机场",
"distance_km": 17.4,
"elevation_diff_m": 0,
"typical_bias_f": 0.6,
"bias_direction": "微气候差异存在但较小",
"warning": None,
"season_notes": None,
},
"atlanta": {
"risk_level": "low",
"risk_emoji": "🟢",
"icao": "KATL",
"airport_name": "Hartsfield-Jackson 机场",
"distance_km": 12.6,
"elevation_diff_m": 0,
"typical_bias_f": 0.5,
"bias_direction": None,
"warning": None,
"season_notes": None,
},
"miami": {
"risk_level": "low",
"risk_emoji": "🟢",
"icao": "KMIA",
"airport_name": "Miami 国际机场",
"distance_km": 10.3,
"elevation_diff_m": 0,
"typical_bias_f": 0.3,
"bias_direction": None,
"warning": None,
"season_notes": None,
},
"wellington": {
"risk_level": "low",
"risk_emoji": "🟢",
"icao": "NZWN",
"airport_name": "Wellington 机场",
"distance_km": 5.1,
"elevation_diff_m": 0,
"typical_bias_f": 0.2,
"bias_direction": None,
"warning": "12城最近,数据最靠谱",
"season_notes": None,
},
}
def get_city_risk_profile(city_name: str) -> dict:
"""获取城市的风险档案"""
city_lower = city_name.lower().strip()
city_key = city_lower
return CITY_RISK_PROFILES.get(city_key)
def format_risk_warning(profile: dict, temp_symbol: str) -> str:
"""格式化风险警告信息"""
if not profile:
return ""
lines = []
# 风险等级标题
risk_labels = {
"high": "高危",
"medium": "中危",
"low": "低危"
}
risk_label = risk_labels.get(profile["risk_level"], "未知")
lines.append(f"⚠️ <b>数据偏差风险</b>: {profile['risk_emoji']} {risk_label}")
# 机场信息
lines.append(f" 📍 机场: {profile['airport_name']} ({profile['icao']})")
lines.append(f" 📏 距市区: {profile['distance_km']}km")
# 典型偏差
if profile["typical_bias_f"] >= 1.0:
lines.append(f" 📊 偏差: ±{profile['typical_bias_f']}{temp_symbol}")
# 偏差方向说明
if profile["bias_direction"]:
lines.append(f" 💡 {profile['bias_direction']}")
# 特别警告
if profile["warning"]:
lines.append(f" 🚨 {profile['warning']}")
return "\n".join(lines)