kayadibi1/h1b-labor-map
GitHub: kayadibi1/h1b-labor-map
一个引文驱动的可复现联邦数据管道,整合多个美国政府数据源,将 H-1B 雇主担保行为与劳动力需求映射比对,帮助用户识别真实担保雇主并生成个性化排名。
Stars: 0 | Forks: 0
# 美国劳动力市场 × H-1B 担保地图

一个可复现、引文驱动的数据 pipeline,将美国劳动力市场需求与雇主的 H-1B 担保行为进行映射比对。它将 DOL LCA、USCIS 批准数据、BLS / OEWS、IPEDS、IRS 和 SEC 文件转化为一个可审计的排名视图,展示哪些雇主切实地在哪些大都会区为哪些职位提供担保。每一条数值规则都可以追溯到带有验证日期的 Federal Register / CFR 引文。完整规范位于 `labor_market_h1b_map_blueprint.md` 中;本 README 介绍操作说明。
**状态:** 已在真实的多 GB 联邦发布数据上完成端到端运行(Phase 0 数据源验证时间 2026-05-27)。数据验证采用的是 `ingest_dol.py` 中一旦出错即高调报错的逐 FY(财年)列映射器(当数据源 schema 发生偏移时,它会报出确切缺失的逻辑列名并停止运行),而不是正式的 schema 验证器。
## 该 pipeline 能解答的问题
1. **切实地说,哪些雇主会担保像我这样的人?**
不是原始的 LCA 数量——LCA 申请严重夸大了实际招聘情况。我们通过 USCIS Initial Approvals(即标题中提到的“新担保”信号)对其进行缩减;对于受配额限制(cap-subject)的雇主,我们还会通过**工资级别加权的抽签概率**(FY2027 及以后规则:Level IV = 4 个抽签名额,Level I = 1 个名额)进行缩减。
2. **我应该瞄准哪些不受配额限制(cap-exempt)的雇主?**
Cap-exempt 雇主(大学、附属非营利组织、非营利研究机构、政府研究机构)完全绕过抽签。对于非 STEM-CIP 申请人来说,这是最切合实际的主要途径;该 pipeline 将其作为一等(first-class)输出予以展示。
3. **我目标职位 × 大都会区哪里确实存在担保需求?**
4. **我应该避开哪些雇主?**(外包公司、低批准率的批量申请工厂、近期触发 WARN Act 裁员的公司。)
## 快速开始
```
# 安装固定的 dependencies(使用 uv;固定于 Python 3.11)
uv sync --extra dev
# 对环境进行 sanity check
uv run python -c "import polars, duckdb, rapidfuzz; print('env ok')"
# 查看 Phase 0 分支决策(CIP 驱动;默认为非 STEM)
uv run python run.py --stage verify
# 检查 / 编辑您的 profile,然后重新验证
notepad user_profile.yaml
uv run python run.py --stage verify
# Dry run 完整的 pipeline(无下载,无 transforms)
uv run python run.py --dry-run
# 完整运行(下载数 GB 的 DOL + USCIS 文件;请预留时间)
uv run python run.py
# 重新运行下个季度,跳过未更改的 sources
uv run python run.py --incremental
# 测试
uv run pytest -q
```
## Phase 0 分支决策(关键)
该 pipeline 会读取 `user_profile.yaml` 中的 `identity.cip_code`,并将其与实时的 DHS STEM-Designated Degree Program List(缓存在 `data/raw/sevp/stem_cip_list_2024-07-23.md` 中)进行比对。该分支决定了您拥有一次抽签机会(非 STEM,12个月 OPT)还是三次机会(STEM,共 36个月 OPT),进而决定 `cap_exempt_only` 是否默认为 TRUE。
**SAIS 相关的 CIP 编码:**
| CIP | 领域 | 是否为 STEM? |
|---|---|---|
| **45.0603** | Econometrics and Quantitative Economics | 是 |
| **30.4901** | Mathematical Economics | 是 |
| **30.7001** | Data Science | 是 |
| 45.0601 | Economics, General | 否 |
| 45.0605 | International Economics | 否 |
| 45.0901 | International Relations(默认) | 否 |
| 45.0902 | National Security Policy Studies | 否 |
如果您获得的学位 CIP 不是 45.0901,请更新 `user_profile.yaml` 并重新运行 `python run.py --stage verify` 以查看新的分支。
## 架构
```
data/raw # untouched downloads, dated; sha256/ETag tracked
data/staging # cleaned, typed, SOC/NAICS/CBSA standardized parquet
data/marts # final joined fact table + 8 output views (parquet + csv)
data/manifest # phase0_findings.md, sources.json, employer review CSVs
src # ingest_*, entity_resolve, geo_normalize, join, scoring, views
tests # offline fixture-driven unit + smoke tests
config.yaml # pipeline-level rule values (dated + sourced)
user_profile.yaml # your CIP, SOC weights, metros, cap-exempt list, gates
run.py # orchestrator
Makefile # convenience targets
```
### 数据源模块
| 模块 | 数据源 | 备注 |
|---|---|---|
| `ingest_dol.py` | DOL OFLC LCA + PERM xlsx | 逐 FY 列映射器;遇到缺失的必需列时会大声报错 |
| `ingest_uscis.py` | USCIS H-1B Employer Data Hub | 区分 Initial 与 Continuing 的批准/拒绝数 |
| `ingest_bls.py` | BLS API v2 + OEWS 大都会区邮政编码 | OEWS 隐藏值保留为 NULL |
| `ingest_warn.py` | 州 WARN 门户网站(NY/MA/VA/DC + 框架) | 尽力抓取;记录失败日志 |
| `ingest_irs.py` | ProPublica Nonprofit Explorer | Cap-exempt 子类别证据 |
| `ingest_edgar.py` | SEC EDGAR company_tickers.json | 上市公司母公司 CIK |
| `ingest_ipeds.py` | DOE DAPIP 机构名单 | HIGHER_ED 高置信度标记 |
| `ingest_census.py` | OMB CBSA delineation 2023 | 地理标准化 |
### 转换 / 评分
| 模块 | 职责 |
|---|---|
| `entity_resolve.py` | 分层雇主名称解析器(标准化 → 精确匹配 → token-sort ≥ 95 → 人工审查 → 企业集团覆盖) |
| `geo_normalize.py` | 城市/州 → CBSA 编码(带有精选的 DC 大都会区快捷映射) |
| `cap_exempt.py` | 依据 8 CFR 214.2(h)(19)(iii)(C) 判定子类别 + 置信度 |
| `join.py` | 使用 DuckDB 将 LCA / USCIS / OEWS 关联至 `mart_fact.parquet` |
| `scoring.py` | 双轨制 cap-exempt vs cap-subject 真实度评分 + 个人得分 |
| `views.py` | 8 个输出视图 |
## 8 个输出视图(`data/marts/*.parquet` + `.csv`)
1. **`ranked_employers_capexempt`** — 按真实度排序的 Cap-exempt 担保雇主。
2. **`ranked_employers_capsubject`** — 按真实度排序的 Cap-subject 担保雇主(计入抽签权重因素)。
3. **`metro_heatmap`** — CBSA × SOC 的担保量和需求热度图。
4. **`role_trends`** — 2024 年规则变更前后的 SOC 趋势。
5. **`cap_exempt_targets`** — 按子类别划分的免抽签通道。
6. **`red_flags`** — 高 LCA 数量 + 低批准率 / 劳务派遣 / Level 1 批量申请工厂。
7. **`green_card_friendly_employers`** — 按 PERM 申请量排名(数据导入后)。
8. **`personal_top_targets`** — 基于个人得分加权,并根据您的门槛条件过滤。
9. **`timing_calendar`** — 每个雇主的运营外联时间窗口。
(核心排名是 `ranked_employers_*` / `personal_top_targets`;两者均遵循 `gates.min_evidence_tier`,因此小样本雇主绝不会意外排到顶部。)
## 担保真实度的计算方式
**Cap-exempt(无抽签):**
```
realism_capex = initial_approval_rate
× min(1.0, initial_approvals / n_threshold_capexempt) # default n=3
× (1 - staffing_penalty)
× (1 - layoff_penalty)
```
**Cap-subject(适用抽签,FY2027 及以后受工资加权影响):**
```
realism_capsub = initial_approval_rate
× Σ pct_level_L × lottery_rate_level_L # FY2027 weighted
× min(1.0, initial_approvals / n_threshold_capsubject) # default n=10
× (1 - staffing_penalty)
× (1 - layoff_penalty)
```
工资级别调整后的中选率(自 FY2027 起生效)位于 `config.yaml > rules.wage_level_adjusted_selection_rate_fy2027`:
| 级别 | 抽签名额 | 大致中选率 |
|---|---|---|
| I | 1 | 17% |
| II | 2 | 34% |
| III | 3 | 51% |
| IV | 4 | 68% |
(假定符合历史 Level 分布;每次季度运行时会根据真实的 DOL 数据重新计算。)
## 每季度重新运行
1. 执行 `git pull`(如果在版本控制下)以获取任何 blueprint 更新。
2. 重新运行 **Phase 0** 刷新数据源 URL + 规则数值:
uv run python run.py --stage verify
阅读 `data/manifest/phase0_findings.md` 并针对发生变化的任何内容更新 `config.yaml`
中的引文。
3. 以增量方式重新运行整个 pipeline:
uv run python run.py --incremental
4. 审查并清理待处理队列(每个只需几分钟):
- `data/manifest/employer_matches_review.csv` — 新的模糊匹配项
- `data/manifest/geo_review.csv` — 新的未匹配地区
- `data/manifest/cap_exempt_review.csv` — 需人工审查的 cap-exempt 组织
## 当 DOL 更改 schema 时
`ingest_dol.py` 会根据真实的表头构建逐 FY 的列映射器。当 DOL
增加/删除列时:
1. pipeline 会大声报错,指出缺失的逻辑列名及其
实际读到的表头。
2. 将新的物理表头模式添加到
`src/ingest_dol.py` 的 `LOGICAL_COLUMNS` 中。
3. 重新运行。
逐 FY 的映射器会提交到 `data/manifest/dol_column_mappers/`,因此
历史记录是可审计的。
## 已知局限性
- **实时需求**:此版本中无法访问 Lightcast/Revelio。需求
基于 BLS 数据建模(存在 1–6 个月的滞后)。前瞻性声明带有
根据 `accuracy_guardrails` 设定的数据滞后标签。
- **WARN 覆盖范围**:此版本中只有 NY/MA/VA/DC 有可用的抓取器。
CA/TX/WA/NJ/IL/FL/GA 门户网站严重依赖 JS,需要针对各州编写 Playwright
抓取器(TODO)。在没有数据时会回退;pipeline 不会崩溃。
- **PERM 下游使用**:`ingest_dol.py` 可以导入 PERM 文件,但
join 目前只呈现 LCA 数据。在 PERM 阶段被接入 join 之前,
PERM 排名视图将输出空文件。
- **单一雇主的子公司链条**:企业集团覆盖文件
涵盖了 FAANG / 咨询公司 / 大型银行等层级。长尾子公司
会通过 token-sort 处理,可能需要手动添加审查条目。
## 许可证 / 数据条款
代码:MIT(见 `LICENSE`)。数据:所有主要数据源均为美国政府公共领域发布数据。WARN
公告、IPEDS 和 SEC EDGAR 不带任何使用限制。ProPublica
Nonprofit Explorer 要求使用礼貌的 User-Agent(在 `.env` 中设置
`PROPUBLICA_CONTACT_EMAIL`)。BLS API 需要一个免费的注册
密钥(在 `.env` 中设置 `BLS_API_KEY`)。
标签:DuckDB, ETL管道, Polars, 代码示例, 劳动力市场, 后端开发, 安全规则引擎, 数据分析, 数据工程, 逆向工具