Automated NMTC eligibility checker — geocode addresses and check Low-Income Community status using CDFI Fund and Census data
Project description
nmtc-mapper 🗺️
Automated NMTC eligibility checker for addresses and census tracts.
Pass a DataFrame of addresses and get back a boolean column for NMTC eligibility, distress level, poverty rate, AMI ratio, and more — using official CDFI Fund and Census Bureau data. No manual lookups required.
Why nmtc-mapper?
The CDFI Fund provides a manual web tool (CIMS) for checking NMTC eligibility one address at a time. nmtc-mapper automates this — pass 10,000 addresses and get results in seconds, using the same official data source.
Installation
pip install nmtc-mapper
Quickstart
from nmtcmapper import NMTCMapper
mapper = NMTCMapper()
# Single address (geocodes automatically)
result = mapper.check_address("1234 S Michigan Ave, Chicago, IL 60605")
result.summary()
print(result.nmtc_eligible) # True
print(result.distress_level) # "severe"
print(result.poverty_rate) # 0.38
# Known census tract (no geocoding needed)
result = mapper.check_tract("17031840100")
print(result.nmtc_eligible) # True
# Batch — enrich a DataFrame of addresses
import pandas as pd
df = pd.read_csv("projects.csv") # must have 'address' column
df = mapper.enrich(df, address_col="address")
print(df["nmtc_eligible"].value_counts())
print(df["distress_level"].value_counts())
# If you already have census tract IDs
df = mapper.enrich(df, tract_col="tract_id")
# Summary stats
mapper.eligible_count(df)
Eligibility Rules (2016-2020 ACS — mandatory since Sept 1, 2024)
A census tract qualifies as a Low-Income Community (LIC) if it meets ANY of:
- Poverty rate >= 20%
- Median Family Income <= 80% of metro/state AMI
- Median Family Income <= 85% of state AMI (high migration rural counties)
Distress levels:
- deep — Poverty >= 40% OR AMI <= 50% OR unemployment >= 2x national rate
- severe — Poverty >= 30% OR AMI <= 60% OR unemployment >= 1.5x national rate
- lic — NMTC eligible (meets LIC criteria)
- ineligible — Does not qualify
Data Sources
- CDFI Fund 2016-2020 ACS Low-Income Community Eligibility File https://www.cdfifund.gov/research-data
- US Census Bureau Geocoding API (free, no API key required) https://geocoding.geo.census.gov
Output Columns
After running .enrich(), your DataFrame will have:
- nmtc_eligible (bool)
- distress_level (str: deep / severe / lic / ineligible)
- poverty_rate (float)
- ami_ratio (float)
- unemployment_rate (float)
- is_non_metro (bool)
- severe_distress (bool)
- deep_distress (bool)
Running Tests
PYTHONPATH=. pytest tests/ -v
24 tests across all modules.
Who This Is For
- CDEs screening project locations for NMTC eligibility
- CDFI analysts qualifying borrower locations at scale
- Researchers analyzing geographic distribution of LIC tracts
- Anyone replacing manual CIMS lookups with automated Python
License
MIT 2026 Jaypatel1511
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nmtc_mapper-0.3.0.tar.gz.
File metadata
- Download URL: nmtc_mapper-0.3.0.tar.gz
- Upload date:
- Size: 12.6 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9b2d8428533a60359f8b3377d229ba3cc37e1fe98a6bee65c53134a5f94a166b
|
|
| MD5 |
20cc29d409545ab584f50db956e00ed5
|
|
| BLAKE2b-256 |
fcd431c4fac91b68c0ff0c657854791f1efa7cb00008111796b06d35df6df5f2
|
File details
Details for the file nmtc_mapper-0.3.0-py3-none-any.whl.
File metadata
- Download URL: nmtc_mapper-0.3.0-py3-none-any.whl
- Upload date:
- Size: 16.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.9.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cec09dcde22c7ccb632785a40eb644ef5b0ce0754342f90a872467ebfb0eb7c2
|
|
| MD5 |
348dcc377dd8be2ab8845d073d6be50e
|
|
| BLAKE2b-256 |
11ddbc9d572ce4ea94bc844cc44f4e14e456774dcb566d6267ee4ec7e1c43642
|