{"record":{"id":"1f929c5ef84b39e1","repo":"HKUDS/Vibe-Trading","slug":"vwap-market-value-requires-panel-keys-required","errorCode":null,"errorMessage":"vwap({market.value}) requires panel keys {required}; missing {missing}","messagePattern":"vwap\\((.+?)\\) requires panel keys (.+?); missing (.+?)","errorType":"validation","errorClass":"KeyError","httpStatus":null,"severity":"error","filePath":"agent/src/factors/base.py","lineNumber":354,"sourceCode":"    - ``crypto``: prefer ``panel[\"vwap\"]`` if provided, else typical price.\n\n    Any missing required column → NaN propagation; never silent zero.\n    \"\"\"\n    if isinstance(market, str):\n        market = Market(market)\n\n    if \"vwap\" in panel:\n        return panel[\"vwap\"]\n\n    if market is Market.EQUITY_CN:\n        if \"amount\" not in panel or \"volume\" not in panel:\n            raise KeyError(\"vwap(equity_cn) requires panel['amount'] and panel['volume']\")\n        return safe_div(panel[\"amount\"] * 1000.0, panel[\"volume\"] * 100.0 + 1.0)\n\n    required = (\"open\", \"high\", \"low\", \"close\")\n    missing = [k for k in required if k not in panel]\n    if missing:\n        raise KeyError(f\"vwap({market.value}) requires panel keys {required}; missing {missing}\")\n    return (panel[\"open\"] + panel[\"high\"] + panel[\"low\"] + panel[\"close\"]) / 4.0\n","sourceCodeStart":336,"sourceCodeEnd":356,"githubUrl":"https://github.com/HKUDS/Vibe-Trading/blob/80ffdda44c5c4db0dd84d70e051cca591cea67df/agent/src/factors/base.py#L336-L356","documentation":"For non-CN markets, vwap falls back to the typical price (open+high+low+close)/4. If any of those four OHLC columns is absent from the panel (and no precomputed 'vwap' exists), KeyError lists the missing keys.","triggerScenarios":"Calling vwap(panel, Market.EQUITY_US) (or any non-CN market) on a panel missing 'open', 'high', 'low', or 'close'.","commonSituations":"Panels built only from close prices, columns renamed during preprocessing (e.g. 'Open' capitalized), or a thin test fixture omitting OHLC fields.","solutions":["Add the missing OHLC columns to the panel","Or provide a precomputed panel['vwap'] column","Check column naming/casing after data ingestion"],"exampleFix":"# before\npanel = {'close': close_df}\nvwap(panel, Market.EQUITY_US)  # KeyError\n# after\npanel = {'open': o, 'high': h, 'low': l, 'close': c}\nvwap(panel, Market.EQUITY_US)","handlingStrategy":"validation","validationCode":"required = ('open', 'high', 'low', 'close')\nmissing = [k for k in required if k not in panel]\nassert not missing, f'missing OHLC: {missing}'","typeGuard":"def has_ohlc(panel: dict) -> bool:\n    return all(k in panel for k in ('open', 'high', 'low', 'close')) or 'vwap' in panel","tryCatchPattern":"try:\n    v = vwap(panel, market)\nexcept KeyError as e:\n    v = panel['close']  # degrade to close as proxy","preventionTips":["Normalize column casing at ingestion","Include a precomputed 'vwap' column when available from the vendor"],"tags":["vwap","missing-column","ohlc"],"backgroundTag":"missing-required-column","analyzedSha":"80ffdda44c5c4db0dd84d70e051cca591cea67df","analyzedAt":"2026-08-28T12:46:38.989Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}