Contents Lesson 4 of 16

4 min read · practitioner

Two series are both called inflation — which one do you have?

The macro catalogue contains consumer_price_index and inflation_consumer_prices_annual. They describe the same phenomenon and they are not remotely the same series. Mixing them up is the most common macro data error there is, and it is entirely avoidable once you can name the three layers.

Level, rate, and rate of a rate

  • A level is a value carried in the units of the thing itself rather than a rate of change. consumer_price_index is a level: an index number whose absolute value is meaningless and whose ratio across two dates is not. So is population_total, a stock counted at a point in time, and so is gdp_current_usd, a flow accumulated over a period. Both are levels; neither is a rate.
  • A rate is already a change, expressed per period. inflation_consumer_prices_annual is a rate: the 2022 value of 8.0028 means prices rose about 8% during 2022, not that anything is at 8.
  • A rate of a rate is what you get when you difference a rate — and it is almost always a mistake to publish or read one.

The arithmetic you may apply differs at every layer. Percentage change is meaningful on a level and meaningless on a rate. Averaging is meaningful on a rate and misleading on a level.

The worked case where this goes visibly wrong

/economic-events computes change_percentage mechanically for every row, including rows where it should not exist. The June 2026 US inflation print, month-on-month:

  • actual −0.4, previous 0.5, change −0.9, change_percentage −180

The arithmetic is correct: −0.9 ÷ 0.5 = −180%. The sentence it encodes — "inflation fell 180 percent" — is nonsense. Month-on-month inflation is already a rate; the percentage change of a rate that crosses zero has no interpretation at all.

Compare the year-on-year row for the same release: actual 3.5, previous 4.2, change −0.7, change_percentage −16.667. Also arithmetically correct, also close to useless. The field you want on any rate series is change, in percentage points. change_percentage belongs to levels.

The same lesson appears in extreme form elsewhere in the same week: the EIA Cushing crude stocks row shows previous −0.052, change 0.482, change_percentage 926.923. A percentage computed against a base that is near zero and negative is a random number generator.

Real versus nominal, in the same catalogue

The second half of the distinction is whether inflation has been removed. gdp_current_usd is nominal — it is current-price dollars, so a series of it mixes real growth with price growth. gdp_growth_annual is the real growth rate, with prices stripped out. inflation_gdp_deflator_annual is the price component that separates them, and real_interest_rate is an interest rate with inflation already netted off.

Germany's gdp_growth_annual for 2023 is −0.8696 and for 2024 is −0.4959: two consecutive real contractions. Over the same two years nominal euro GDP rose, because prices rose faster than output fell. Both statements are true and they use different series. A chart that puts a nominal level next to a real rate is not comparing two things; it is comparing nothing.

The rule

Before any arithmetic, answer three questions about every series: is it a level or a rate, is it real or nominal, and what is its period. Write the answers next to the column name. Almost every macro chart that looks wrong is a violation of one of the three, and the next unit shows the same three questions doing exactly as much work on the Treasury curve.

Try it now

  1. Here are /macro-indicator/USA?indicator=consumer_price_index and /macro-indicator/USA?indicator=inflation_consumer_prices_annual, newest years first. Compute the year-on-year percentage change of the first for the two years it allows and compare it to the second. They should track closely — and the exercise proves which one is the level.
Live API response: mda2 us cpi index level
Live API response: us inflation annual
  1. Here is an /economic-events row whose type ends in "Rate". Write the sentence change_percentage encodes and decide whether you would put it in a report. Then decide, once, which of change and change_percentage your code will use for rate series.
Live API response: mda2 us cpi mom june 2026
  1. Here are gdp_current_usd and gdp_growth_annual for the United States. Label each column "level or rate" and "real or nominal" before plotting either.
Live API response: mda2 us gdp current usd
Live API response: us gdp growth annual