{"record":{"id":"37a35428fd351eef","repo":"OpenBB-finance/OpenBB","slug":"only-annual-frequency-is-available-for-ratios-me","errorCode":null,"errorMessage":"Only annual frequency is available for 'ratios' measure.","messagePattern":"Only annual frequency is available for 'ratios' measure\\.","errorType":"exception","errorClass":"ValueError","httpStatus":null,"severity":"error","filePath":"openbb_platform/providers/famafrench/openbb_famafrench/utils/helpers.py","lineNumber":737,"sourceCode":"        In most scenarios, there will only be 1 DataFrame and 1 metadata dictionary.\n\n    Raises\n    ------\n    ValueError\n        When an invalid combination of parameters or unsupported values are supplied.\n    \"\"\"\n    measure = measure.lower() if measure is not None else \"usd\"\n    data = get_international_portfolio_data(index, country, dividends)\n    tables = read_dat_file(data)\n    dataframes, metadata = process_international_portfolio_data(tables, dividends)\n\n    if measure and measure not in [\"usd\", \"local\", \"ratios\"]:\n        raise ValueError(\n            f\"Measure {measure} not supported. Choose from 'usd', 'local', or 'ratios'.\"\n        )\n\n    if frequency == \"monthly\" and measure == \"ratios\":\n        raise ValueError(\"Only annual frequency is available for 'ratios' measure.\")\n\n    if frequency:\n        dfs = [\n            df\n            for df, meta in zip(dataframes, metadata)\n            if meta[\"frequency\"] == frequency\n        ]\n        dfs_meta = [meta for meta in metadata if meta[\"frequency\"] == frequency]\n    else:\n        dfs = dataframes\n        dfs_meta = metadata\n\n    if measure == \"local\":\n        dfs = [df for df, meta in zip(dfs, dfs_meta) if \"Local\" in meta[\"description\"]]\n        dfs_meta = [meta for meta in dfs_meta if \"Local\" in meta[\"description\"]]\n    elif measure == \"usd\":\n        dfs = [df for df, meta in zip(dfs, dfs_meta) if \"Dollar\" in meta[\"description\"]]\n        dfs_meta = [meta for meta in dfs_meta if \"Dollar\" in meta[\"description\"]]","sourceCodeStart":719,"sourceCodeEnd":755,"githubUrl":"https://github.com/OpenBB-finance/OpenBB/blob/3e071fcc2cd9f891cac6040ae60296dba76dab46/openbb_platform/providers/famafrench/openbb_famafrench/utils/helpers.py#L719-L755","documentation":"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.","triggerScenarios":"Calling international index/country returns with measure='ratios' and frequency='monthly' (explicitly or via a defaulted parameter).","commonSituations":"Reusing a generic 'monthly' default across all famafrench calls; not noticing the ratios sheet in the zip is annual-only.","solutions":["Set frequency='annual' when measure='ratios'.","Leave frequency unset if you only care about ratios (the annual tables are the ones kept).","In dashboards, disable the monthly option whenever the ratios measure is selected."],"exampleFix":"// before\nobb.economy.famafrench.international_index_returns(country='Japan', measure='ratios', frequency='monthly')\n\n// after\nobb.economy.famafrench.international_index_returns(country='Japan', measure='ratios', frequency='annual')","handlingStrategy":"validation","validationCode":"if measure == 'ratios':\n    assert frequency in (None, 'annual'), \"ratios measure supports annual frequency only\"","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Disable the monthly option in UIs whenever the ratios measure is selected.","Keep a per-endpoint compatibility matrix of measure x frequency instead of one shared config."],"tags":["famafrench","validation","frequency","measure"],"backgroundTag":null,"analyzedSha":"3e071fcc2cd9f891cac6040ae60296dba76dab46","analyzedAt":"2026-08-14T23:40:48.960Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}