Open-source Python for community development finance
Twenty-one packages that turn CDFI Fund, FFIEC, FDIC and Census data into answers a lender can act on — NMTC eligibility, fair-lending distributions, peer benchmarks, loan pricing, debt waterfalls. Built by a practitioner, for the CDFIs, MDIs and CDEs that don't have an analytics function.
cdfidata
Start here
Three real questions that normally cost a week of someone's time, a consultant, or a subscription. Each is one import away. Note what every API returns alongside the answer: how it was derived, and what would make it wrong.
Geocode, resolve the tract, and return eligibility against the CDFI Fund's own file. An address that can't be resolved comes back indeterminate — never a silent “ineligible.”
nmtc-mapperfrom nmtcmapper import NMTCMapper
mapper = NMTCMapper()
result = mapper.check_address("1234 S Michigan Ave, Chicago, IL 60605")
result.nmtc_eligible # True / False / None — None is indeterminate
result.eligibility_status # verified-eligible | verified-ineligible
# | not-found | not-covered-territory
# | geocode-failed
result.distress_level # deep | severe | lic | ineligible
result.opportunity_zone_status # designated | not-confirmed | no-tract
# Or score an entire pipeline at once
df = mapper.enrich(df, address_col="address")
df["nmtc_eligible"].value_counts()
FDIC call-report metrics for a bank CDFI or MDI and the banks nearest it in asset size — with the selection basis and every caveat about the group attached to the result.
cdfi-benchmarkfrom cdfibenchmark import get_financials, build_peer_group, summary_table
institution = get_financials(cert=34352) # find CERTs with search_institutions()
peers = build_peer_group(institution, same_state=True)
peers.selection_basis # how the group was chosen, in words
peers.asset_percentile # near 50 means the group brackets you
for caveat in peers.caveats:
print("CAVEAT:", caveat) # size skew, mixed periods, dropped constraints
summary_table(institution, peers) # NIM, ROAA, efficiency, Tier 1, NPLs
Multi-year HMDA LAR pulls with provenance on every row. Aggregations that would pool incompatible census-tract vintages refuse to run rather than return a plausible wrong number.
hmda-analyzerfrom hmdaanalyzer import (
load_range, denial_rate_by_race, disparity_ratio, lending_desert_score,
)
df = load_range(2021, 2023, state="IL", county="17031", limit=10_000)
# df["activity_year"] tags each row's year; filters apply to every year
denial_rate_by_race(df)
disparity_ratio(df) # ratios vs White applicants
lending_desert_score(df) # low volume AND high denial rate — both required
The index
Grouped by the work, not by the dataset. Versions shown are what's live on PyPI today. Every package installs with pip and works from a notebook, a script, or a CLI.
Automated NMTC eligibility checking — geocode an address or tract and return Low-Income Community status, distress tier, poverty rate, tract MFI ratio and Opportunity Zone status. Enriches a whole DataFrame; bulk access to the full 85,395-tract table.
Eligibility is tri-state. An address that can't be resolved returns None, not False — treating it as ineligible would fabricate a verified answer.
First-pass feasibility screening for an NMTC deal from the command line — does the project clear the threshold questions before anyone builds a model.
Leveraged NMTC transaction calculator — sources and uses, leverage loan, QEI sizing, and the credit stream for a standard leveraged structure.
Open-source intelligence for competitive CDFI Fund NMTC allocation applications — pipeline scoring against the published criteria. 544 tests.
LIHTC transaction calculator — qualified basis, applicable fraction, 4% and 9% credit, the 15-year compliance period, recapture exposure, and investor IRR.
Pull and describe HMDA LAR records by county, state, lender LEI, or across years, with FFIEC MSA median family income and tract income percentage on every record.
Descriptive only. Borrower- and tract-income distributions, not disparity findings.
Statistical disparate-impact screening on HMDA data using the logistic-regression methodology federal examiners apply, with MSA fixed effects and an explicit minimum sample size.
A screening instrument for analysts who understand the methodology — deliberately not a one-click verdict, and not a substitute for a fair-lending review.
Search the FFIEC CRA exam database and parse Performance Evaluations — ratings history, and banks whose CRA posture makes them plausible partners.
Peer benchmarking for bank CDFIs and MDIs on FDIC call-report metrics — NIM, ROAA, ROAE, efficiency ratio, Tier 1 capital, loans-to-deposits, NPL ratio, loan-loss coverage.
FDIC-insured institutions only — no credit unions, no unregulated loan funds.
ETL pipeline for Treasury CDFI Fund public datasets — a multi-year Transaction Level Report loader covering FY2018 through FY2022, plus CLR, ILR, NMTC and Awards data.
Award analysis and compliance tracking across CDFI Program, BEA, NACA, Native American, RAPID, CMF and Bond Guarantee awards.
Bring your own data — no CDFI Fund ingestion path is implemented; the bundled data is a sample.
Portfolio tracker for impact investment, private debt and community development finance — positions, cash flows and impact metrics in one ledger.
Valuation toolkit for CDFIs and Minority Depository Institutions — tangible common equity and book-value-per-share work on institutions that trade thinly or not at all.
Portfolio stress-testing engine — Monte Carlo simulation with correlated net-operating-income, interest-rate and property-value shocks.
Loan amortization, DSCR tracking, covenant monitoring and loan sizing — the arithmetic behind a credit memo, without the spreadsheet.
Minimum viable loan rate from first principles — cost of capital, target ROAA, expected loss and administrative cost, so a concessionary rate is a decision rather than a guess.
Period-by-period mechanical debt-waterfall engine for structured finance — cash applied through the priority of payments, one period at a time.
CDFI Bond Guarantee Program eligibility screening — net asset, lending volume and portfolio quality thresholds, and whether an issuance is feasible at all.
Generate investment-committee credit memos from structured deal inputs — CDFI loans, NMTC transactions and impact investments, on one consistent template.
These two are listed here rather than quietly delisted. Both are installable, both do less than their name suggests, and both say so in their own PyPI summary before you install them. That is the standard the rest of the suite is held to as well — it's only more visible here.
Opportunity Zone tracker — Qualified Opportunity Fund tax-benefit and portfolio modeling.
OZ tract lookup is non-functional in 0.2.0. Both upstream data sources return 404, so the package raises a typed error rather than returning a fabricated result. The QOF modeling works.
SBIC investment portfolio analyzer — fund-level IRR, TVPI and DPI, and licensee modeling.
Unmaintained. Live SBA data loading is not implemented; the package returns sample data only when explicitly asked for it.
For people who don't write Python
cdfi-superpowers is a Claude plugin that wraps the audited packages as skills. Ask the question the way you'd ask a colleague; the skill calls the package and reports what it actually returned — never an estimate from general knowledge.
This is the part that matters for adoption. A loan officer at a $40M CDFI is not going to open a notebook, and shouldn't have to. The skills enforce the same scope limits the packages do — if a question falls outside what the data supports, the answer says so instead of filling the gap.
Install it from the plugin marketplace alongside nmtc-underwriting, or clone it from GitHub.
How it's built
Anyone can wrap a federal API. What makes a tool usable in an underwriting file is knowing exactly where it stops being right — so that boundary is documented, tested, and enforced in code.
Every package documents what it gets wrong and why. A vintage mismatch between tract boundaries, an unreachable branch in a threshold test — disclosed in the release notes and excluded from any claim the tool makes.
Each package is reviewed adversarially — the reviewer's job is to find the fabrication, the hardcoded sample passed off as real data, the confident answer the data can't support. Findings are triaged into named versions.
Tools that describe lending patterns do not draw disparity conclusions, and tools that run inferential tests say plainly what the test does and does not establish. The friction is intentional and legally defensive.
Where a package ships bundled data for offline use, it says so at every surface — CLI output included. No package narrates a hardcoded profile as a real result.
Built against the actual files practitioners use — the CDFI Fund eligibility workbook, FFIEC HMDA, FDIC call reports, Treasury TLR extracts — not toy fixtures.
Free to use, fork, embed in internal tooling, or cite in a filing. No seats, no vendor relationship, no data leaving your machine except to the public APIs you're already entitled to query.
Who this is for
Loan officers, portfolio managers and compliance staff who need a defensible answer today and don't have an analyst to assign it to.
Reproducible access to HMDA, CRA and CDFI Fund data with the methodology visible — every number traceable to a public source.
Screening, sizing and benchmarking that would otherwise mean a subscription or a bespoke build for every engagement.