Data validation toolkit for assessing and monitoring data quality.
See the code[!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: 12% complete โ 6 of 37 chapters have content
Foundations
Intro: โโโโโโโโโโโโโโโ 49%
Getting Started: โโโโโโโโโโโโโโโ 89%
Inspecting Data: โโโโโโโโโโโโโโโ 100%
Validation Workflow: โโโโโโโโโโโโโโโ 100%
Analysis Loop: โโโโโโโโโโโโโโโ 65%
Building Validation Plans
Column Validations: โโโโโโโโโโโโโโโ 3%
Aggregate Validations: โโโโโโโโโโโโโโโ 8%
Row Validations: โโโโโโโโโโโโโโโ 0%
Table Validations: โโโโโโโโโโโโโโโ 0%
Missing Data: โโโโโโโโโโโโโโโ 0%
Segmented Validation: โโโโโโโโโโโโโโโ 0%
Advanced Validation: โโโโโโโโโโโโโโโ 0%
Responding to Results
Thresholds & Actions: โโโโโโโโโโโโโโโ 0%
Reports & Extracts: โโโโโโโโโโโโโโโ 0%
Quality Scoring: โโโโโโโโโโโโโโโ 0%
Notifications & Observability: โโโโโโโโโโโโโโโ 0%
AI-Assisted Validation
Semantic Validation: โโโโโโโโโโโโโโโ 0%
AI Authoring: โโโโโโโโโโโโโโโ 0%
Data Sources, Interfaces & Automation
Data Sources: โโโโโโโโโโโโโโโ 0%
YAML Workflows: โโโโโโโโโโโโโโโ 0%
Command Line: โโโโโโโโโโโโโโโ 0%
MCP Server: โโโโโโโโโโโโโโโ 0%
Data Contracts & Pipelines
Data Contracts: โโโโโโโโโโโโโโโ 0%
Pipelines: โโโโโโโโโโโโโโโ 0%
Test Data Generation
Test Data Generation: โโโโโโโโโโโโโโโ 0%
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%
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.
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.
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:
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
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:
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 video demonstrations of the CLI:
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:
"name", "email", "address", "phone", etc.country="DE" for German addresses)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.
Visit our documentation site for:
We'd love to hear from you! Connect with us:
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
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.
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.
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.
We're actively working on enhancing Pointblank with:
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.
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.
Pointblank is licensed under the MIT license.
ยฉ Posit Software, PBC.
This project is primarily maintained by Rich Iannone. Other authors may occasionally assist with some of these duties.
Python
84.0%
HTML
15.9%
Data validation toolkit for assessing and monitoring data quality.
See the code[!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: 12% complete โ 6 of 37 chapters have content
Foundations
Intro: โโโโโโโโโโโโโโโ 49%
Getting Started: โโโโโโโโโโโโโโโ 89%
Inspecting Data: โโโโโโโโโโโโโโโ 100%
Validation Workflow: โโโโโโโโโโโโโโโ 100%
Analysis Loop: โโโโโโโโโโโโโโโ 65%
Building Validation Plans
Column Validations: โโโโโโโโโโโโโโโ 3%
Aggregate Validations: โโโโโโโโโโโโโโโ 8%
Row Validations: โโโโโโโโโโโโโโโ 0%
Table Validations: โโโโโโโโโโโโโโโ 0%
Missing Data: โโโโโโโโโโโโโโโ 0%
Segmented Validation: โโโโโโโโโโโโโโโ 0%
Advanced Validation: โโโโโโโโโโโโโโโ 0%
Responding to Results
Thresholds & Actions: โโโโโโโโโโโโโโโ 0%
Reports & Extracts: โโโโโโโโโโโโโโโ 0%
Quality Scoring: โโโโโโโโโโโโโโโ 0%
Notifications & Observability: โโโโโโโโโโโโโโโ 0%
AI-Assisted Validation
Semantic Validation: โโโโโโโโโโโโโโโ 0%
AI Authoring: โโโโโโโโโโโโโโโ 0%
Data Sources, Interfaces & Automation
Data Sources: โโโโโโโโโโโโโโโ 0%
YAML Workflows: โโโโโโโโโโโโโโโ 0%
Command Line: โโโโโโโโโโโโโโโ 0%
MCP Server: โโโโโโโโโโโโโโโ 0%
Data Contracts & Pipelines
Data Contracts: โโโโโโโโโโโโโโโ 0%
Pipelines: โโโโโโโโโโโโโโโ 0%
Test Data Generation
Test Data Generation: โโโโโโโโโโโโโโโ 0%
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%
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.
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.
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:
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
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:
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 video demonstrations of the CLI:
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:
"name", "email", "address", "phone", etc.country="DE" for German addresses)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.
Visit our documentation site for:
We'd love to hear from you! Connect with us:
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
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.
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.
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.
We're actively working on enhancing Pointblank with:
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.
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.
Pointblank is licensed under the MIT license.
ยฉ Posit Software, PBC.
This project is primarily maintained by Rich Iannone. Other authors may occasionally assist with some of these duties.
Python
84.0%
HTML
15.9%