OpenBB-finance/OpenBB · error · ValueError

Only annual frequency is available for 'ratios' measure.

Error message

Only annual frequency is available for 'ratios' measure.

What it means

Raised by get_international_portfolio_data when frequency='monthly' and measure='ratios'. In the international datasets the USD/local ratios table only exists at annual frequency, so the combination is rejected outright.

Source

Thrown at openbb_platform/providers/famafrench/openbb_famafrench/utils/helpers.py:737

        In most scenarios, there will only be 1 DataFrame and 1 metadata dictionary.

    Raises
    ------
    ValueError
        When an invalid combination of parameters or unsupported values are supplied.
    """
    measure = measure.lower() if measure is not None else "usd"
    data = get_international_portfolio_data(index, country, dividends)
    tables = read_dat_file(data)
    dataframes, metadata = process_international_portfolio_data(tables, dividends)

    if measure and measure not in ["usd", "local", "ratios"]:
        raise ValueError(
            f"Measure {measure} not supported. Choose from 'usd', 'local', or 'ratios'."
        )

    if frequency == "monthly" and measure == "ratios":
        raise ValueError("Only annual frequency is available for 'ratios' measure.")

    if frequency:
        dfs = [
            df
            for df, meta in zip(dataframes, metadata)
            if meta["frequency"] == frequency
        ]
        dfs_meta = [meta for meta in metadata if meta["frequency"] == frequency]
    else:
        dfs = dataframes
        dfs_meta = metadata

    if measure == "local":
        dfs = [df for df, meta in zip(dfs, dfs_meta) if "Local" in meta["description"]]
        dfs_meta = [meta for meta in dfs_meta if "Local" in meta["description"]]
    elif measure == "usd":
        dfs = [df for df, meta in zip(dfs, dfs_meta) if "Dollar" in meta["description"]]
        dfs_meta = [meta for meta in dfs_meta if "Dollar" in meta["description"]]

View on GitHub (pinned to 3e071fcc2c)

Solutions

  1. Set frequency='annual' when measure='ratios'.
  2. Leave frequency unset if you only care about ratios (the annual tables are the ones kept).
  3. In dashboards, disable the monthly option whenever the ratios measure is selected.

Example fix

// before
obb.economy.famafrench.international_index_returns(country='Japan', measure='ratios', frequency='monthly')

// after
obb.economy.famafrench.international_index_returns(country='Japan', measure='ratios', frequency='annual')
Defensive patterns

Strategy: validation

Validate before calling

if measure == 'ratios':
    assert frequency in (None, 'annual'), "ratios measure supports annual frequency only"

Prevention

When it happens

Trigger: Calling international index/country returns with measure='ratios' and frequency='monthly' (explicitly or via a defaulted parameter).

Common situations: Reusing a generic 'monthly' default across all famafrench calls; not noticing the ratios sheet in the zip is annual-only.

Related errors


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