需自行安装 Polars 或 Pandas,或改用 pointblank[pl]/[pd] 附加依赖;连数据库要先装对应 Ibis 后端如 pointblank[duckdb];DraftValidation 需指定 LLM 模型并配置相应服务凭据
pointblank
posit-devMIT活跃维护面向表格数据的校验工具包,用简单易懂的方式检查数据质量并持续监控,帮你在数据进入分析或建模前发现异常。
Data validation toolkit for assessing and monitoring data quality.
pip install pointblank
pip install "pointblank[pl]"README 未说明,纯 Python 库,无 GPU 或显存要求
Python 数据校验工具包,用可定制报告把数据质量问题变成团队可读可讨论的结论
面向表格数据的校验工具包,用简单易懂的方式检查数据质量并持续监控,帮你在数据进入分析或建模前发现异常。
核心能力
- 用 Validate 链式 API 构建列、行、聚合、表级校验计划
- 用 DraftValidation 调用 LLM 自动生成校验规则草案
- 通过 Narwhals 统一支持 Polars 与 Pandas DataFrame
- 借助 Ibis 接入 DuckDB、MySQL、PostgreSQL、SQLite 等数据源
- 生成可定制报告,把校验结果直接呈现给业务方
容易踩的坑
- v1.2.0最新正式版2026-11-06 · 2026-11-06 17:01 UTC
Pointblank
v1.2.0focuses on correctness, consistency, and safety. Every table-level validation step now has a step report, and many step report layouts have been cleaned up.NaNis now treated as a missing value in every validation method on every backend. AI-poweredprompt()steps are much more reliable as they no longer report every row as failing when the model's replies can't be used. Pandas 3 is now supported, andto_code()/to_yaml()now round-trip every validation method.Breaking Changes
- Python code in YAML configs is opt-in —
python:blocks and theexpr/pre/activeshortcuts in YAML configs now run only withallow_python=True(inyaml_interrogate(),YAMLValidator.build_validation(), andexecute_workflow()) orpb run --allow-python. Declarative calls such aspb.load_dataset(),pb.col(),pb.ref(),pb.seg_group(), and the column selectors are checked without running any code, so they always work.yaml_to_python()no longer runs any code. (#527) data_freshness()now fails when the newest timestamp is later than the reference time. A newallow_future=parameter acceptsTrue(the old behavior) or a duration such as"5m"to allow for clock skew. (#518)Pipeline.run()now raises a newContractViolationErrorfor contracts withon_violation="raise". Itsresultattribute holds thePipelineResult. Before, the error was caught and the run kept going. (#517)
New Features
- Step reports for table-level steps —
get_step_report()now returns a summary report forcol_exists(),row_count_match(),col_count_match(),col_pct_null(),col_pct_missing(),data_freshness(), andspecially(). Before, it returnedNonefor these steps. Each report shows the value measured during interrogation (counts, null and missing percentages, data age, the closest matching column name, and so on) next to the expected value, with a pass/fail mark. (#488) - Pandas 3 support — The
pandas<3pin has been removed. A new CI job runs the test suite with every direct dependency at its minimum declared version.specially()also no longer renames columns in place on Pandas results. (#496)
Enhancements
col_vals_expr()steps are now easier to tell apart in the validation report. TheCOLUMNScell lists the columns the expression uses,STEPshows the expression's name if you set one, and on Python 3.11+ the footer shows the expression as you wrote it. (#492)col_vals_increasing()andcol_vals_decreasing()now support date, datetime, and Decimal columns on every backend and skipMissingSpeccodes the same way they skip nulls. (#532)- The
col_sum_*(),col_avg_*(), andcol_sd_*()methods now work on Decimal columns on every backend and accept aDecimalvalue=. (#529) - Comparison steps now accept
Decimalanddatetime.timevalues. Validation methods also accept ISO datetime strings with a UTC offset (e.g.,"2023-10-01T13:45:30+05:00"). Thanks @DG47! (#511, #528) col_vals_regex(),col_vals_str_len(), andcol_vals_within_spec()now check Polars Categorical and Enum columns. Thanks @pcbeingused333! (#481, #482, #483)col_summary_tbl()andDataScannow choose each column's profile from its dtype class. Decimal columns are summarized as numbers, Enum columns as strings, and Time columns get a min and max. Columns that can't be summarized are listed instead of throwing an error. (#501)emit_otel()gains ameter_version=parameter.OTelExporternow checks its arguments when it's created. (#514)generate_dataset()now gives numeric columns their field's dtype (e.g.,int_field(dtype="Int32")gives anInt32column), andtime_field()columns now hold realtimevalues. (#515)pb runandpb validatenow show steps that are inactive or couldn't be evaluated, along with the reason.pb runaddsNot evaluated:and `Inactiv
- Python code in YAML configs is opt-in —
- v1.1.12026-10-15 · 2026-10-15 18:46 UTC
查看更新说明
Packaging fix release: no functional changes from v1.1.0.
- v1.1.02026-10-15 · 2026-10-15 17:11 UTC
查看更新说明
Pointblank
v1.1.0adds table comparison and makes validation results more correct across backends. The newpb.compare()function, thetbl_reconcile()validation step, and thepb compareCLI command show exactly how two tables differ: row by row, column by column, and in aggregate.tbl_match()now runs on the same engine, with full step reports. This release also fixes how missing values, Ibis tables, and expression errors are handled in many validation methods. Steps that can't be evaluated now report an evaluation error instead of a misleading failure.New Features
- Table comparison with
pb.compare()— Aligns two tables by key, by position, or as multisets (keys="*"). Each row is classified as match, changed, missing, extra, or duplicate key, and schema differences are reported too. You can set numeric and datetime tolerances, normalize strings, map renamed columns withcolumn_map=, and compare a subset of columns. The result is aComparisonobject with counts, row samples, a per-column summary, JSON export, and a Great Tables report in all 40 reporting languages. Inputs are scanned lazily, andpartitions=limits memory use on very large tables. (#443) tbl_reconcile()validation step — Reconciles aggregates (sum, count, mean, min, max) between two tables, either by key group or as grand totals. (#443)pb compareCLI command — Compares two tables from the command line, with HTML or JSON output,--engine duckdb, and exit codes for CI use (0match,1differences,2error). (#443)- A richer
tbl_match()— Now uses the comparison engine and accepts the same settings. It gains a full step report, failing-row extracts from both tables, sundering, a compact settings badge, andto_code()/to_yaml()support. Note: each aligned row now counts as one test unit (before, the whole step was one unit), so fractional thresholds now refer to the share of failing rows. Pass/fail verdicts are unchanged. To fail on any difference as before, usethresholds=1. (#443)
Enhancements
- Anthropic is no longer a required dependency. It's now installed only with the
pointblank[generate]extra, so core installs are lighter. Thanks @timkpaine! (#437) col_vals_increasing()andcol_vals_decreasing()gain anorder_by=parameter, so they now work on database tables, Ibis, and PySpark. Each value is now compared with the last non-missing value before it. (#451)col_vals_not_in_set()gains anna_pass=parameter. Both set-membership methods now document how they handle missing values andNaN. (#450)to_code()andto_yaml()now includecol_vals_in_table()steps (with a placeholder for the reference table). (#461)col_vals_in_table(ref_table=)now accepts file paths and connection strings. (#463)col_vals_in_table()now matches join key types across backends and handles numeric dtype mismatches in composite keys. (#431)- A
pre=function with adfnparameter now always receives a Narwhals DataFrame, whether it's a lambda, a named function, or another callable. This now also works withcol()selectors andsegments=. (#458)
Bug Fixes
Evaluation errors instead of misleading failures
- Invalid expressions in
col_vals_expr()andconjointly()are now reported as evaluation errors. (#448) - Comparison steps on columns with incompatible types are now reported as evaluation errors. (#459)
prompt()steps now record an evaluation error when an AI provider package is missing or every model request fails (e.g., an invalid API key). Before, every row was reported as failing. (#456)- Step reports now explain evaluation errors, and failing rows are now extracted for Ibis tables. (#452)
- Tables are now converted to a common backend without changing their dtypes, and conversion failures are reported. (#453)
Missing values
- Missing values now fail
col_vals_not_in_set()on every backend. Thanks @raashish1601!
- Table comparison with
- v1.0.12026-10-07 · 2026-10-07 15:48 UTC
查看更新说明
Pointblank
v1.0.1is a maintenance release that makes Pointblank fully compatible with Polars 2.0. Polars 2.0 no longer silently converts between integers and floats in membership checks, and it requires equal-height frames for horizontal concatenation. Both changes caused errors in several validation methods and in schema step reports. This release fixes those errors across the board and corrects row ordering and row numbering for Polars LazyFrames. Polars1.33.0and later remain supported. Many thanks to @FBruzzesi for spotting these issues in Narwhals CI and contributing the first set of fixes!Bug Fixes
col_vals_in_set()andcol_vals_not_in_set()work again on Polars 2.0 when integer columns are checked against float values or float columns against integer values, including mixed sets such as[1, 2.5]. (#429, #430)- Step reports for
col_schema_match()no longer raise aShapeErroron Polars 2.0 when the table and the expected schema have different numbers of columns. (#429) - Mismatches between integer, float and Decimal types no longer raise errors on Polars 2.0 in
col_vals_in_table(),col_pct_missing(),col_missing_only_coded(),col_missing_consistent(),missing_vals_tbl(), themissing=argument of validation methods, segment groups, or the native CDISC conformance rule engine. (#430) get_sundered_data()now returns rows in their original order for Polars LazyFrames. Polars 2.0's streaming engine could otherwise reorder them. (#430)get_data_extracts()now reports correct row numbers for Polars LazyFrames. Previously, rows were numbered by the sort order of the first column, on every Polars version. (#430)
Maintenance
- CI now runs the test suite against the latest Polars and Narwhals releases as well as the minimum supported versions, so new releases of either library are tested as soon as they come out. (#430)
- v1.0.02026-10-06 · 2026-10-06 01:02 UTC
查看更新说明
Pointblank reaches
v1.0.0with new ways to reuse and compose validation logic, a new string-length validation method, and full compatibility with Great Tablesv1.0.0. The newStepsbuilder andValidate.add_steps()let you define step libraries once and combine them across validation plans, with options to remap column names, override thresholds, or skip specific steps when importing. The newcol_vals_str_len()method checks that string lengths fall within minimum and/or maximum bounds. This release also restores validation reports under Great Tablesv1.0.0, which now escapes HTML in table cells by default.New Features
- Composable validation steps: the new
pb.Steps()builder records validation steps without attaching them to a table, andValidate.add_steps()adds them to any validation plan. When importing steps, you can remap columns withcolumns_map=, overridethresholds=oractive=, and drop steps by name or position withexclude=. ExistingValidateobjects can also serve as step sources, andStepsobjects show a formatted HTML summary in notebooks. A new Composable Steps article in the User Guide covers the workflow. (#424) col_vals_str_len()validation method: checks whether the character length of string values in one or more columns falls betweenmin_val=and/ormax_val=. It supports the usualna_pass=,pre=,segments=,thresholds=, andactions=options, has translated autobriefs, and is also available onSteps. (#422)
Bug Fixes
- Validation reports now render correctly with Great Tables
v1.0.0. Previously, the HTML in the report's cells (status icons, badges, and labels) appeared as escaped markup. The fix also keeps working with earlier Great Tables versions. (#426) - The MCP server's prompts now import
Messagefrom FastMCP's current module path, fixing an import error with recent FastMCP releases. sqlglotis now restricted to versions below30.18, since30.18and later omit table names inDROPstatements and break DuckDB and SQLite backends. (#425)
Documentation
- Added a glossary to the reference section of the User Guide that defines key Pointblank terms.
- LLM examples in the skills docs now use Anthropic model IDs that are still served. (#423)
- Clarified the failing-case example in the length validation docs.
Maintenance
- Test coverage was expanded substantially across the validation, MCP, metadata, conformance, adapter, scan profile, and data generation modules.
- Composable validation steps: the new
用户点评
登录用户的真实使用记录,可按版本和硬件筛选还没有人点评。第一个说出真实体验的人最有价值。
[!TIP] 📖 Pointblank: The Complete Guide: A comprehensive (and free!) book on data validation with Pointblank is now being written. Follow along and learn everything from first steps to advanced validation patterns and AI-assisted workflows.
Overall: 31% complete — 14 of 37 chapters have content
Foundations
Intro: ███████████████ 100%
Getting Started: █████████████░░ 88%
Inspecting Data: ███████████████ 100%
Validation Workflow: ███████████████ 100%
Analysis Loop: ██████████░░░░░ 65%
Building Validation Plans
Column Validations: ███████████████ 100%
Aggregate Validations: ███████████░░░░ 71%
Row Validations: ███████████░░░░ 72%
Table Validations: ███████████████ 100%
Missing Data: ███████████████ 100%
Segmented Validation: ███████████░░░░ 75%
Advanced Validation: ████████████░░░ 78%
Responding to Results
Thresholds & Actions: ███████████████ 100%
Reports & Extracts: █░░░░░░░░░░░░░░ 9%
Quality Scoring: ░░░░░░░░░░░░░░░ 0%
Notifications & Observability: ░░░░░░░░░░░░░░░ 0%
AI-Assisted Validation
Semantic Validation: ░░░░░░░░░░░░░░░ 1%
AI Authoring: ░░░░░░░░░░░░░░░ 1%
Data Sources, Interfaces & Automation
Data Sources: ░░░░░░░░░░░░░░░ 1%
YAML Workflows: ░░░░░░░░░░░░░░░ 1%
Command Line: ░░░░░░░░░░░░░░░ 1%
MCP Server: ░░░░░░░░░░░░░░░ 1%
Data Contracts & Pipelines
Data Contracts: ░░░░░░░░░░░░░░░ 1%
Pipelines: ░░░░░░░░░░░░░░░ 1%
Test Data Generation
Test Data Generation: ░░░░░░░░░░░░░░░ 1%
Clinical & Regulated Data
Clinical & CDISC: ░░░░░░░░░░░░░░░ 0%
CDISC Conformance: ░░░░░░░░░░░░░░░ 0%
Industry Playbooks
Financial: ░░░░░░░░░░░░░░░ 0%
Ecommerce: ░░░░░░░░░░░░░░░ 0%
Data Engineering: ░░░░░░░░░░░░░░░ 0%
Healthcare: ░░░░░░░░░░░░░░░ 0%
Real-World Evidence: ░░░░░░░░░░░░░░░ 0%
ML Monitoring: ░░░░░░░░░░░░░░░ 0%
IoT Sensors: ░░░░░░░░░░░░░░░ 0%
Insurance: ░░░░░░░░░░░░░░░ 0%
Public Sector: ░░░░░░░░░░░░░░░ 0%
Marketing: ░░░░░░░░░░░░░░░ 0%
Data validation toolkit for assessing and monitoring data quality.
Pointblank takes a different approach to data quality. It doesn't have to be a tedious technical task. Rather, it can become a process focused on clear communication between team members. While other validation libraries focus solely on catching errors, Pointblank is great at both finding issues and sharing insights. Our beautiful, customizable reports turn validation results into conversations with stakeholders, making data quality issues immediately understandable and actionable for everyone on your team.
Get started in minutes, not hours. Pointblank's AI-powered DraftValidation feature analyzes your data and suggests intelligent validation rules automatically. So there's no need to stare at an empty validation script wondering where to begin. Pointblank can kickstart your data quality journey so you can focus on what matters most.
Whether you're a data scientist who needs to quickly communicate data quality findings, a data engineer building robust pipelines, or an analyst presenting data quality results to business stakeholders, Pointblank helps you to turn data quality from an afterthought into a competitive advantage.
Getting Started with AI-Powered Validation Drafting
The DraftValidation class uses LLMs to analyze your data and generate a complete validation plan with intelligent suggestions. This helps you quickly get started with data validation or jumpstart a new project.
import pointblank as pb
# Load your data
data = pb.load_dataset("game_revenue") # A sample dataset
# Use DraftValidation to generate a validation plan
pb.DraftValidation(data=data, model="anthropic:claude-opus-4-6")
The output is a complete validation plan with intelligent suggestions based on your data:
import pointblank as pb
# The validation plan
validation = (
pb.Validate(
data=data,
label="Draft Validation",
thresholds=pb.Thresholds(warning=0.10, error=0.25, critical=0.35)
)
.col_vals_in_set(columns="item_type", set=["iap", "ad"])
.col_vals_gt(columns="item_revenue", value=0)
.col_vals_between(columns="session_duration", left=3.2, right=41.0)
.col_count_match(count=11)
.row_count_match(count=2000)
.rows_distinct()
.interrogate()
)
validation
Copy, paste, and customize the generated validation plan for your needs.
Chainable Validation API
Pointblank's chainable API makes validation simple and readable. The same pattern always applies: (1) start with Validate, (2) add validation steps, and (3) finish with interrogate().
import pointblank as pb
validation = (
pb.Validate(data=pb.load_dataset(dataset="small_table"))
.col_vals_gt(columns="d", value=100) # Validate values > 100
.col_vals_le(columns="c", value=5) # Validate values <= 5
.col_exists(columns=["date", "date_time"]) # Check columns exist
.interrogate() # Execute and collect results
)
# Get the validation report from the REPL with:
validation.get_tabular_report().show()
# From a notebook simply use:
validation
Once you have an interrogated validation object, you can leverage a variety of methods to extract insights like:
- getting detailed reports for single steps to see what went wrong
- filtering tables based on validation results
- extracting problematic data for debugging
Why Choose Pointblank?
- Works with your existing stack: Seamlessly integrates with Polars, Pandas, DuckDB, MySQL, PostgreSQL, SQLite, Parquet, PySpark, Snowflake, and more!
- Beautiful, interactive reports: Crystal-clear validation results that highlight issues and help communicate data quality
- Composable validation pipeline: Chain validation steps into a complete data quality workflow
- Threshold-based alerts: Set 'warning', 'error', and 'critical' thresholds with custom actions
- Practical outputs: Use validation results to filter tables, extract problematic data, or trigger downstream processes
Production-Ready Validation Pipeline
Here's how Pointblank handles complex, real-world scenarios with advanced features like threshold management, automated alerts, and comprehensive business rule validation:
import pointblank as pb
import polars as pl
# Load your data
sales_data = pl.read_csv("sales_data.csv")
# Create a comprehensive validation
validation = (
pb.Validate(
data=sales_data,
tbl_name="sales_data", # Name of the table for reporting
label="Real-world example.", # Label for the validation, appears in reports
thresholds=(0.01, 0.02, 0.05), # Set thresholds for warnings, errors, and critical issues
actions=pb.Actions( # Define actions for any threshold exceedance
critical="Major data quality issue found in step {step} ({time})."
),
final_actions=pb.FinalActions( # Define final actions for the entire validation
pb.send_slack_notification(
webhook_url="https://hooks.slack.com/services/your/webhook/url"
)
),
brief=True, # Add automatically-generated briefs for each step
)
.col_vals_between( # Check numeric ranges with precision
columns=["price", "quantity"],
left=0, right=1000
)
.col_vals_not_null( # Ensure that columns ending with '_id' don't have null values
columns=pb.ends_with("_id")
)
.col_vals_regex( # Validate patterns with regex
columns="email",
pattern="^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$"
)
.col_vals_in_set( # Check categorical values
columns="status",
set=["pending", "shipped", "delivered", "returned"]
)
.conjointly( # Combine multiple conditions
lambda df: pb.expr_col("revenue") == pb.expr_col("price") * pb.expr_col("quantity"),
lambda df: pb.expr_col("tax") >= pb.expr_col("revenue") * 0.05
)
.interrogate()
)
Major data quality issue found in step 7 (2025-04-16 15:03:04.685612+00:00).
# Get an HTML report you can share with your team
validation.get_tabular_report().show("browser")
# Get a report of failing records from a specific step
validation.get_step_report(i=3).show("browser") # Get failing records from step 3
YAML Configuration
For teams that need portable, version-controlled validation workflows, Pointblank supports YAML configuration files. This makes it easy to share validation logic across different environments and team members, ensuring everyone is on the same page.
validation.yaml
validate:
data: small_table
tbl_name: "small_table"
label: "Getting started validation"
steps:
- col_vals_gt:
columns: "d"
value: 100
- col_vals_le:
columns: "c"
value: 5
- col_exists:
columns: ["date", "date_time"]
Execute the YAML validation
import pointblank as pb
# Run validation from YAML configuration
validation = pb.yaml_interrogate("validation.yaml")
# Get the results just like any other validation
validation.get_tabular_report().show()
This approach is suitable for:
- CI/CD pipelines: Store validation rules alongside your code
- Team collaboration: Share validation logic in a readable format
- Environment consistency: Use the same validation across dev, staging, and production
- Documentation: YAML files serve as living documentation of your data quality requirements
Command Line Interface (CLI)
Pointblank includes a powerful CLI utility called pb that lets you run data validation workflows directly from the command line. Perfect for CI/CD pipelines, scheduled data quality checks, or quick validation tasks.
Explore Your Data
# Get a quick preview of your data
pb preview small_table
# Preview data from GitHub URLs
pb preview "https://github.com/user/repo/blob/main/data.csv"
# Check for missing values in Parquet files
pb missing data.parquet
# Generate column summaries from database connections
pb scan "duckdb:///data/sales.ddb::customers"
Run Essential Validations
# Run validation from YAML configuration file
pb run validation.yaml
# Run validation from Python file
pb run validation.py
# Check for duplicate rows
pb validate small_table --check rows-distinct
# Validate data directly from GitHub
pb validate "https://github.com/user/repo/blob/main/sales.csv" --check col-vals-not-null --column customer_id
# Verify no null values in Parquet datasets
pb validate "data/*.parquet" --check col-vals-not-null --column a
# Extract failing data for debugging
pb validate small_table --check col-vals-gt --column a --value 5 --show-extract
Integrate with CI/CD
# Use exit codes for automation in one-liner validations (0 = pass, 1 = fail)
pb validate small_table --check rows-distinct --exit-code
# Run validation workflows with exit codes
pb run validation.yaml --exit-code
pb run validation.py --exit-code
Click the following headings to see some terminal recordings of the CLI in action:
Generate Realistic Test Data
Need test data for your validation workflows? The generate_dataset() function creates realistic, locale-aware synthetic data based on schema definitions. It's very useful for developing pipelines without production data, running CI/CD tests with reproducible scenarios, or prototyping workflows before production data is available.
import pointblank as pb
# Define a schema with field constraints
schema = pb.Schema(
user_id=pb.int_field(min_val=1, unique=True),
name=pb.string_field(preset="name"),
email=pb.string_field(preset="email"),
age=pb.int_field(min_val=18, max_val=100),
status=pb.string_field(allowed=["active", "pending", "inactive"]),
)
# Generate 10 rows of realistic test data
data = pb.generate_dataset(schema, n=10, seed=23)
pb.preview(data)
The generator supports sophisticated data generation with these capabilities:
- Realistic data with presets: Use built-in presets like
"name","email","address","phone", etc. - User agent strings: Generate highly varied, realistic browser user agent strings from 17 browser categories with over 42,000 unique combinations
- 100 country support: Generate locale-specific data (e.g.,
country="DE"for German addresses) - Field constraints: Control ranges, patterns, uniqueness, and allowed values
- Multiple output formats: Returns Polars DataFrames by default, but also supports Pandas (
output="pandas") or dictionaries (output="dict")
This makes it easy to generate test data that matches your validation rules, helping you develop and test data quality workflows without relying on real data.
Features That Set Pointblank Apart
- Complete validation workflow: From data access to validation to reporting in a single pipeline
- Built for collaboration: Share results with colleagues through beautiful interactive reports
- Practical outputs: Get exactly what you need: counts, extracts, summaries, or full reports
- Flexible deployment: Use in notebooks, scripts, or data pipelines
- Synthetic data generation: Create realistic test data with 30+ presets, user agent strings, locale-aware formatting, and 100 country support
- Customizable: Tailor validation steps and reporting to your specific needs
- Internationalization: Reports can be generated in 40 languages, including English, Spanish, French, and German
Documentation and Examples
Visit our documentation site for:
Join the Community
We'd love to hear from you! Connect with us:
- GitHub Issues for bug reports and feature requests
- Discord server for discussions and help
- Contributing guidelines if you'd like to help improve Pointblank
Installation
You can install Pointblank using pip:
pip install pointblank
You can also install Pointblank from Conda-Forge by using:
conda install conda-forge::pointblank
If you don't have Polars or Pandas installed, you'll need to install one of them to use Pointblank.
pip install "pointblank[pl]" # Install Pointblank with Polars
pip install "pointblank[pd]" # Install Pointblank with Pandas
To use Pointblank with DuckDB, MySQL, PostgreSQL, or SQLite, install Ibis with the appropriate backend:
pip install "pointblank[duckdb]" # Install Pointblank with Ibis + DuckDB
pip install "pointblank[mysql]" # Install Pointblank with Ibis + MySQL
pip install "pointblank[postgres]" # Install Pointblank with Ibis + PostgreSQL
pip install "pointblank[sqlite]" # Install Pointblank with Ibis + SQLite
Technical Details
Pointblank uses Narwhals to work with Polars and Pandas DataFrames, and integrates with Ibis for database and file format support. This architecture provides a consistent API for validating tabular data from various sources.
Contributing to Pointblank
There are many ways to contribute to the ongoing development of Pointblank. Some contributions can be simple (like fixing typos, improving documentation, filing issues for feature requests or problems, etc.) and others might take more time and care (like answering questions and submitting PRs with code changes). Just know that anything you can do to help would be very much appreciated!
Please read over the contributing guidelines for information on how to get started.
Pointblank for R
There's also a version of Pointblank for R, which has been around since 2017 and is widely used in the R community. You can find it at https://github.com/rstudio/pointblank.
Roadmap
We're actively working on enhancing Pointblank with:
- Additional validation methods for comprehensive data quality checks
- Advanced logging capabilities
- Messaging actions (Slack, email) for threshold exceedances
- LLM-powered validation suggestions and data dictionary generation
- JSON/YAML configuration for pipeline portability
- CLI utility for validation from the command line
- Expanded backend support and certification
- High-quality documentation and examples
If you have any ideas for features or improvements, don't hesitate to share them with us! We are always looking for ways to make Pointblank better.
Code of Conduct
Please note that the Pointblank project is released with a contributor code of conduct. By participating in this project you agree to abide by its terms.
📄 License
Pointblank is licensed under the MIT license.
© Posit Software, PBC.
🏛️ Governance
This project is primarily maintained by Rich Iannone. Other authors may occasionally assist with some of these duties.