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

  1. Inspect len(data) / data.to_df().shape — the X frame must have >= 3 rows.
  2. Widen the query: more date range, more entities, or fewer dropna filters so more rows survive.
  3. 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

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


AI-assisted analysis of OpenBB-finance/OpenBB@3e071fcc2c (2026-08-14). Data as JSON: /api/errors/19c51266cd9611d2. Report an issue: GitHub.