Step-Level Actions

Configure actions to trigger when validation thresholds are exceeded, such as logging warnings or errors.

Validation with Actions

Configure actions to trigger when validation thresholds are exceeded, such as logging warnings or errors.

⚠️  WARNING: Validation step '1' exceeded threshold!
❌  ERROR: Critical validation failure in step '2'!
    This requires immediate attention.
Pointblank Validation
Validation with actions
Polars
STEP COLUMNS VALUES TBL EVAL UNITS PASS FAIL W E C EXT
#AAAAAA 1
col_vals_between
col_vals_between()

Column 'distance' range check.

distance [100, 2000] 337K 283K
0.84
53.3K
0.16
#EBBC14 2
col_vals_gt
col_vals_gt()

Column 'origin' check for minimum value.

air_time 25 337K 336K
1.00
359
0.00
#4CA64C 3
col_vals_not_null
col_vals_not_null()

Column 'carrier' completeness check.

carrier 337K 337K
1.00
0
0.00
2026-04-13 17:03:50 UTC< 1 s2026-04-13 17:03:50 UTC

Notes

Step 1 (local_thresholds) Step-specific thresholds set with W:0.1.

Step 2 (local_thresholds) Step-specific thresholds set with E:200.

Step 3 (local_thresholds) Step-specific thresholds set with W:1|E:0.05.

import pointblank as pb

def log_warning():
    """Custom action to log validation warnings"""
    metadata = pb.get_action_metadata()
    print(f"⚠️  WARNING: Validation step '{metadata['step']}' exceeded threshold!")

def log_error():
    """Custom action to log validation errors"""
    metadata = pb.get_action_metadata()
    print(f"❌  ERROR: Critical validation failure in step '{metadata['step']}'!")
    print(f"    This requires immediate attention.")

validation = (
    pb.Validate(
        data=pb.load_dataset(dataset="nycflights", tbl_type="polars"),
        label="Validation with actions"
    )
    .col_vals_between(
        columns="distance",
        left=100, right=2000,
        thresholds=pb.Thresholds(warning=0.1),  # Allow 10% failures before warning
        actions=pb.Actions(warning=log_warning),
        brief="Column 'distance' range check."
    )
    .col_vals_gt(
        columns="air_time",
        value=25,
        na_pass=True,
        thresholds=pb.Thresholds(error=200),  # Allow only 200 failures before error
        actions=pb.Actions(error=log_error),
        brief="Column 'origin' check for minimum value."
    )
    .col_vals_not_null(
        columns="carrier",
        thresholds=(1, 0.05),  # No tolerance for null values
        actions=pb.Actions(warning=log_warning, error=log_error),
        brief="Column 'carrier' completeness check."
    )
    .interrogate()
)

validation
Preview of Input Table
PolarsRows336,776Columns18
year
Int64
month
Int64
day
Int64
dep_time
Int64
sched_dep_time
Int64
dep_delay
Int64
arr_time
Int64
sched_arr_time
Int64
arr_delay
Int64
carrier
String
flight
Int64
tailnum
String
origin
String
dest
String
air_time
Int64
distance
Int64
hour
Int64
minute
Int64
1 2013 1 1 517 515 2 830 819 11 UA 1545 N14228 EWR IAH 227 1400 5 15
2 2013 1 1 533 529 4 850 830 20 UA 1714 N24211 LGA IAH 227 1416 5 29
3 2013 1 1 542 540 2 923 850 33 AA 1141 N619AA JFK MIA 160 1089 5 40
4 2013 1 1 544 545 -1 1004 1022 -18 B6 725 N804JB JFK BQN 183 1576 5 45
5 2013 1 1 554 600 -6 812 837 -25 DL 461 N668DN LGA ATL 116 762 6 0
336772 2013 9 30 None 1455 None None 1634 None 9E 3393 None JFK DCA None 213 14 55
336773 2013 9 30 None 2200 None None 2312 None 9E 3525 None LGA SYR None 198 22 0
336774 2013 9 30 None 1210 None None 1330 None MQ 3461 N535MQ LGA BNA None 764 12 10
336775 2013 9 30 None 1159 None None 1344 None MQ 3572 N511MQ LGA CLE None 419 11 59
336776 2013 9 30 None 840 None None 1020 None MQ 3531 N839MQ LGA RDU None 431 8 40