复制安装命令
用 Codex 或 Claude 安装复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它先审查 Skill 页面再帮你安装。
复制前请先查看来源、License 和安全提示。
Security audit: baseline 52/52 CLEAN
用 Codex 或 Claude 安装复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它先审查 Skill 页面再帮你安装。
复制前请先查看来源、License 和安全提示。
来源文件:README.md
📌 文档结构(2026-07-22 起): 本文件是中文默认入口 —— banner + badges + 信任面 + 9 阶段流水线速览 + 76 行合集总表。 每个合集的完整描述、按用途分组、精确数字、验证方法在
docs/CONTENT_ZH.md(扩展正文,总表行内的→直接跳转到对应锚点)。English version:
README-en.md· 中文扩展正文:docs/CONTENT_ZH.md·README-zh-CN.md已弃用(重定向占位)
🌐 语言: English | 简体中文(默认) | 繁體中文 | 日本語 | 한국어
|
|
Stanford REAP × CoPaper.AI · 实证研究 AI 工具的学术工业级产品
由斯坦福实证研究方法论团队打造,覆盖从数据清洗到顶刊投稿的完整工作流
🚀 New here? Open the Skill Search → to filter all 1,096 skills by method, stage, language, and license. The 5-minute tour (
make quickstart) prints the same picture in your terminal.🇨🇳 中文用户从本文件开始(流水线速览 + 76 行总表),每个合集的完整描述见
docs/CONTENT_ZH.md。📖 English readers: seeREADME-en.md.
| Rigor lane | Count | Where |
|---|---|---|
| Numeric benchmark tasks — gold values recomputed from real data each run | 17 | benchmark/ |
| Behavioral eval scenarios / rubric items | 37 / 183 | eval-harness/ |
Full trust overview:
docs/TRUST.md·docs/RIGOR_COVERAGE.md
中文内容分两级维护,各司其职:
docs/CONTENT_ZH.md(扩展正文):每个合集的完整描述(#skill-NN 锚点)、按用途分组、精确数字、2 分钟验证、三层信任、旗舰流水线详解、贡献与引用。总表行内的 → 直接跳到对应锚点。README-en.md · README-zh-TW.md · README-ja.md · README-ko.md[!NOTE] 维护规则: 改合集总表 → 本文件与 CONTENT_ZH.md 的锚点表两处同步;改合集详情 / 分组 / 数字 → 只改
docs/CONTENT_ZH.md。统计数字(合集数 / skill 数)以catalog/skills.json为准,由make validate的 readme-stats 检查器守护。贡献者(Contributors): 提交前请在本地跑通完整门禁
make check(catalog 校验 + 链接 + 单元测试 + eval-harness + benchmark)。详见CONTRIBUTING.md。旧版归档:
README-zh-CN.md已弃用,仅作向后兼容的重定向占位。
AERS 不只是 76 个散装 skill —— 它能陪你走完一篇论文。 从模糊 idea → 选题精炼 → 文献综述 → 数据获取 → 识别策略 → 估计建模 → 稳健性审计 → 出版级表格 / 图形 → 写作与同行评审 → 降 AIGC → 投稿。端到端、全自动、每一步都可被人介入(中间任何一步你都可以接过去手工改方法、补变量、加稳健性,再让流水线自动接上跑)。
Paper-WorkFlow 是 AERS 的"指挥棒",它把上面 9 个阶段的 skill 串成 一条按键即运行的端到端流水线。
你在 IDE 入口给它一句自然语言:
"开一个新论文项目:空气污染与中国劳动力市场,CS 设计 + 省级面板"
它会自动按顺序调:
sp.csdid(...) 给出 CS-DID 估计草案 + 写出估计方程与识别假设sp.feols(...) + sp.honest_did(...)任何阶段你都可以手动介入 —— 上一阶段的产物全部落盘(产物-幂等 pipeline),你接过去改方法、补控制、加稳健性,再让流水线自动接下去跑。这就是"全自动 + 可介入"。
| ⭐ Skill | 在流水线里的角色 |
|---|---|
| 00 StatsPAI 🔥 | 因果引擎:900+ 函数,sp.causal(...) 一行跑闭环(DID / RD / IV / SCM / DML / matching) |
| 00.1 Full Empirical · Python 📘 | 显式 Python 栈(pandas / statsmodels / linearmodels / pyfixest) |
| 00.2 Full Empirical · Stata 📊 | 显式 Stata 栈(reghdfe / ivreg2 / csdid / sdid / rdrobust) |
| 00.3 Full Empirical · R 📗 | 显式 R 栈(tidyverse / fixest / did / HonestDiD)+ Quarto 渲染 |
| 48 de-AIGC-skills 🇨🇳🇬🇧 | 中英双语学术降 AIGC(Turnitin AI / GPTZero / 知网 / 万方) |
| 50 AER-skills 📕 | Top-5 经济学投稿套件:识别 → 稳健性 → R&R |
| 69 Paper-WorkFlow 🧭 | 元编排器,把上面 9 个阶段串成一键流水线 |
为什么挑这 7 个?因为它们的行为都被基准钉死了 —— 不是营销口径,是对着已知答案反复跑过验证过的(17 项数值 benchmark + 37 项行为评测 ↗)。
↴ 直跳到下方 76 行总表(每个合集带 #skill-NN 锚点)。如果你更关心"这些 skill 怎么用"而不是"有哪些 skill",看 📘 中文唯一权威正文 里的「按用途分组」与「旗舰流水线」两节。
00 → 72,编号连续无空缺)打开仓库 → 看见整座库。 全部 76 个合集 · 1,096 个 skill,每一个都已 vendor 进本仓库,由
catalog/skills.json跟踪。⭐ = Stanford REAP × CoPaper.AI 团队自研的 skill;其余为精选、经安全审计的社区作品。主题图例 — 🚀 全流程与编排器 · 🎯 因果推断与计量经济学 · 📚 文献与研究设计 · ✍️ 写作 / 编辑 / 去 AIGC · 📑 引用 / 复现 / 同行评审 · 🛠️ 数据 / 工具 / 基础设施
点击【→】 跳转到
docs/CONTENT_ZH.md中该合集的完整描述;点击合集名 直接打开其目录。
| # | 合集 | 一句话 | 详情 |
|---|---|---|---|
| ⭐ 00 | StatsPAI 🔥 | 因果引擎 · Agent-native Python DSL:sp.causal(...) 一行跑闭环(DID/RD/IV/SCM/DML,900+ 函数) | → |
| ⭐ 00.1 | Full Empirical · Python 📘 | 显式栈:pandas · statsmodels · linearmodels · pyfixest | → |
| ⭐ 00.2 | Full Empirical · Stata 📊 | reghdfe · ivreg2 · csdid · sdid · rdrobust 复现包 | → |
| ⭐ 00.3 | Full Empirical · R 📗 | tidyverse · fixest · did · HonestDiD + Quarto 渲染 | → |
| 01 | academic-paper-skills | 大纲 → 手稿写作 + 7 维审稿人模拟 | → |
| 02 | research-skills | 医学影像综述、提案、论文转幻灯片 | → |
| 03 | scientific-skills | 假设生成 + 28 个科学数据库 | → |
| 04 | scientific-writer | 引用管理 + 科学写作 | → |
| 05 | research-superpower | 系统化检索、筛选与引文溯源 | → |
| 06 | stats-paper-writing | 端到端 LaTeX 统计论文写作 | → |
| 07 | AI-Research-SKILLs | 发表级 ML 图表、LaTeX、引文核验 | → |
| 08 | latex-document-skill | 创建 / 编译任意 LaTeX 文档为 PDF | → |
| 09 | awesome-econ-ai | Python 面板数据分析(linearmodels) | → |
| 10 | causal-inference-mixtape | DID / IV / RDD / SCM 模板(Cunningham) | → |
| 11 | compound-science | 面向定量社会科学的贝叶斯估计 | → |
| 12 | claude-code-my-workflow | 提交 → PR → 合并的研究工作流(Emory) | → |
| 13 | MixtapeTools | Cunningham 的因果推断工具集与讲义 | → |
| 14 | research-starter | R 中的 IV / DiD / RDD,含完整诊断 | → |
| 15 | social-science-research | R 或 Python 端到端数据分析 | → |
| 16 | clo-author | 多代理数据分析(R / Stata / Python) | → |
| 17 | DAAF | 安全意识代理框架(32 条 deny rule) | → |
| 18 | stata-accounting | 来自 126 篇 JAR 论文的实测 Stata 范式 | → |
| 19 | vera-economic-intelligence | 经济情报 / 政策研究情报工作流 | → |
| 20 | python-econ-skill | DSGE / HANK 与定量经济计算 | → |
| 21 | AI-research-feedback | 用 AI 同行评审生成结构化反馈 | → |
| 22 | christopherkenny-skills | 面向 Quarto(.qmd)的 APSA 风格检查器 | → |
| 23 | baygent | 带护栏的 PyMC / Arviz 贝叶斯工作流 | → |
| 24 | academic-research-skills | 5 审稿人多视角论文评审 | → |
| 25 | Diverga | 研究问题精炼器(抗模式坍缩) | → |
| 26 | scholar | 统计算法设计与文档 | → |
| 27 | my_claude_skills | 经济学摘要写作指南 | → |
| 28 | paper-replicate-agent | 论文复现代理演示 | → |
| 29 | project20XXy | 可复现手稿 + notebook 项目 | → |
| 30 | zirui-song-claude-skills | Zirui Song 的研究辅助 Claude 技能集 | → |
| 31 | claude-code-skills | Python 面板数据分析 | → |
| 32 | stata-skill | 高性能 Stata C/C++ 插件 | → |
| 33 | claude-scholar | 研究全生命周期:选题 → 综述 → 实验 → 审稿回复 | → |
| 34 | research-companion | 头脑风暴、评估并决策研究方向 | → |
| 35 | academic-writing-skills | 面向投稿场所的工业 AI 文献研究 | → |
| 36 | literature-review-skill | 完整文献综述工作流(中文) | → |
| 37 | IlanStrauss-ai-skills | Ilan Strauss 经济学研究 AI 工作流 | → |
| 38 | academic-proofreader | 学术校对 | → |
| 39 | marginaleffects | 预测、斜率与比较(R / Python) | → |
| 40 | pyfixest | Python 中的快速固定效应估计 | → |
| 41 | sewage-econometrics-check | 10 项复现包审计 | → |
| 42 | ARIS | 自主「research-in-sleep」代理,端到端 | → |
| 43 | research-plugins | 478 个研究插件:数据可视化、领域、基础设施 | → |
| 44 | humanizer_academic | 为医学/学术手稿去 AI 味(23 类模式) | → |
| 45 | deslop | 去除 AI 写作痕迹(5 维评分) | → |
| 46 | stop-slop | 三层 AI 痕迹检测与改写 | → |
| 47 | avoid-ai-writing | 审计 → 改写 → 二次审计 AI 味(留痕) | → |
| ⭐ 48 | de-AIGC-skills 🇨🇳🇬🇧 | 中英双语学术降 AIGC(Turnitin AI / GPTZero / 知网 / 万方) | → |
| 49 | humanize-chinese | 检测并人性化 AI 生成的中文文本 | → |
| ⭐ 50 | AER-skills 📕 | Top-5 经济学投稿套件:识别 → 稳健性 → R&R | → |
| 51 | CausalPy | 贝叶斯准实验(PyMC Labs) | → |
| 52 | slr-prisma | 系统文献综述,PRISMA 2020 | → |
| 53 | thematic-analysis | Braun & Clarke 六阶段定性主题分析 | → |
| 54 | open-science-skills | 引用一致性、DOI 与论据支撑审计 | → |
| 55 | r-skills | R 中用 brms 做贝叶斯推断 | → |
| 56 | econ-writing-skill | 综合 50+ 顶级指南的经济学写作 | → |
| 57 | edgartools | 查询与分析 SEC 文件 | → |
| 58 | econstack | 政策简报(UK GES / AU Treasury) | → |
| 59 | openalex-skill | 通过 OpenAlex 查询 2.4 亿+ 学术作品 | → |
| 60 | superpapers | 综合性实证研究支持套件 | → |
| 61 | research-methods | 与预注册匹配的验证性检验 | → |
| 62 | citation-checker | 对照 CrossRef / S2 / OpenAlex 核验引用 | → |
| 63 | scientific-agent-skills | DoWhy 识别–估计–反驳框架 | → |
| 64 | mcp-stata | 20 个 Stata 因果推断与复现 skill | → |
| 65 | game-theory-paper-writer | 生成并压力测试博弈论论文 | → |
| 66 | empirical-research-skills | 面向大型面板的 R 性能优化 | → |
| 67 | econfin-workflow-toolkit | 中国公司金融实证工作流,从提案到论文 | → |
| 68 | research-productivity-skills | 论文检索、SSRN、DOI 查询、下载 | → |
| ⭐ 69 | Paper-WorkFlow 🧭 | 元编排器,串起整个社会科学论文流水线 | → |
| 70 | ssci-polish ✍️ | SSCI / SCI 英文论文语言润色(语法、可读性、学术语气) | → |
| ⭐ 71 | lit-review-agent-tools 🔍 | 文献综述工具选型 + 一键安装运行(MinerU / PaperQA2 / ASReview / STORM / MCP 服务器) | → |
| ⭐ 72 | Kaggle Research 🧪 | 通过官方 CLI 安全检索 Kaggle 资源、限界下载公开数据并保留审计证据 | → |
想看更详细的描述(主题分类、字段、统计)? 见
docs/CONTENT_ZH.md中标注#skill-NN锚点的同一张表 —— 它是每个合集的完整描述所在的扩展正文。
自 2026-04 首次发布以来的主干里程碑(完整提交记录见 Commits 与 CHANGELOG.md):
---
config:
gitGraph:
rotateCommitLabel: false
---
gitGraph TB:
commit id: "2026-04 首次发布"
branch community
commit id: "2026-05 首个社区 PR"
checkout main
merge community
commit id: "2026-05 更名 AERS"
commit id: "2026-06 插件市场"
commit id: "2026-06 全库路由器"
commit id: "2026-07 首个 tag" tag: "v2026.07"
branch kaggle
commit id: "2026-07 Kaggle 集成"
checkout main
merge kaggle
commit id: "2026-08 de-AIGC 双语"
Star 增长曲线(非提交数)· 由 scripts/build-star-history.py 从 GitHub API 生成并提交入库
如果 AERS 对你的工作有帮助,请引用它(CITATION.cff)并点个 Star,让更多研究者看到。
AI 是放大器,不是替代品。它替你做最耗时的"搬砖",你保留最核心的"判断"。
|
|
Stanford REAP × CoPaper.AI · 实证研究 AI 工具的学术工业级产品
![]() 扫码访问 copaper.ai |
![]() 关注公众号「CoPaper.AI」 |
内置 20 个方法论 skill · 20 分钟完成实证论文 · 自研 StatsPAI(900+ 函数 / MIT 开源)
name: election-data-source-countypres
description: >-
County Presidential Returns 2000-2024 (MIT MEDSL). Vote shares, party trends, turnout by county_fips (joins census/education data). Requires HARVARD_DATAVERSE_API_KEY. Critical: mode='TOTAL' drops ~1K counties post-2020 — use 3-pattern reconstruction
metadata:
audience: any-agent
domain: data-source
skill-authored: "2026-02-23"
skill-last-updated: "2026-02-24"County Presidential Election Returns 2000-2024 from MIT Election Data and Science Lab (MEDSL). Use when analyzing county-level presidential vote shares, party trends, turnout, or geographic voting patterns. Key join column county_fips enables linking to census, education (CCD/SAIPE), and demographic datasets. Requires Harvard Dataverse API key (HARVARD_DATAVERSE_API_KEY env var). Categorical variables use uppercase strings, not Portal integer codes. Critical caveat: naive mode='TOTAL' filtering silently drops ~1,000 counties in 2020+ data — use 3-pattern reconstruction.
The authoritative source for county-level U.S. presidential election returns spanning 2000-2024. Provides candidate-level vote counts across all 50 states and DC, enabling vote share analysis, partisan trend mapping, and cross-domain geographic research via FIPS code joins.
CRITICAL: Value Encoding
This dataset uses uppercase string codes for categorical variables (party, mode, candidate, state) rather than integer codes. Empty strings (
"") appear as undocumented values inparty(501 rows, 2024) andmode(2,795 rows, 2024).
Context party mode candidate Standard values DEMOCRAT,REPUBLICANTOTALBARACK OBAMAAggregate/meta values OTHER,"""",ELECTION DAYOTHER,UNDERVOTESSee
./references/variable-definitions.mdfor complete encoding tables.
API Key Required: This data source requires a Harvard Dataverse API key to fetch data. Unlike education data sources (which use the Urban Institute's free, unauthenticated API), election data is hosted on Harvard Dataverse and requires authentication.
Setup instructions:
- Create a free Harvard Dataverse account at https://dataverse.harvard.edu/
- Log in, navigate to your account name (top-right) → API Token
- Click "Create Token" and copy it
- Set the environment variable before launching Claude Code:
For Docker users: run this inside the container afterexport HARVARD_DATAVERSE_API_KEY="your_token_here"docker compose exec daaf-docker bashbut beforeclaude. To make it persistent across sessions, add it to~/.bashrc.If the key is missing, any fetch script will fail with a
KeyError: 'HARVARD_DATAVERSE_API_KEY'. The orchestrator should check for this variable's existence before dispatching Stage 5 fetch tasks that use this data source.
county_fips (5-digit FIPS code, stored as integer)| File | Purpose | When to Read |
|---|---|---|
variable-definitions.md | Complete column specs, party/mode/candidate value tables | Interpreting specific columns or coded values |
coded-values.md | All categorical value mappings with frequencies | Filtering or recoding party, mode, candidate |
columns.md | Detailed per-column profiling (types, nulls, ranges) | Understanding column characteristics |
quality-notes.md | Known issues, anomalies, duplicates, null patterns | Assessing data reliability |
mode-reconstruction.md | 3-pattern TOTAL mode reconstruction for 2020+ data | Cleaning any 2020+ analysis (CRITICAL) |
interpretations.md | Preliminary semantic interpretations (flagged for review) | Understanding column meanings |
Analyzing presidential election data?
├─ County-level vote shares → Use 3-pattern mode reconstruction (./references/mode-reconstruction.md)
│ └─ Longitudinal (cross-year) → MUST reconstruct TOTAL for 2020+ (naive filter drops ~1,000 counties)
│ └─ Single year (pre-2020) → Safe to filter mode='TOTAL'
│ └─ Single year (2020/2024) → Reconstruct unless analyzing a known TOTAL-only state
├─ Party trends → Group by year + party, use party column (not candidate name)
│ └─ Third parties → See ./references/coded-values.md (GREEN/LIBERTARIAN vary by year)
├─ Turnout analysis → Use totalvotes column (dedup per county-year before summing!)
├─ Joining with other data → Use county_fips as join key (zero-pad to 5 chars first!)
│ └─ Census/ACS data → Join on county_fips (standard 5-digit string)
│ └─ Education data (CCD/SAIPE) → Join on county_fips
│ └─ Null FIPS? → See ./references/quality-notes.md (CT, ME, RI)
└─ Voting method analysis → 2020 and 2024 only, see mode breakdown
Unexpected values?
├─ county_fips is null → CT/ME/RI in pre-2020 years (52 rows)
├─ county_fips > 72999 → Kansas City MO (FIPS 2938000, non-standard)
├─ county_fips join failures → Zero-pad to 5 chars! (AR codes = 4 digits as int)
├─ AR FIPS 5135 has two counties → Source data error: St. Francis under Sharp County
│ └─ See ./references/quality-notes.md #arkansas-fips-contamination (BLOCKER)
├─ CT counties missing from shapefile → 2022+ TIGER uses planning regions, not counties
│ └─ See ./references/quality-notes.md #connecticut-fips-geography-mismatch
├─ ~1,000 counties missing after mode filter → Use 3-pattern reconstruction, not naive filter
│ └─ See ./references/mode-reconstruction.md
├─ candidate is not a person → UNDERVOTES/OVERVOTES/SPOILED/TOTAL VOTES CAST
│ └─ Filter these OUT for candidate-level analysis
├─ party is empty string → 501 rows in 2024, undocumented
├─ mode is empty string → 2,795 rows in 2024 (may be totals OR breakdowns per state)
├─ candidatevotes is null → 37 rows (NM 2024, mode breakdown)
├─ sum(candidatevotes) > totalvotes → 49 county-years (minor rounding)
├─ Duplicate rows → 83 exact duplicates exist
└─ Alaska 2004 → District-level data, not county; FIPS = 2001-2099
└─ See ./references/quality-notes.md #alaska-2004
| Year | DEMOCRAT | REPUBLICAN | LIBERTARIAN | GREEN | OTHER | "" |
|---|---|---|---|---|---|---|
| 2000 | Y | Y | - | Y | Y | - |
| 2004-2016 | Y | Y | - | - | Y | - |
| 2020 | Y | Y | Y | Y | Y | - |
| 2024 | Y | Y | Y | - | Y | Y |
| Year | Modes Available |
|---|---|
| 2000-2016 | TOTAL only |
| 2020 | TOTAL + 15 breakdown modes (11 states) |
| 2024 | TOTAL + 9 breakdown modes + "" (varies by state) |
For complete mode values see ./references/coded-values.md.
| ID | Format | Level | Example | Notes |
|---|---|---|---|---|
county_fips | Int64 (5-digit) | County | 6037 (LA County, CA) | 52 nulls (CT/ME/RI); join key for census/education data |
state_po | String (2-char) | State | CA | USPS abbreviation; 1:1 with state |
state | String | State | CALIFORNIA | Full uppercase name |
WARNING: FIPS Zero-Padding Required for Joins
county_fipsis stored as Int64. When converting to string for joins with Census, SAIPE, CCD, or other datasets, zero-pad to 5 characters or Arkansas and other small-FIPS states will produce 4-digit codes that fail to match.df = df.with_columns(pl.col("county_fips").cast(pl.Utf8).str.zfill(5).alias("county_fips_str"))
| Code | Column(s) | Meaning | Frequency |
|---|---|---|---|
null | county_fips | FIPS not assigned | 52 rows (CT, ME, RI pre-2020) |
null | candidatevotes | Vote count unavailable | 37 rows (NM 2024 mode breakdowns) |
0 | totalvotes | No votes recorded | 50 rows |
0 | candidatevotes | Zero votes for candidate | 3,908 rows (4.15%) |
"" | party | Party not specified | 501 rows (2024 only) |
"" | mode | Mode not specified | 2,795 rows (2024 only) |
| Value | Rows | Meaning |
|---|---|---|
OTHER | 27,548 | Aggregate of minor candidates |
TOTAL VOTES CAST | 427 | County total (redundant with totalvotes) |
UNDERVOTES | 402 | Ballots with no presidential selection |
OVERVOTES | 380 | Ballots with multiple presidential selections |
SPOILED | 14 | Invalidated ballots |
Filter these out for candidate-level vote share analysis.
Best Practice: Party-Based Identification
Always use
partycolumn for identifying party affiliation, nevercandidatename. Candidate names are inconsistent across years (e.g., "DONALD TRUMP" in 2016 vs "DONALD J TRUMP" in 2020/2024). Thepartycolumn (DEMOCRAT,REPUBLICAN) is stable across all years.# CORRECT — stable across years dem = df.filter(pl.col("party") == "DEMOCRAT") # WRONG — misses 2016 or 2020/2024 depending on which name you use trump = df.filter(pl.col("candidate") == "DONALD TRUMP")
| Topic | Type | Path |
|---|---|---|
| County presidential returns | Single file | Harvard Dataverse DOI: 10.7910/DVN/VOQCHQ |
| Codebook | Single file | Bundled: County Presidential Returns 2000-2024.md |
| Sources per state | Single file | Bundled: sources-president.tab |
| Dataset | Codebook Path |
|---|---|
| County presidential returns 2000-2024 | County Presidential Returns 2000-2024.md (bundled in Dataverse) |
Codebook is a Markdown file bundled in the Harvard Dataverse deposit. For human reference. The QA methodology paper is at: https://www.nature.com/articles/s41597-022-01745-0
Truth Hierarchy: When interpreting variable values, apply this priority:
- Actual data file (what you observe in the TSV) -- this IS the truth
- Live codebook (Markdown file in Dataverse) -- authoritative documentation, may lag
- This skill documentation -- convenient summary, may drift from codebook
If this documentation contradicts the codebook, trust the codebook. If the codebook contradicts observed data, trust the data and investigate.
# Fetch from Harvard Dataverse API
import os, requests, polars as pl, io
api_key = os.environ["HARVARD_DATAVERSE_API_KEY"]
# Get file ID from dataset metadata first, then download
# File: countypres_2000-2024.tab (TSV format)
file_url = "https://dataverse.harvard.edu/api/access/datafile/{file_id}"
r = requests.get(file_url, params={"key": api_key, "format": "original"})
df = pl.read_csv(io.BytesIO(r.content), separator='\t')
# Filter to California, 2020, TOTAL mode only
ca_2020 = df.filter(
(pl.col("state_po") == "CA") &
(pl.col("year") == 2020) &
(pl.col("mode") == "TOTAL")
)
# Common filter patterns for county presidential data
# 1. Cross-year analysis: WARNING — naive filter drops ~1,000 counties in 2020+!
# Use 3-pattern mode reconstruction instead. See ./references/mode-reconstruction.md
# The single-line filter below is ONLY safe for single-year analysis on a state
# known to have TOTAL rows (e.g., 2000-2016 data, or a confirmed TOTAL-only state).
longitudinal = df.filter(pl.col("mode") == "TOTAL") # UNSAFE for 2020+ multi-state!
# 2. Remove non-candidate rows (UNDERVOTES, OVERVOTES, etc.)
candidates_only = df.filter(
~pl.col("candidate").is_in(["TOTAL VOTES CAST", "UNDERVOTES", "OVERVOTES", "SPOILED"])
)
# 3. Major party analysis — RECOMMENDED: use party column, not candidate name
# Candidate names change across years (e.g., "DONALD TRUMP" vs "DONALD J TRUMP")
two_party = df.filter(pl.col("party").is_in(["DEMOCRAT", "REPUBLICAN"]))
# 4. Exclude Alaska 2004 anomaly
clean = df.filter(~((pl.col("state_po") == "AK") & (pl.col("year") == 2004)))
# 5. Exclude rows with null county_fips (for join operations)
joinable = df.filter(pl.col("county_fips").is_not_null())
| Pitfall | Issue | Solution |
|---|---|---|
| Cross-year mode mismatch | 2000-2016 has only TOTAL; 2020/2024 have breakdowns. Mixing modes inflates counts | Always filter mode == 'TOTAL' for longitudinal analysis |
| Non-candidate rows | UNDERVOTES, OVERVOTES, SPOILED, TOTAL VOTES CAST appear as "candidates" | Filter out before computing candidate vote shares |
| Alaska 2004 | District-level data with non-standard FIPS codes (2001-2099); vote counts overstated | Exclude AK 2004 or handle separately; do not join on county_fips |
| Null FIPS for joins | CT, ME, RI have null county_fips in some years; breaks joins | Use state_po + county_name as fallback join key |
| Kansas City MO FIPS | Uses non-standard FIPS 2938000 (not a real county FIPS) | Handle as special case in joins; Kansas City is an independent city |
| Empty string party/mode | 2024 has "" in party (501 rows) and mode (2,795 rows) | Treat as missing/undocumented; filter or investigate by state |
| Vote share > 100% | 49 county-years where sum(candidatevotes) > totalvotes | Minor rounding; use caution with strict validation |
| Duplicate rows | 83 exact duplicate rows exist in dataset | Deduplicate before analysis |
| FIPS zero-padding | Int64 → string without padding gives 4-digit codes for AR and other small-FIPS states | pl.col("county_fips").cast(pl.Utf8).str.zfill(5) before joins |
| Name-based party ID | Candidate names change across years ("DONALD TRUMP" vs "DONALD J TRUMP") | Always use party column, never candidate name |
| CT FIPS mismatch | 2022+ Census TIGER uses CT planning regions, not legacy counties | Use 2020-vintage TIGER shapefiles for CT county joins |
| totalvotes duplication | totalvotes is repeated per candidate row; summing without dedup inflates by ~3-4x | Deduplicate to one row per (county_fips, year) before aggregating |
WARNING: Naive
mode == "TOTAL"filtering drops ~1,000 counties in 2020+ data. Multiple states report ONLY mode breakdowns (no TOTAL rows). A simple filter silently removes all their counties. Use 3-pattern mode reconstruction instead. See./references/mode-reconstruction.mdfor the full code pattern and validation.
The mode column behavior changed significantly starting in 2020:
mode = 'TOTAL' (aggregate county totals only)mode (which may represent totals OR breakdowns depending on the state)For any cross-year or multi-county analysis, use 3-pattern mode reconstruction:
candidatevotes across modesEmpty-string detection must be per-state — NC 2024 empty-string rows are breakdowns
(multiple per county-candidate), while other states' empty-string rows are totals (one per
county-candidate). See ./references/mode-reconstruction.md for detection logic and code.
| Source | Relationship | When to Use |
|---|---|---|
| Census/ACS | Join via county_fips | County demographics, population, income |
SAIPE (education-data-source-saipe) | Join via county_fips | County poverty estimates (cross-domain) |
CCD (education-data-source-ccd) | Join via county_fips | School district data (cross-domain) |
| MEDSL Precinct Returns | Finer geographic resolution | When county-level is insufficient |
| MEDSL Senate/House Returns | Same producer, different office | When analyzing down-ballot races |
Note: This is the first election domain dataset in DAAF. Cross-domain joins with education data are possible via county_fips. No election-specific explorer or query skills exist yet.
| Topic | Reference File |
|---|---|
| Column specifications | ./references/columns.md |
| Column types and ranges | ./references/columns.md |
| Party values and year coverage | ./references/coded-values.md |
| Mode values and year behavior | ./references/coded-values.md |
| Candidate name mapping | ./references/coded-values.md |
| Non-candidate entries | ./references/coded-values.md |
| Complete encoding tables | ./references/variable-definitions.md |
| Null county_fips patterns | ./references/quality-notes.md |
| Alaska 2004 anomaly | ./references/quality-notes.md |
| Kansas City MO FIPS | ./references/quality-notes.md |
| Duplicate rows | ./references/quality-notes.md |
| Null candidatevotes | ./references/quality-notes.md |
| Per-state data sources | ./references/quality-notes.md |
| Missing votes flags | ./references/quality-notes.md |
| Mode reconstruction (3-pattern) | ./references/mode-reconstruction.md |
| States without TOTAL rows | ./references/mode-reconstruction.md |
| Empty-string mode detection | ./references/mode-reconstruction.md |
| Row count estimation by year | ./references/mode-reconstruction.md |
| FIPS zero-padding for joins | ./references/columns.md |
| AR FIPS contamination (Sharp/St. Francis) | ./references/quality-notes.md |
| CT geography mismatch (2022+) | ./references/quality-notes.md |
| Party-based identification (best practice) | ./references/coded-values.md |
| totalvotes deduplication | ./references/variable-definitions.md |
| Preliminary interpretations | ./references/interpretations.md |
| Data profiling scripts | ./scripts/ |
评论 (0)
暂无评论,成为第一个评论者吧!