How the pipeline works
This dataset is built by the Anu framework — a staged, documented data-construction pipeline. Every script and file carries a stage prefix so the code reads as an ordered method, not a pile of scripts. Here is what the prefixes mean.
-
S
Setup
Register each upstream data source — the named publisher, series id, vintage, and retrieval method — and prepare the working environment. Every table begins from a documented source of record (here, the U.S. Bureau of Economic Analysis Annual I-O Accounts).
-
L
Loading
Fetch and read the raw source data (BEA API pulls, archived spreadsheets) and check that the fetched units and dimensions match what the source promises before anything downstream runs.
-
P
Processing
Construction and transformation — and processing only. Assemble the Use and Supply tables, then derive the technical-coefficient matrix A, its square form, and the Leontief inverse L = (I − A)⁻¹, with a dimensional-analysis check whenever units differ.
-
V
Validation
Check each constructed matrix and series against the published BEA benchmarks — row/column totals, balance identities, unit and scale audits. Tables only pass when they reproduce the published values.
-
M
Manual adjustment
Apply and document any hand adjustment a source genuinely requires (for example a BEA redefinition or a one-off vintage fix). Each adjustment is recorded so the change is auditable, never silent.
-
A
Analysis
Compute the analytic quantities built on the matrices — output multipliers, backward/forward linkage indices, and the other I-O measures the studies and charts report.
-
O
Output
Write the publishable artifacts: the per-table CSV / Parquet files, the bulk archives, the catalog, the figures, and the documentation that ships with the data.
Each script filename combines a phase prefix with a number that
identifies the step (e.g. P02_build_coefficients.py is a
processing step). The numbers are ids, not an ordering — the
letter tells you which pipeline phase the script belongs to, and
P always means processing. (A script-phase prefix is a
different thing from a data series's own id; the letter on a script says
nothing about how a series is classified, and vice versa.) The full
source — loaders, processors and validators — lives on GitHub, and every
chart and table on this site is produced by that same code.
Reproduce a figure
You do not need the whole pipeline to check our numbers. An economy's
output multiplier for a sector is simply the column sum of
the Leontief inverse L = (I − A)⁻¹: the total output, across all
sectors, required to deliver one unit of that sector's final demand. The
transform below downloads the published L for 2024
(CSV), computes every sector's output
multiplier, and ranks them — the same computation behind the
Multipliers study. It is shown
in both R and Python; switch with the
toggle. Point L_url at any year, and change the column you sort
on to explore.
# Output multipliers from the published Leontief inverse L = (I - A)^-1.
# The output multiplier of sector j is the column sum of L: total output
# (across all sectors) needed to deliver one unit of j's final demand.
#
# DATA: point L_url at any year's Leontief inverse (the /api/table CSV).
# CHANGE: L_url (the year) and `n` (how many top sectors to print).
L_url <- "https://inputoutput.heterodata.org/api/table/2024/L?fmt=csv"
n <- 10
# read the 71 x 71 inverse; first column is the sector index -> row names
L <- read.csv(L_url, check.names = FALSE, row.names = 1)
L <- as.matrix(L)
# output multiplier = column sum of L (one value per sector)
mult <- colSums(L)
out <- data.frame(
sector = names(mult),
multiplier = as.numeric(mult),
row.names = NULL,
stringsAsFactors = FALSE
)
out <- out[order(-out$multiplier), ]
out$rank <- seq_len(nrow(out))
cat(sprintf("economy mean output multiplier: %.3f\n", mean(out$multiplier)))
print(head(out[, c("rank", "sector", "multiplier")], n), row.names = FALSE)
# write.csv(out, "multipliers_2024.csv", row.names = FALSE)
# Output multipliers from the published Leontief inverse L = (I - A)^-1.
# The output multiplier of sector j is the column sum of L: total output
# (across all sectors) needed to deliver one unit of j's final demand.
#
# DATA: point L_url at any year's Leontief inverse (the /api/table CSV).
# CHANGE: L_url (the year) and `n` (how many top sectors to print).
import pandas as pd
L_url = "https://inputoutput.heterodata.org/api/table/2024/L?fmt=csv"
n = 10
# read the 71 x 71 inverse; first column is the sector index -> row index
L = pd.read_csv(L_url, index_col=0)
# output multiplier = column sum of L (one value per sector)
mult = L.sum(axis=0).rename("multiplier")
mult.index.name = "sector"
out = mult.reset_index().sort_values("multiplier", ascending=False).reset_index(drop=True)
out["rank"] = out.index + 1
print(f"economy mean output multiplier: {out['multiplier'].mean():.3f}")
print(out.loc[: n - 1, ["rank", "sector", "multiplier"]].to_string(index=False))
# out.to_csv("multipliers_2024.csv", index=False)
Both versions read the same published CSV and produce the same ranking — the
studies ship full runnable bundles (R + Python +
notebook + data) at /api/study/<slug>/bundle.zip.
Data provenance
- Source
- U.S. Bureau of Economic Analysis (BEA) Annual Input-Output Accounts, Summary level, retrieved via the BEA API. Public domain (a work of the U.S. federal government).
- Attribution
- Matrices A, A_square and the Leontief inverse L = (I − A)⁻¹, plus the derived multiplier and linkage series, are computed by Leontief (an Arcanum Research project) from the BEA Use and Supply tables using standard input-output methodology. See Methodology.
- Units & coverage
- Dimensionless technical coefficients and multipliers (the underlying BEA accounts are in current-dollar producer values). 71 sectors (BEA Summary), 1997–2024 (28 annual vintages).
- Downloads
- Every matrix and series is downloadable as CSV, XLSX and Parquet (no JSON). Bulk: all.zip.
- Refresh cadence
- Annual, on BEA release. The BEA publishes new annual I-O accounts roughly once a year (typically autumn); Leontief is refreshed by re-running the Anu data pipeline against the BEA API when a new vintage appears. Method: manual pipeline run.
Last updated — 2026-08-03 (BEA API retrieval date of record for every table on this site). Reconstructed for research and education; not a substitute for the canonical BEA source.