Detecting Metadata Changes and Benchmark Revisions
Before comparing vintages, it is worth checking whether the series definition itself changed over time. MacroTrace's get_historical_metadata() method gives you a high-level summary of substantive metadata changes across the vintage history.
Load a FRED Series
For example, using the FRED CPILFESL series.
from macrotrace import MTTimeSeries
cpilfesl = MTTimeSeries(
dataset_id="CPILFESL",
source="fred",
)
print(cpilfesl)
Time Series: CPILFESL (Consumer Price Index for All Urban Consumers: All Items Less Food and Energy in U.S. City Average)
Source: FRED
Units: Index 1982-1984=100
Latest Vintage Date: 2026-03-11
Vintages: 369 available from 1996-12-12 to 2026-03-11
+------------+---------+
| Timestamp | Value |
+------------+---------+
| 2025-05-01 | 326.893 |
| 2025-06-01 | 327.658 |
| 2025-07-01 | 328.682 |
| 2025-08-01 | 329.7 |
| 2025-09-01 | 330.418 |
| 2025-10-01 | |
| 2025-11-01 | 331.043 |
| 2025-12-01 | 331.814 |
| 2026-01-01 | 332.793 |
| 2026-02-01 | 333.512 |
+------------+---------+
Inspect the Metadata History
get_historical_metadata() is intentionally higher level. It only records a new epoch when the substantive metadata changes: title, units, frequency, or seasonal adjustment. The dictionary key is the first vintage date when that substantive definition appeared, while the metadata value reflects the latest vintage within that same epoch.
import pandas as pd
history = cpilfesl.get_historical_metadata()
rows = []
for start_date, metadata in history.items():
rows.append(
{
"epoch_start": start_date.strftime("%Y-%m-%d"),
"epoch_end": metadata.realtime_end.strftime("%Y-%m-%d")
if metadata.realtime_end
else None,
"title": metadata.title,
"units": metadata.units,
"frequency": metadata.frequency,
"seasonal_adjustment": metadata.seasonal_adjustment,
}
)
print(pd.DataFrame(rows))
epoch_start epoch_end title units frequency seasonal_adjustment
1996-12-12 2019-08-13 Consumer Price Index for All Urban Consumers: All Items Less Food and Energy Index 1982-1984=100 MS Seasonally Adjusted
2019-09-12 2026-03-11 Consumer Price Index for All Urban Consumers: All Items Less Food and Energy in U.S. City Average Index 1982-1984=100 MS Seasonally Adjusted
Interpreting the Metadata History
In this case, get_historical_metadata() returns two epochs because the series title changed in September 2019. The units, frequency, and seasonal adjustment stayed the same, but the title was updated to include "in U.S. City Average."
That matters for benchmark revisions because the metadata history and the revision history answer different questions:
- A new metadata epoch tells you that the series definition changed in some substantive way.
- A stable metadata history does not prove that no benchmark revision occurred.
MacroTrace's generate_vintage_matrix() still assumes the vintages are comparable. The metadata checks help you evaluate that assumption, but they do not remove the need for researcher judgment.