The fx_annual table

One row per currency per calendar year: what one unit of that currency was worth in US dollars, averaged over the year. With price_index it is the pair behind factors_flat.price_index_ratio, the adjustment that carries a monetary factor from the price level it was published in to the year you are reporting on.

Fields#

field type required example meaning
currency_code text yes eur The currency a monetary factor is priced in, as a lowercase ISO 4217 code. Lowercase because that is how unit_code spells a currency on a monetary factor, so the two join with no case folding.
year integer yes 2024 The calendar year this rate is the average over. One row per currency per year, because the rate belongs beside a price year, which is a year of production and not an instant.
usd_per_unit double precision yes 1.0823805 How many US dollars one unit of currency_code was worth, averaged over the year. Multiply an amount in that currency by it to reach US dollars; divide US dollars by it to come back. The size of the number is the check that cannot be read backwards: a currency worth less than the dollar reads below 1, so a yen rate sits in the thousandths and a pound rate above 1. The underlying statistic is published the other way round, as currency units per US dollar, and the value here is already inverted. usd is 1.0 in every year, being the numeraire.
anchor_economy text yes DE Whose official rate this series is, as a geography code. It is disclosure rather than a key: nothing joins on it, and a factor's own geography does not have to match it. Where several economies share one currency, one of them is the anchor, so the euro series is Germany's, and naming it is how you check that choice.
source text yes worldbank:PA.NUS.FCRF:DE inverted (euro area since 1999) Where this currency's series came from, and where a non-observation is disclosed: the official annual average rate for the anchor economy, inverted, followed by a note naming any year whose rate was held at the nearest observed one.
snapshot_version text yes worldbank-2026-07-13 Which vendored snapshot of the source series this rate came from. Deliberately not part of any factor's identity, so a re-seeded series can move a served monetary value while the slug, the source_key and the release all stay put.

Notes#

Which way the rate multiplies. usd_per_unit answers one question: how many US dollars one unit of this currency was worth. An amount in the currency times the rate is US dollars; US dollars divided by the rate is the amount back in the currency. The check that cannot be read backwards is the size of the number, not the column name: a currency worth less than the dollar reads below 1, so a yen rate sits in the thousandths and a thousand yen comes to single-digit dollars, while a pound rate reads above 1. The underlying statistic is published the other way round, as currency units per US dollar. The value stored here is already inverted, so do not invert it again.

What the pair is for. price_index says how the price level of an economy moved; this says how the money the factor is quoted in moved against the dollar. Read together they carry the local index across into the factor's own currency, and the dollar is only a pivot:

price_index_ratio = usd_price[economy][currency_year] / usd_price[economy][spend_year]
                  * fx[currency][spend_year]          / fx[currency][currency_year]

The dollar cancels. Where a factor happens to be quoted in its own economy's money the two exchange-rate legs cancel as well and the expression collapses to the plain local ratio, which is why a reconstruction that drops the currency leg still looks right on a euro-area or US row and fails on a factor priced in someone else's money. usd is 1.0 in every year, being the numeraire.

It is not a spend converter. Restating your own spend into the currency a factor is published in stays your step, at a rate you write down and state. These are annual averages of an official rate, not dealing rates: a year's mean is the companion a price year deserves, because a currency year is a year of production rather than an instant.

When the year you need is missing. Across the window the table covers, every currency carries every year: where a year had no observation the nearest observed rate is held rather than grown, since a rate is a level and has nothing to chain against, and source names every year that was held. Outside that window there is no row at all, and because the served rows join these, a monetary factor is then absent for that year rather than served unadjusted. Take the latest year the window covers and say in your report that you did. Never drop a neighbouring year's rate into the published number silently. A currency can also carry a full series here with no factor priced in it, so a row is not evidence that such a factor exists.

Joining it. On a monetary row, fx_annual.currency_code = factors_flat.unit_code and fx_annual.year at whichever year the leg needs: currency_year for the published price level, the spend year for yours. snapshot_version is deliberately outside a value's identity, so store price_index_ratio beside any number you publish: dividing by it gives back the publisher's own figure, which does not move when a series is re-seeded.