OpenBB-finance/OpenBB · error · ValueError
This analysis requires at least 3 items in the dataset.
Error message
This analysis requires at least 3 items in the dataset.
What it means
Raised by the panel random-effects regression endpoint in openbb_econometrics when the exogenous (X) frame has fewer than 3 rows. linearmodels' RandomEffects estimator cannot identify variance components with under 3 observations, so the router pre-empts it with this explicit ValueError instead of an opaque statsmodels/linearmodels failure.
Source
Thrown at openbb_platform/extensions/econometrics/openbb_econometrics/econometrics_router.py:696
list of columns to use as exogenous variables.
Returns
-------
OBBject[dict]
OBBject with the fit model returned
"""
# pylint: disable=import-outside-toplevel
import statsmodels.api as sm
from linearmodels.panel import RandomEffects
from openbb_core.app.utils import (
basemodel_to_df,
get_target_column,
get_target_columns,
)
X = get_target_columns(basemodel_to_df(data), x_columns)
if len(X) < 3:
raise ValueError("This analysis requires at least 3 items in the dataset.")
y = get_target_column(basemodel_to_df(data), y_column)
exogenous = sm.add_constant(X)
results = RandomEffects(y, exogenous).fit()
return OBBject(results={"results": results})
@router.command(
methods=["POST"],
examples=[
APIEx(
parameters={
"y_column": "portfolio_value",
"x_columns": ["risk_free_rate"],
"data": APIEx.mock_data("panel"),
}
),
],
)View on GitHub (pinned to 3e071fcc2c)
Solutions
- Inspect len(data) / data.to_df().shape — the X frame must have >= 3 rows.
- Widen the query: more date range, more entities, or fewer dropna filters so more rows survive.
- If the sample is genuinely tiny, use a simpler model (plain OLS via obb.econometrics.ols) that works with fewer observations.
Example fix
# before
res = obb.econometrics.panel_re(data=df_2rows, y_column='y', x_columns=['x1']) # only 2 rows
# after
df = df.dropna(subset=['y', 'x1'])
assert len(df) >= 3, f'need >=3 rows, got {len(df)}'
res = obb.econometrics.panel_re(data=df, y_column='y', x_columns=['x1']) Defensive patterns
Strategy: validation
Validate before calling
df = data.to_df().dropna(subset=[y_column] + list(x_columns))
assert len(df) >= 3, f'random effects needs >= 3 rows, got {len(df)}' Type guard
def sufficient_rows(df, minimum: int = 3) -> bool:
"""True when the frame has at least `minimum` usable rows."""
return len(df) >= minimum Try / catch
try:
res = obb.econometrics.panel_re(data, y_column=y, x_columns=xs)
except ValueError as e:
if 'at least 3 items' in str(e):
raise SystemExit('expand the sample: more dates or entities') from e
raise Prevention
- Count rows after dropna before choosing a panel model.
- Prefer OLS for samples smaller than 3 observations.
- Widen provider date ranges in automated pipelines and assert minimum row counts.
When it happens
Trigger: Calling obb.econometrics.panel(..., model='random') (the RandomEffects command around line 696) with a dataset of 0-2 rows; passing an empty results list from a provider; slicing a DataFrame down to 2 observations before fitting.
Common situations: Provider responses limited by date range or symbols returning only 1-2 records, filters (dropna, date windows) accidentally shrinking the panel, or unit-testing the endpoint with toy data of 2 rows.
Related errors
- All columns must be numeric
- No data found to plot.
- Window '{window}' is greater than the input data length '{le
- Data length is less than required by parameters: {max(length
- Calculation asks for at least last {window} days of data
AI-assisted analysis of OpenBB-finance/OpenBB@3e071fcc2c (2026-08-14).
Data as JSON: /api/errors/19c51266cd9611d2.
Report an issue: GitHub.