{"record":{"id":"924d52654cc19c97","repo":"HKUDS/Vibe-Trading","slug":"equity-must-be-1-d-got-shape-array-shape","errorCode":null,"errorMessage":"equity must be 1-D, got shape {array.shape}","messagePattern":"equity must be 1-D, got shape (.+?)","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"agent/src/quantlib/risk.py","lineNumber":270,"sourceCode":"\n\ndef drawdown_series(equity: pd.Series | np.ndarray | Sequence[float]) -> pd.Series:\n    \"\"\"Compute continuous percentage drawdown from running peak as a positive loss fraction.\n\n    Args:\n        equity: Net-value / equity series, strictly positive.\n\n    Returns:\n        A pandas Series of drawdown fractions in ``[0.0, 1.0)`` where 0.0 means\n        at peak and 0.25 means 25% below the running peak.\n\n    Raises:\n        ValueError: If ``equity`` is not 1-D, has no finite observations, or contains values <= 0.\n    \"\"\"\n    if not isinstance(equity, pd.Series):\n        array = np.asarray(equity, dtype=float)\n        if array.ndim > 1:\n            raise ValueError(f\"equity must be 1-D, got shape {array.shape}\")\n        series = pd.Series(array)\n    else:\n        series = equity.copy()\n\n    series = series.astype(float)\n    series = series[np.isfinite(series.to_numpy())]\n    if series.empty:\n        raise ValueError(\"equity contains no finite observation\")\n    values = series.to_numpy()\n    if (values <= 0.0).any():\n        raise ValueError(\"equity must be strictly positive to express drawdown as a fraction\")\n\n    running_peak = np.maximum.accumulate(values)\n    dd = -(values / running_peak - 1.0)  # non-negative loss fraction\n    return pd.Series(dd, index=series.index, name=\"drawdown\")\n\n\ndef ulcer_index(equity: pd.Series | np.ndarray | Sequence[float]) -> float:","sourceCodeStart":252,"sourceCodeEnd":288,"githubUrl":"https://github.com/HKUDS/Vibe-Trading/blob/80ffdda44c5c4db0dd84d70e051cca591cea67df/agent/src/quantlib/risk.py#L252-L288","documentation":"drawdown_series requires a 1-D equity curve. A 2-D array would be ambiguous (which column is the curve?), and flattening it would concatenate unrelated paths into a nonsense equity series, so non-1-D input is rejected up front.","triggerScenarios":"drawdown_series(np.array([[100,110],[99,105]])), or passing a DataFrame (which np.asarray converts to 2-D) instead of a Series or single column.","commonSituations":"Selecting a DataFrame column with double brackets df[[\"equity\"]] (yields a DataFrame, not a Series); passing a matrix of Monte Carlo paths where one path was intended.","solutions":["Select a single column as a Series: df['equity'] not df[['equity']]","For arrays, use paths[i] to pass one path","Pass a pd.Series directly with your index intact"],"exampleFix":"// before\ndd = drawdown_series(df[[\"equity\"]])\n// after\ndd = drawdown_series(df[\"equity\"])","handlingStrategy":"type-guard","validationCode":"import numpy as np, pandas as pd\neq = df[\"equity\"] if isinstance(df, pd.DataFrame) else equity\nassert np.asarray(eq, dtype=float).ndim <= 1","typeGuard":"import numpy as np\nimport pandas as pd\n\ndef is_1d_equity(x) -> bool:\n    if isinstance(x, pd.Series):\n        return True\n    return np.asarray(x, dtype=float).ndim <= 1","tryCatchPattern":"try:\n    dd = drawdown_series(equity)\nexcept ValueError as e:\n    if \"must be 1-D\" in str(e):\n        dd = drawdown_series(np.asarray(equity).ravel())\n    else:\n        raise","preventionTips":["Use single-bracket pandas selection df['col']","Squeeze/reshape arrays before passing","Standardize on pd.Series for equity curves in your codebase"],"tags":["quantlib","risk","drawdown","shape-validation","valueerror"],"backgroundTag":"wrong-array-shape","analyzedSha":"80ffdda44c5c4db0dd84d70e051cca591cea67df","analyzedAt":"2026-08-28T12:46:38.989Z","schemaVersion":2},"datasetVersion":"2026-08-28T16:17:29.566Z"}