Methodology · v1.0

How the Ledger counts.

Every figure on this site is derived from primary public documents. This page documents the source, the extraction, and the math. The Ledger's standard is that any third-party analyst should be able to reproduce every number here.


01

Sources

Primary inputs are annual reports filed by state attorneys general, comptrollers, and opioid abatement councils; sub-state filings from counties and municipalities under settlement Memoranda of Agreement; and treasury balance statements where they exist as standalone reports.

02

Extraction

PDF filings are parsed using a two-pass procedure. The first pass extracts every dollar figure with its surrounding sentence. The second pass classifies each figure using a regex set keyed to filing template.

# Extraction regex (simplified)
INTEREST_PAT  = r"interest (?:earned|income|revenue)[^.$]*\$([\d,]+(?:\.\d{2})?)"
RECEIPT_PAT   = r"(?:received|disbursement)[^.$]*\$([\d,]+(?:\.\d{2})?)"
BALANCE_PAT   = r"(?:ending|year[- ]end) balance[^.$]*\$([\d,]+(?:\.\d{2})?)"

for sentence in doc.sentences:
    for label, pat in [("interest", INTEREST_PAT), ...]:
        if m := re.search(pat, sentence, re.I):
            yield label, normalize(m.group(1)), sentence
03

Interest calculation

Where a filing reports interest income as a discrete line item, the Ledger uses that figure verbatim. Where interest is bundled into total income, the Ledger backs out interest by applying the state treasury's reported pool yield to the average daily settlement balance for the period.

04

Deployment rate

Deployment rate is defined as spent / received on a cumulative basis through the most recent fiscal year reported. Encumbered-but-unspent funds are counted as unspent until the Ledger verifies they have reached a vendor.

05

Verification

Each headline figure is verified by a second analyst against a different source document or a direct request to the issuing office.

06

Corrections

The Ledger publishes corrections at the top of any affected page within 48 hours of verification. Send corrections to corrections@opioidledger.org.