动了。 该回购已转移到benzsevern/goldenmatchmonorepopackages/python/goldencheck (and packages/typescript/goldencheck)/。此回购已存档;monorepo出现了新的发展。
金支票
数据验证,从数据中发现规则,这样您就不必编写它们。 建造于 本·塞文.
 ](https://www.npmjs.com/package/goldencheck)   ](https://pepy.tech/project/goldencheck) ](https://www.npmjs.com/package/goldencheck)  ](https://nodejs.org)     
每个竞争对手都让你先写规则。GoldenCheck翻转它: 先验证,遵守你关心的规则。
为什么选择GoldenCheck?
| GoldenCheck | 远大前程 | Pandera | 空白 | |
|---|---|---|---|---|
| 规则 | 从数据中发现 | 手写 | 手写 | 手写 |
| 配置 | 零开始 | 繁重的YAML/Python设置 | 装饰器/模式 | YAML/Python |
| 接口 | CLI+交互式TUI | HTML报告 | 例外情况 | HTML/笔记本 |
| 学习曲线 | 一个命令 | 小时/天 | 中等 | 中等 |
| LLM增强 | 是(0.01美元/次扫描) | 否 | 否 | 否 |
| 修复建议 | 是,在TUI中 | 否 | 否 | 不 |
| 置信度评分 | 是(每项发现的H/M/L) | 否 | 否 | |
| DQBench评分 | 88.40 | 21.68(尽力) | 32.51(尽力) | 6.94(自动) |
安装
pip install goldencheck借助LLM boost支持:
pip install goldencheck[llm]具有深度分析和基线支持(scipy、numpy):
pip install goldencheck[baseline]使用语义类型推理作为基线(句子转换):
pip install goldencheck[baseline,semantic]JavaScript/TypeScript
npm install goldencheck边缘安全核心 (浏览器、Cloudflare Workers、Vercel Edge):
import { scanData, TabularData } from "goldencheck/core";Node.js (文件读取、CLI、MCP):
import { readFile, scanData } from "goldencheck/node";快速开始
# Scan a file — discovers issues, launches interactive TUI
goldencheck data.csv
# CLI-only output (no TUI)
goldencheck data.csv --no-tui
# With LLM enhancement (requires API key)
goldencheck data.csv --llm-boost --no-tui
# Validate against saved rules (for CI/pipelines)
goldencheck validate data.csv
# JSON output for CI integration
goldencheck data.csv --no-tui --json
# Learn baseline (one-time, deep analysis)
goldencheck baseline data.csv
# Scan with drift detection (fast, uses saved baseline)
goldencheck scan new_data.csvTypeScript快速入门
// Scan an array of records (edge-safe — works anywhere)
import { scanData, TabularData, Severity } from "goldencheck";
const data = new TabularData([
{ id: 1, email: "alice@example.com", age: 30, status: "active" },
{ id: 2, email: "bob@test.com", age: -5, status: "inactive" },
{ id: 3, email: "not-an-email", age: 25, status: "active" },
]);
const { findings, profile } = scanData(data);
for (const f of findings) {
console.log(`[${f.severity === Severity.ERROR ? "ERROR" : "WARNING"}] ${f.column}: ${f.message}`);
}// Scan a CSV file (Node.js)
import { readFile, scanData, applyConfidenceDowngrade, healthScore } from "goldencheck/node";
const data = readFile("data.csv");
const result = scanData(data, { domain: "healthcare" });
const findings = applyConfidenceDowngrade(result.findings, false);
// Health score
const byCol = {};
for (const f of findings) {
if (f.severity >= 2) {
byCol[f.column] ??= { errors: 0, warnings: 0 };
byCol[f.column][f.severity === 3 ? "errors" : "warnings"]++;
}
}
const { grade, points } = healthScore(byCol);
console.log(`Health: ${grade} (${points}/100)`);// Validate against pinned rules
import { readFile, scanData, validateConfig, validateData } from "goldencheck/node";
import { readFileSync } from "node:fs";
import YAML from "yaml";
const config = validateConfig(YAML.parse(readFileSync("goldencheck.yml", "utf-8")));
const data = readFile("data.csv");
const findings = validateData(data, config);// Create baseline and detect drift
import { readFile, createBaseline, serializeBaseline, scanData } from "goldencheck/node";
import { runDriftChecks, deserializeBaseline } from "goldencheck";
import { writeFileSync, readFileSync } from "node:fs";
// Learn baseline
const data = readFile("reference.csv");
const baseline = createBaseline(data);
writeFileSync("baseline.json", serializeBaseline(baseline));
// Later: detect drift
const newData = readFile("production.csv");
const saved = deserializeBaseline(readFileSync("baseline.json", "utf-8"));
const driftFindings = runDriftChecks(newData, saved);// LLM-enhanced scanning (edge-safe)
import { scanData, TabularData, callLlm, parseLlmResponse, mergeLlmFindings, buildSampleBlocks } from "goldencheck";
const data = new TabularData(records);
const result = scanData(data, { returnSample: true });
const blocks = buildSampleBlocks(result.sample, result.findings);
const { text } = await callLlm("anthropic", JSON.stringify(blocks));
const llmResponse = parseLlmResponse(text);
if (llmResponse) {
const enhanced = mergeLlmFindings(result.findings, llmResponse);
}运作原理
1. SCAN → goldencheck data.csv
GoldenCheck profiles your data and discovers what "healthy" looks like
2. REVIEW → Interactive TUI shows findings sorted by severity
Each finding has: description, affected rows, sample values
3. PIN → Press Space to promote findings into permanent rules
Dismiss false positives — they won't come back
4. EXPORT → Press F2 to save rules to goldencheck.yml
Human-readable YAML with your pinned rules
5. VALIDATE → goldencheck validate data.csv
Enforce rules in CI with exit codes (0 = pass, 1 = fail)它检测到什么
柱级配置文件
| Profiler | 它捕获了什么 | 示例 |
|---|---|---|
| 类型推断 | 实际为数字的字符串列 | “列 age 是字符串,但98%是整数” |
| 空属性 | 必需列与可选列 | “50k行中有0个空值——可能是必需的” |
| 独特性 | 主键候选者,近乎重复 | “100%唯一——可能是主键” |
| 格式检测 | 电子邮件、电话、网址、日期 | “94%的电子邮件格式,6%的格式错误” |
| 范围和分布 | 异常值,最小/最大边界 | “3行值>10000” |
| 基数 | 低基数枚举建议 | “4个唯一值——可能的枚举” |
| 图案一致性 | 列中的混合格式 | “检测到3种手机格式” |
横柱轮廓仪
| Profiler | 它捕获了什么 |
|---|---|
| 时间排序 | start_date>end_date违规 |
| 零相关性 | 一起为空的列(例如,地址+城市+zip) |
| 数字交叉列 | value>max违规(例如,索赔金额>policy_max) |
| 年龄vs出生日期 | 年龄列与从出生日期算起的年龄不匹配 |
基线深度剖面和漂移检测
跑 goldencheck baseline 一旦建立健康数据的统计档案。在每次后续扫描中,GoldenCheck都会将新数据与保存的基线进行比较,并报告13种检查类型的偏差:
| 检查类型 | 它捕获了什么 |
|---|---|
distribution_drift | 价值分配发生了显著变化 |
entropy_drift | 列值的熵已更改 |
bound_violation | 值超过历史最小/最大界限 |
benford_drift | 前导数字分布偏离本福德定律 |
fd_violation | 列之间的函数依赖关系已断开 |
key_uniqueness_loss | 以前唯一的列现在有重复项 |
temporal_order_drift | 违反了历史列排序约束 |
type_drift | 列的主导语义类型已更改 |
correlation_break | 以前相关的列不再相关 |
new_correlation | 出现了新的意外相关性 |
pattern_drift | 值格式/模式分布已发生变化 |
new_pattern | 柱中出现了新的结构模式 |
基线是使用6种技术构建的:统计分析器(分布、本福德定律、熵)、约束挖掘器(函数依赖、时间顺序)、语义类型推断器(嵌入+关键字)、相关性分析器(Pearson、Cramér's V)、模式语法诱导器和置信度先验构建器。
域包
通过域特定类型定义提高检测精度:
goldencheck scan data.csv --domain healthcare # NPI, ICD, insurance, patient types
goldencheck scan data.csv --domain finance # accounts, routing, CUSIP, transactions
goldencheck scan data.csv --domain ecommerce # SKUs, orders, tracking, products域包添加了语义类型,减少了误报,提高了行业特定数据的分类。
架构差异
比较数据文件的两个版本:
goldencheck diff data.csv # compare against git HEAD
goldencheck diff old.csv new.csv # compare two files
goldencheck diff data.csv --ref main # compare against a branch自动修正
应用自动修复程序来清理数据:
goldencheck fix data.csv # safe: trim, normalize, fix encoding
goldencheck fix data.csv --mode moderate # + standardize case
goldencheck fix data.csv --mode aggressive --force # + coerce types
goldencheck fix data.csv --dry-run # preview changes观看模式
持续监控目录的数据质量:
goldencheck watch data/ --interval 30 # re-scan every 30s
goldencheck watch data/ --exit-on error # CI mode: fail on first errorREST API
将GoldenCheck作为微服务运行:
goldencheck serve --port 8000
# Scan via file upload
curl -X POST http://localhost:8000/scan --data-binary @data.csv
# Scan via URL
curl -X POST http://localhost:8000/scan/url -d '{"url": "https://example.com/data.csv"}'数据库扫描
直接扫描表格——无需CSV导出:
pip install goldencheck[db]
goldencheck scan-db "postgresql://user:pass@host/db" --table orders
goldencheck scan-db "snowflake://..." --query "SELECT * FROM orders WHERE date > '2024-01-01'"计划运行
使用webhook通知进行类似Cron的调度:
goldencheck schedule data/*.csv --interval hourly --webhook https://hooks.slack.com/...
goldencheck schedule data/*.csv --interval daily --notify-on grade-dropLLM提升
添加 --llm-boost 利用LLM智能增强分析器的发现。LLM会收到您数据的代表性样本,并:
- 查找分析人员遗漏的问题 --语义理解(例如,姓名栏中的“12345”)
- 升级严重性 --知道“应该需要电子邮件”,即使分析器只说“信息”
- 发现关系 --确定列之间的时间顺序,如
signup_date和last_login - 降低误报率 --混合电话格式很常见,不是错误
# Using OpenAI
export OPENAI_API_KEY=sk-...
goldencheck data.csv --llm-boost --llm-provider openai --no-tui
# Using Anthropic
export ANTHROPIC_API_KEY=sk-ant-...
goldencheck data.csv --llm-boost --no-tui成本: 每次扫描约0.01美元(一次API调用,带有代表性样本,而不是每次扫描)。
预算控制:
export GOLDENCHECK_LLM_BUDGET=0.50 # max spend per scan in USD配置(goldencheck.yml)
version: 1
settings:
sample_size: 100000
fail_on: error
columns:
email:
type: string
required: true
format: email
unique: true
age:
type: integer
range: [0, 120]
status:
type: string
enum: [active, inactive, pending, closed]
relations:
- type: temporal_order
columns: [start_date, end_date]
ignore:
- column: notes
check: nullability此文件中只显示固定规则,而不是每个发现。这 ignore 该列表可防止被驳回的调查结果再次出现。
CLI 参考
| 命令 | 描述 |
|---|---|
goldencheck | 扫描并启动TUI |
goldencheck scan | 显式扫描(支持 --smart, --guided) |
goldencheck validate | 根据goldencheck.yml进行验证 |
goldencheck review | 扫描+验证,启动TUI |
goldencheck init | 交互式设置向导(扫描→ 配置→ CI) |
goldencheck diff [file2] | 比较两个文件或与git HEAD进行比较 |
goldencheck watch | 轮询目录,更改时重新扫描 |
goldencheck fix | 自动修复数据质量问题 |
goldencheck baseline | 深度配置文件数据并将统计基线保存到YAML |
goldencheck learn | 生成LLM验证规则 |
goldencheck history | 显示扫描历史和趋势 |
goldencheck serve | 启动REST API服务器 |
goldencheck scan-db | 直接扫描数据库表 |
goldencheck schedule | 按照cron计划运行扫描 |
goldencheck mcp-serve | 启动MCP服务器(19个工具) |
旗帜
| 标志 | 描述 |
|---|---|
--no-tui | 将结果打印到控制台 |
--json | JSON输出 |
--fail-on | 严重性退出1: error 或 warning |
--domain | 域包: healthcare, finance, ecommerce |
--llm-boost | 启用LLM增强 |
--llm-provider | LLM提供者: anthropic (默认)或 openai |
--mode | 修复模式: safe, moderate, aggressive |
--smart | 自动分诊:高置信度,低置信度 |
--guided | 逐一浏览调查结果 |
--webhook | 将结果发布到Slack/PagerDuty/任何URL |
--notify-on | Webhook触发器: grade-drop, any-error, any-warning |
| `--baseline | |
| ` | 漂移检测的基线YAML路径 |
--no-baseline | 跳过自动发现 goldencheck_baseline.yaml |
--skip | 跳过基线技术(可以重复) |
--update | 更新现有基线,而不是覆盖 |
| `-o | |
| ` | 基线文件的输出路径(默认值: goldencheck_baseline.yaml) |
--version | 显示版本 |
TypeScript命令行界面
npx goldencheck-js scan data.csv --json
npx goldencheck-js scan data.csv --domain healthcare
npx goldencheck-js health-score data.csv
npx goldencheck-js profile data.csv
npx goldencheck-js validate data.csv --config goldencheck.yml
npx goldencheck-js baseline data.csv --output baseline.json
npx goldencheck-js fix data.csv --mode safe
npx goldencheck-js diff old.csv new.csv
npx goldencheck-js demoTypeScript架构
goldencheck (npm)
├── goldencheck/core # Edge-safe: browsers, Workers, Edge Runtime
│ ├── types # Finding, Severity, DatasetProfile, Config types
│ ├── data # TabularData — zero-dep columnar abstraction
│ ├── profilers # 10 column profilers + 4 relation profilers
│ ├── semantic # Type classifier, suppression, 3 domain packs
│ ├── engine # Scanner, confidence, validator, triage, differ, fixer
│ ├── baseline # Statistical profiling, constraints, correlation, patterns
│ ├── drift # 13 drift checks against saved baseline
│ ├── llm # Anthropic + OpenAI via fetch(), merger, budget
│ ├── agent # Strategy, handoff, review queue
│ └── reporters # JSON, CI
└── goldencheck/node # Node.js >= 20
├── reader # CSV, Parquet (via nodejs-polars)
├── mcp # MCP server (7 tools)
├── a2a # Agent-to-Agent HTTP server
├── tui # ANSI terminal output
├── db-scanner # Postgres, MySQL, SQLite
└── watcher # Directory polling基准测试
速度
| 数据集 | 时间 | 吞吐量 |
|---|---|---|
| 1K行 | 0.05秒 | 19K行/秒 |
| 10K行 | 0.23s | 43K行/秒 |
| 100K行 | 2.29s | 44K行/秒 |
| 1M行 | 2.07秒 | 482K行/秒 |
DQBench v1.0--头对头
| 工具 | 模式 | DQBench评分 |
|---|---|---|
| 金支票 | 零配置 | 88.40 |
| Pandera | 尽力法则 | 32.51 |
| 苏打核心 | 尽力而为规则 | 22.36 |
| 远大的期望 | 尽力而为的原则 | 21.68 |
GoldenCheck的零配置发现优于所有竞争对手,即使他们有手写的规则。
自己运行基准测试:
pip install dqbench goldencheck
dqbench run goldencheck检测精度
| 模式 | 列召回 | 成本 |
|---|---|---|
| 仅分析器(v0.1.0) | 87% | 0美元 |
| 仅限Profiler(v0.2.0,有信心) | 100% | $0 |
| 使用LLM Boost | 100% | ~$0.003-0.01 |
在自定义基准测试中,对9个类别的341个植入数据质量问题进行了测试。
v0.2.0的改进:少数错误类型检测、范围分析器链、更广泛的时间启发式和置信度评分将分析器的召回率从87%提高到100%。
Raha基准数据集
| 数据集 | 列召回 |
|---|---|
| 航班(2376排) | 100% (4/4列) |
| 啤酒(2410排) | 80% (4/5列) |
技术栈
| 依赖性 | 目的 |
|---|---|
| 极地 | 所有数据操作 |
| 类型 | CLI框架 |
| 文本的 | 交互式TUI |
| 富有的 | CLI输出格式 |
| Pydantic 2 | 配置验证 |
可选: Anthropic SDK / OpenAI SDK LLM Boost| MCP-SDK 对于MCP服务器| SciPy + 数值Python 用于深度基线分析([baseline]) | 句子变换器 用于基线语义类型推理([semantic])
Types/Node.js
| 依赖性 | 目的 |
|---|---|
| 零运行时deps | 核心包没有依赖关系(边缘安全) |
| 拼花阅读(可选,仅限Node.js) | |
| csv解析 | CSV读取(仅限Node.js) |
| @模型上下文协议/sdk | MCP服务器(仅限Node.js) |
MCP服务器(克劳德桌面)
GoldenCheck包括一个用于Claude Desktop集成的MCP服务器:
pip install goldencheck[mcp]添加到您的Claude桌面配置(claude_desktop_config.json):
{
"mcpServers": {
"goldencheck": {
"command": "goldencheck",
"args": ["mcp-serve"]
}
}
}可用工具:
| 工具 | 说明 |
|---|---|
scan | 扫描文件以查找数据质量问题(可选LLM增强) |
validate | 根据goldencheck.yml中的固定规则进行验证 |
profile | 获取列级统计数据和健康评分 |
health_score | 数据文件的快速A-F等级 |
get_column_detail | 深入了解特定专栏 |
list_checks | 列出所有可用的分析器检查 |
远程MCP服务器
GoldenCheck可作为托管MCP服务器在 铁匠铺 --无需安装任何东西即可从任何MCP客户端连接。
克劳德桌面/克劳德代码:
{
"mcpServers": {
"goldencheck": {
"url": "https://goldencheck-mcp-production.up.railway.app/mcp/"
}
}
}本地服务器:
pip install goldencheck[mcp]
goldencheck mcp-serve19种可用工具:扫描文件、验证规则、配置文件列、健康评分数据集、自动配置验证、解释发现、比较域、建议修复。
Jupyter/Colab
GoldenCheck在Jupyter笔记本中呈现丰富的HTML:
from goldencheck.engine.scanner import scan_file
from goldencheck.engine.confidence import apply_confidence_downgrade
from goldencheck.notebook import ScanResult
findings, profile = scan_file("data.csv")
findings = apply_confidence_downgrade(findings, llm_boost=False)
# Rich HTML display in notebooks
ScanResult(findings=findings, profile=profile)
API快速参考
python
import goldencheck
# Scan a CSV for quality issues
findings = goldencheck.scan_file("data.csv")
for f in findings:
print(f"[{f.severity}] {f.column}: {f.check} — {f.message}")
# Create baseline and detect drift
from goldencheck import create_baseline, scan_file
baseline = create_baseline("data.csv")
baseline.save("goldencheck_baseline.yaml")
findings, profile = scan_file("data.csv", baseline="goldencheck_baseline.yaml")
# Health score
score = goldencheck.health_score("data.csv")
print(score) # e.g. "B (78/100)"TypeScript
import { scanData, TabularData, Severity } from "goldencheck";
// Scan records (edge-safe)
const data = new TabularData(records);
const { findings, profile } = scanData(data);
for (const f of findings) {
console.log(`[${f.severity === Severity.ERROR ? "ERROR" : "WARNING"}] ${f.column}: ${f.message}`);
}import { readFile, scanData, applyConfidenceDowngrade, healthScore } from "goldencheck/node";
// Scan a CSV file (Node.js)
const data = readFile("data.csv");
const result = scanData(data, { domain: "healthcare" });
const findings = applyConfidenceDowngrade(result.findings, false);
// Health score
const byCol = {};
for (const f of findings) {
if (f.severity >= 2) {
byCol[f.column] ??= { errors: 0, warnings: 0 };
byCol[f.column][f.severity === 3 ? "errors" : "warnings"]++;
}
}
const { grade, points } = healthScore(byCol);
console.log(`Health: ${grade} (${points}/100)`);import { readFile, createBaseline, serializeBaseline } from "goldencheck/node";
import { runDriftChecks, deserializeBaseline } from "goldencheck";
import { writeFileSync, readFileSync } from "node:fs";
// Create baseline and detect drift
const data = readFile("reference.csv");
const baseline = createBaseline(data);
writeFileSync("baseline.json", serializeBaseline(baseline));
const newData = readFile("production.csv");
const saved = deserializeBaseline(readFileSync("baseline.json", "utf-8"));
const driftFindings = runDriftChecks(newData, saved);贡献
看 贡献.md 用于开发设置和指南。
作者
许可证
麻省理工学院——见 许可证
______________________________________________________________________
黄金套房的一部分
| 工具 | 用途 | 安装 |
|---|---|---|
| 金支票 | 验证和分析数据质量 | pip install goldencheck / npm install goldencheck |
| GoldenFlow | 转换和标准化数据 | pip install goldenflow |
| GoldenMatch | 重复和匹配记录 | pip install goldenmatch |
| 金管 | 协调整个管道 | pip install goldenpipe |
配套项目:
- dbt-goldencheck --数据验证作为dbt测试。
- 金饰类型 --社区贡献的域类型包。
- 戈尔登切克行动 --GitHub CI行动,附带公关评论。
