pointblank

posit-devMIT活跃维护

面向表格数据的校验工具包,用简单易懂的方式检查数据质量并持续监控,帮你在数据进入分析或建模前发现异常。

Data validation toolkit for assessing and monitoring data quality.

v1.2.0发布于 2026-11-06 17:01 UTC506star +8 / 7 天38fork同步于 2026-11-10 06:01 UTC

怎么上手

由 README 提炼,执行前请确认
pip install pointblank
pip install "pointblank[pl]"
硬件要求按 README 说明

README 未说明,纯 Python 库,无 GPU 或显存要求

下载:源码 zip·GitHub Releases(安装包)本站不镜像安装包

项目说明

由 README 自动翻译提炼

Python 数据校验工具包,用可定制报告把数据质量问题变成团队可读可讨论的结论

面向表格数据的校验工具包,用简单易懂的方式检查数据质量并持续监控,帮你在数据进入分析或建模前发现异常。

核心能力

  • 用 Validate 链式 API 构建列、行、聚合、表级校验计划
  • 用 DraftValidation 调用 LLM 自动生成校验规则草案
  • 通过 Narwhals 统一支持 Polars 与 Pandas DataFrame
  • 借助 Ibis 接入 DuckDB、MySQL、PostgreSQL、SQLite 等数据源
  • 生成可定制报告,把校验结果直接呈现给业务方

容易踩的坑

需自行安装 Polars 或 Pandas,或改用 pointblank[pl]/[pd] 附加依赖;连数据库要先装对应 Ibis 后端如 pointblank[duckdb];DraftValidation 需指定 LLM 模型并配置相应服务凭据

内容由模型根据 README 生成,可能不完整或不准确,以官方文档为准。看原文 README

最近发版

5 个版本v1.2.0
  1. v1.2.0最新正式版2026-11-06 · 2026-11-06 17:01 UTC

    Pointblank v1.2.0 focuses on correctness, consistency, and safety. Every table-level validation step now has a step report, and many step report layouts have been cleaned up. NaN is now treated as a missing value in every validation method on every backend. AI-powered prompt() 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, and to_code()/to_yaml() now round-trip every validation method.

    Breaking Changes

    • Python code in YAML configs is opt-in — python: blocks and the expr/pre/active shortcuts in YAML configs now run only with allow_python=True (in yaml_interrogate(), YAMLValidator.build_validation(), and execute_workflow()) or pb run --allow-python. Declarative calls such as pb.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 new allow_future= parameter accepts True (the old behavior) or a duration such as "5m" to allow for clock skew. (#518)
    • Pipeline.run() now raises a new ContractViolationError for contracts with on_violation="raise". Its result attribute holds the PipelineResult. 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 for col_exists(), row_count_match(), col_count_match(), col_pct_null(), col_pct_missing(), data_freshness(), and specially(). Before, it returned None for 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<3 pin 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. The COLUMNS cell lists the columns the expression uses, STEP shows 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() and col_vals_decreasing() now support date, datetime, and Decimal columns on every backend and skip MissingSpec codes the same way they skip nulls. (#532)
    • The col_sum_*(), col_avg_*(), and col_sd_*() methods now work on Decimal columns on every backend and accept a Decimal value=. (#529)
    • Comparison steps now accept Decimal and datetime.time values. 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(), and col_vals_within_spec() now check Polars Categorical and Enum columns. Thanks @pcbeingused333! (#481, #482, #483)
    • col_summary_tbl() and DataScan now 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 a meter_version= parameter. OTelExporter now 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 an Int32 column), and time_field() columns now hold real time values. (#515)
    • pb run and pb validate now show steps that are inactive or couldn't be evaluated, along with the reason. pb run adds Not evaluated: and `Inactiv
  2. v1.1.12026-10-15 · 2026-10-15 18:46 UTC
    查看更新说明

    Packaging fix release: no functional changes from v1.1.0.

  3. v1.1.02026-10-15 · 2026-10-15 17:11 UTC
    查看更新说明

    Pointblank v1.1.0 adds table comparison and makes validation results more correct across backends. The new pb.compare() function, the tbl_reconcile() validation step, and the pb compare CLI 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 with column_map=, and compare a subset of columns. The result is a Comparison object with counts, row samples, a per-column summary, JSON export, and a Great Tables report in all 40 reporting languages. Inputs are scanned lazily, and partitions= 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 compare CLI command — Compares two tables from the command line, with HTML or JSON output, --engine duckdb, and exit codes for CI use (0 match, 1 differences, 2 error). (#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, and to_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, use thresholds=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() and col_vals_decreasing() gain an order_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 an na_pass= parameter. Both set-membership methods now document how they handle missing values and NaN. (#450)
    • to_code() and to_yaml() now include col_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 a dfn parameter now always receives a Narwhals DataFrame, whether it's a lambda, a named function, or another callable. This now also works with col() selectors and segments=. (#458)

    Bug Fixes

    Evaluation errors instead of misleading failures

    • Invalid expressions in col_vals_expr() and conjointly() 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!
  4. v1.0.12026-10-07 · 2026-10-07 15:48 UTC
    查看更新说明

    Pointblank v1.0.1 is 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. Polars 1.33.0 and 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() and col_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 a ShapeError on 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(), the missing= 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)
  5. v1.0.02026-10-06 · 2026-10-06 01:02 UTC
    查看更新说明

    Pointblank reaches v1.0.0 with new ways to reuse and compose validation logic, a new string-length validation method, and full compatibility with Great Tables v1.0.0. The new Steps builder and Validate.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 new col_vals_str_len() method checks that string lengths fall within minimum and/or maximum bounds. This release also restores validation reports under Great Tables v1.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, and Validate.add_steps() adds them to any validation plan. When importing steps, you can remap columns with columns_map=, override thresholds= or active=, and drop steps by name or position with exclude=. Existing Validate objects can also serve as step sources, and Steps objects 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 between min_val= and/or max_val=. It supports the usual na_pass=, pre=, segments=, thresholds=, and actions= options, has translated autobriefs, and is also available on Steps. (#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 Message from FastMCP's current module path, fixing an import error with recent FastMCP releases.
    • sqlglot is now restricted to versions below 30.18, since 30.18 and later omit table names in DROP statements 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.

用户点评

登录用户的真实使用记录,可按版本和硬件筛选
共 0 条

    还没有人点评。第一个说出真实体验的人最有价值。

    README 原文

    未翻译

    [!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.

    Python Versions PyPI PyPI Downloads Conda Version License

    CI Build Codecov branch Repo Status Documentation Ask DeepWiki

    Contributors Discord Contributor Covenant

    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:

    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:

    1. Additional validation methods for comprehensive data quality checks
    2. Advanced logging capabilities
    3. Messaging actions (Slack, email) for threshold exceedances
    4. LLM-powered validation suggestions and data dictionary generation
    5. JSON/YAML configuration for pipeline portability
    6. CLI utility for validation from the command line
    7. Expanded backend support and certification
    8. 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.