feat: Implement PolyWeather application with a map-based frontend, Python web services, market alert engine, and supporting utilities.
This commit is contained in:
-121
@@ -588,127 +588,6 @@ def _normalize_city_or_404(name: str) -> str:
|
||||
return city
|
||||
|
||||
|
||||
def _resolve_target_date(city: str, target_date: Optional[str]) -> str:
|
||||
"""
|
||||
Resolve requested market date. If absent, default to current local date of city.
|
||||
"""
|
||||
if target_date:
|
||||
try:
|
||||
datetime.strptime(target_date, "%Y-%m-%d")
|
||||
except Exception:
|
||||
raise HTTPException(400, detail="target_date must be YYYY-MM-DD")
|
||||
return target_date
|
||||
|
||||
tz_seconds = CITIES.get(city, {}).get("tz", 0)
|
||||
return (datetime.now(timezone.utc) + timedelta(seconds=tz_seconds)).strftime(
|
||||
"%Y-%m-%d"
|
||||
)
|
||||
|
||||
|
||||
@app.get("/api/polymarket/{name}")
|
||||
async def city_polymarket_snapshot(
|
||||
name: str,
|
||||
target_date: Optional[str] = None,
|
||||
force_refresh: bool = False,
|
||||
):
|
||||
"""
|
||||
Return Polymarket city/date market snapshot with buy/sell prices and spreads.
|
||||
"""
|
||||
city = _normalize_city_or_404(name)
|
||||
resolved_date = _resolve_target_date(city, target_date)
|
||||
|
||||
from src.data_collection.polymarket_client import build_city_market_snapshot
|
||||
|
||||
proxy = (
|
||||
(_config.get("polymarket", {}) or {}).get("proxy")
|
||||
or (_config.get("app", {}) or {}).get("proxy")
|
||||
)
|
||||
snapshot = build_city_market_snapshot(
|
||||
city=city,
|
||||
target_date=resolved_date,
|
||||
proxy=proxy,
|
||||
force_refresh=force_refresh,
|
||||
)
|
||||
return snapshot
|
||||
|
||||
|
||||
@app.get("/api/polymarket/{name}/alerts")
|
||||
async def city_polymarket_alerts(
|
||||
name: str,
|
||||
target_date: Optional[str] = None,
|
||||
force_refresh: bool = False,
|
||||
):
|
||||
"""
|
||||
Return orderbook anomalies plus strategy-focused trading alerts.
|
||||
"""
|
||||
city = _normalize_city_or_404(name)
|
||||
resolved_date = _resolve_target_date(city, target_date)
|
||||
|
||||
from src.data_collection.polymarket_client import build_city_market_snapshot
|
||||
from src.analysis.market_alert_engine import build_trading_alerts
|
||||
|
||||
proxy = (
|
||||
(_config.get("polymarket", {}) or {}).get("proxy")
|
||||
or (_config.get("app", {}) or {}).get("proxy")
|
||||
)
|
||||
snapshot = build_city_market_snapshot(
|
||||
city=city,
|
||||
target_date=resolved_date,
|
||||
proxy=proxy,
|
||||
force_refresh=force_refresh,
|
||||
)
|
||||
city_weather = _analyze(city, force_refresh=force_refresh)
|
||||
map_url = os.getenv("POLYWEATHER_MAP_URL") or "https://polyweather-pro.vercel.app/"
|
||||
trade_alerts = build_trading_alerts(
|
||||
city_weather=city_weather,
|
||||
market_snapshot=snapshot,
|
||||
map_url=map_url,
|
||||
)
|
||||
|
||||
return {
|
||||
"city": snapshot.get("city"),
|
||||
"target_date": snapshot.get("target_date"),
|
||||
"updated_at": snapshot.get("updated_at"),
|
||||
"summary": snapshot.get("summary"),
|
||||
"alerts": snapshot.get("alerts", []),
|
||||
"trade_alerts": trade_alerts,
|
||||
}
|
||||
|
||||
|
||||
@app.get("/api/polymarket/{name}/trade-alerts")
|
||||
async def city_trade_alerts(
|
||||
name: str,
|
||||
target_date: Optional[str] = None,
|
||||
force_refresh: bool = False,
|
||||
):
|
||||
"""
|
||||
Return trading alerts and Telegram-ready notification payload.
|
||||
"""
|
||||
city = _normalize_city_or_404(name)
|
||||
resolved_date = _resolve_target_date(city, target_date)
|
||||
|
||||
from src.data_collection.polymarket_client import build_city_market_snapshot
|
||||
from src.analysis.market_alert_engine import build_trading_alerts
|
||||
|
||||
proxy = (
|
||||
(_config.get("polymarket", {}) or {}).get("proxy")
|
||||
or (_config.get("app", {}) or {}).get("proxy")
|
||||
)
|
||||
snapshot = build_city_market_snapshot(
|
||||
city=city,
|
||||
target_date=resolved_date,
|
||||
proxy=proxy,
|
||||
force_refresh=force_refresh,
|
||||
)
|
||||
city_weather = _analyze(city, force_refresh=force_refresh)
|
||||
map_url = os.getenv("POLYWEATHER_MAP_URL") or "https://polyweather-pro.vercel.app/"
|
||||
return build_trading_alerts(
|
||||
city_weather=city_weather,
|
||||
market_snapshot=snapshot,
|
||||
map_url=map_url,
|
||||
)
|
||||
|
||||
|
||||
@app.get("/api/history/{name}")
|
||||
async def city_history(name: str):
|
||||
"""Return historical accuracy data (DEB, mu, actuals) for a city."""
|
||||
|
||||
Reference in New Issue
Block a user