soc-pipeline¶
Clauset-grade power-law validation for self-organized criticality (SOC) data.
Quick start¶
from soc_pipeline import validate
import numpy as np
# Synthetic Pareto sample
data = np.random.pareto(1.5, 5000) + 1
verdict = validate(data, label="my_events", expected_band=(2.4, 2.6))
print(verdict.verdict, verdict.alpha, verdict.in_band)
Top-level entry points¶
validate ¶
Unified one-call validation API.
This is the canonical entry point for users who want a quick PASS/FAIL/INCONCLUSIVE verdict on whether a sample looks like a self-organized criticality (SOC) power-law relative to a pre-registered band.
The contract:
>>> from soc_pipeline import validate
>>> v = validate(data, label="earthquake_M", expected_band=(1.9, 2.1))
>>> print(v.verdict, v.alpha, v.in_band)
INCONCLUSIVE rules
- n_total < min_samples (default 100)
- powerlaw fit raises / returns NaN
- bootstrap CI cannot be computed (too few values)
- LR test prefers lognormal or exponential alternative with high confidence
PASS rules
- Fit succeeds
- alpha lies inside expected_band (if provided); otherwise just "fit OK + no alternative preferred" -> PASS
- No alternative model (lognormal / exponential) significantly beats the power-law (R > 0 OR p >= 0.1)
FAIL rules
- Fit succeeds but alpha is outside the pre-registered band
- or an alternative model significantly beats power-law (R<0 AND p<0.1)
Verdict dataclass ¶
Verdict(verdict: Literal['PASS', 'FAIL', 'INCONCLUSIVE'], alpha: float, alpha_ci_lo: float, alpha_ci_hi: float, xmin: float, n_tail: int, ks_distance: float, vs_lognormal_R: float, vs_lognormal_p: float, vs_exponential_R: float, vs_exponential_p: float, pre_registered_band: tuple[float, float] | None, in_band: bool | None, label: str = 'data', reason: str = '')
Unified verdict returned by :func:validate.
Attributes:
| Name | Type | Description |
|---|---|---|
verdict | Literal['PASS', 'FAIL', 'INCONCLUSIVE'] | One of |
alpha | float | Power-law exponent estimate (Clauset 2009 MLE). |
alpha_ci_lo | float | Lower bound of 95% bootstrap CI on alpha. |
alpha_ci_hi | float | Upper bound of 95% bootstrap CI on alpha. |
xmin | float | Lower bound selected by KS minimisation. |
n_tail | int | Sample size at and above |
ks_distance | float | Kolmogorov-Smirnov distance of empirical tail vs fit. |
vs_lognormal_R | float | Vuong LR statistic (positive favours power-law). |
vs_lognormal_p | float | Two-sided p-value of LR vs lognormal. |
vs_exponential_R | float | Vuong LR statistic vs exponential. |
vs_exponential_p | float | Two-sided p-value of LR vs exponential. |
pre_registered_band | tuple[float, float] | None | Optional |
in_band | bool | None | True/False if alpha falls inside the pre-registered band, or None when no band was supplied / fit failed. |
label | str | Caller-supplied label. |
reason | str | Human-readable reason string (most useful for INCONCLUSIVE). |
validate ¶
validate(data: ndarray, label: str = 'data', expected_band: tuple[float, float] | None = None, *, discrete: bool = False, n_boot: int = 200, seed: int = 42, min_samples: int = 100) -> Verdict
Run the canonical Clauset-grade SOC validation on a 1-D sample.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
data | ndarray | 1-D positive array of event sizes / durations. | required |
label | str | Caller-supplied label for round-tripping (e.g. | 'data' |
expected_band | tuple[float, float] | None | Optional | None |
discrete | bool | Pass-through to :func: | False |
n_boot | int | Number of bootstrap resamples for the CI (default 200). | 200 |
seed | int | RNG seed for reproducibility of the bootstrap CI. | 42 |
min_samples | int | Minimum sample size; below this returns INCONCLUSIVE. | 100 |
Returns:
| Name | Type | Description |
|---|---|---|
A | Verdict | class: |
Source code in packages/soc-pipeline/src/soc_pipeline/validate.py
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 | |
Verdict dataclass ¶
Verdict(verdict: Literal['PASS', 'FAIL', 'INCONCLUSIVE'], alpha: float, alpha_ci_lo: float, alpha_ci_hi: float, xmin: float, n_tail: int, ks_distance: float, vs_lognormal_R: float, vs_lognormal_p: float, vs_exponential_R: float, vs_exponential_p: float, pre_registered_band: tuple[float, float] | None, in_band: bool | None, label: str = 'data', reason: str = '')
Unified verdict returned by :func:validate.
Attributes:
| Name | Type | Description |
|---|---|---|
verdict | Literal['PASS', 'FAIL', 'INCONCLUSIVE'] | One of |
alpha | float | Power-law exponent estimate (Clauset 2009 MLE). |
alpha_ci_lo | float | Lower bound of 95% bootstrap CI on alpha. |
alpha_ci_hi | float | Upper bound of 95% bootstrap CI on alpha. |
xmin | float | Lower bound selected by KS minimisation. |
n_tail | int | Sample size at and above |
ks_distance | float | Kolmogorov-Smirnov distance of empirical tail vs fit. |
vs_lognormal_R | float | Vuong LR statistic (positive favours power-law). |
vs_lognormal_p | float | Two-sided p-value of LR vs lognormal. |
vs_exponential_R | float | Vuong LR statistic vs exponential. |
vs_exponential_p | float | Two-sided p-value of LR vs exponential. |
pre_registered_band | tuple[float, float] | None | Optional |
in_band | bool | None | True/False if alpha falls inside the pre-registered band, or None when no band was supplied / fit failed. |
label | str | Caller-supplied label. |
reason | str | Human-readable reason string (most useful for INCONCLUSIVE). |
Power-law fit¶
fit_clauset_powerlaw ¶
fit_clauset_powerlaw(x_data: ndarray, name: str = 'values', discrete: bool = False, xmin_method: str = 'ks', min_samples: int = 100) -> FitResult
Fit a power-law to the tail of x_data using the Clauset 2009 method.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
x_data | ndarray | 1-D array of positive observed sizes/durations. | required |
name | str | Caller-provided label for logging / round-tripping. | 'values' |
discrete | bool | True for integer event counts, False for continuous sizes. | False |
xmin_method | str | Currently only 'ks' (Kolmogorov-Smirnov minimization). | 'ks' |
min_samples | int | Minimum sample size; below this, the function returns a FitResult with an error message and unset fields. | 100 |
Returns:
| Type | Description |
|---|---|
FitResult | FitResult dataclass. |
Notes
Requires the powerlaw package (Alstott et al. 2014). If the package is not installed, FitResult.error is set and other fields are None.
Source code in packages/soc-pipeline/src/soc_pipeline/fit.py
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 | |
FitResult dataclass ¶
FitResult(alpha: float | None = None, xmin: float | None = None, sigma: float | None = None, n_total: int = 0, n_tail: int = 0, ks_statistic: float | None = None, vs_lognormal_R: float | None = None, vs_lognormal_p: float | None = None, vs_exponential_R: float | None = None, vs_exponential_p: float | None = None, vs_powerlaw_lognormal_winner: str = 'inconclusive', rejects_power_law: bool = False, name: str = 'values', error: str | None = None, extra: dict[str, Any] = dict())
Result of a Clauset 2009 power-law fit.
Attributes:
| Name | Type | Description |
|---|---|---|
alpha | float | None | Power-law scaling exponent (P(x) ~ x^-alpha). |
xmin | float | None | Lower-bound xmin selected by KS minimization. |
sigma | float | None | Standard error on alpha. |
n_total | int | Total sample size before xmin cut. |
n_tail | int | Number of samples >= xmin (used for the fit). |
ks_statistic | float | None | KS distance between empirical tail and fitted power-law. |
vs_lognormal_R | float | None | Vuong LR statistic vs lognormal (positive -> power-law). |
vs_lognormal_p | float | None | Two-sided p-value for the LR test vs lognormal. |
vs_exponential_R | float | None | Vuong LR statistic vs exponential. |
vs_exponential_p | float | None | Two-sided p-value for the LR test vs exponential. |
vs_powerlaw_lognormal_winner | str | 'power_law' / 'lognormal' / 'inconclusive'. |
rejects_power_law | bool | True if comparison vs simpler model rejects PL. |
name | str | Caller-provided label. |
error | str | None | If non-None, fit failed and other fields are unset. |
to_dict ¶
Backward-compatible dict view (matches legacy v4/lib API).
Source code in packages/soc-pipeline/src/soc_pipeline/fit.py
Bootstrap¶
bootstrap_ci ¶
bootstrap_ci(x_data: ndarray, n_boot: int = 200, seed: int = 42, discrete: bool = False, ci_pct: tuple[float, float] = (2.5, 97.5), min_samples: int = 200) -> BootstrapResult
Bootstrap a CI on the Clauset 2009 alpha estimator.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
x_data | ndarray | 1-D positive sample. | required |
n_boot | int | Number of resamples (default 200; >=200 recommended). | 200 |
seed | int | RNG seed for reproducibility. | 42 |
discrete | bool | Pass-through to powerlaw.Fit. | False |
ci_pct | tuple[float, float] | Lower/upper percentile pair for the CI (default 95% CI). | (2.5, 97.5) |
min_samples | int | Minimum sample size to attempt bootstrap. | 200 |
Returns:
| Type | Description |
|---|---|
BootstrapResult | BootstrapResult dataclass. If fewer than 20 fits succeed, returns |
BootstrapResult | a result with error set. |
Source code in packages/soc-pipeline/src/soc_pipeline/bootstrap.py
BootstrapResult dataclass ¶
BootstrapResult(alpha_mean: float | None = None, alpha_median: float | None = None, alpha_std: float | None = None, ci_low: float | None = None, ci_high: float | None = None, n_boot_succeeded: int = 0, error: str | None = None)
Bootstrap CI on the power-law alpha.
Attributes:
| Name | Type | Description |
|---|---|---|
alpha_mean | float | None | Mean of bootstrap-resampled alpha. |
alpha_median | float | None | Median of bootstrap-resampled alpha. |
alpha_std | float | None | Standard deviation across bootstrap samples. |
ci_low | float | None | Lower percentile of alpha (default 2.5). |
ci_high | float | None | Upper percentile of alpha (default 97.5). |
n_boot_succeeded | int | Number of resamples where fitting succeeded. |
error | str | None | Optional error string when fewer than 20 resamples succeeded. |
Likelihood-ratio test (Vuong)¶
vuong_lr_test ¶
vuong_lr_test(x_data: ndarray, vs: Distribution = 'lognormal', discrete: bool = False, alpha_threshold: float = 0.1) -> LRResult
Run Vuong 1989 LR test on power-law vs alternative.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
x_data | ndarray | Positive 1-D sample. | required |
vs | Distribution | Alternative distribution ('lognormal' / 'exponential' / 'stretched_exponential' / 'truncated_power_law'). | 'lognormal' |
discrete | bool | Pass-through to powerlaw.Fit. | False |
alpha_threshold | float | p-value cutoff for declaring a winner. | 0.1 |
Returns:
| Type | Description |
|---|---|
LRResult | LRResult dataclass. |
Source code in packages/soc-pipeline/src/soc_pipeline/lr_test.py
LRResult dataclass ¶
LRResult(vs: str, R: float | None = None, p: float | None = None, winner: str = 'inconclusive', error: str | None = None)
Result of a Vuong LR test power_law vs vs.
Attributes:
| Name | Type | Description |
|---|---|---|
vs | str | Alternative distribution name. |
R | float | None | Normalized LR statistic. R > 0 favors power-law, R < 0 favors alternative. |
p | float | None | Two-sided p-value (small => one model significantly better). |
winner | str | 'power_law' / |
error | str | None | Error string when fit failed. |
Null controls¶
synthetic_null ¶
synthetic_null(kind: NullKind | None = None, n: int = 20000, seed: int = 42) -> dict[str, NullCase] | NullCase
Run the pipeline on one or all synthetic nulls.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
kind | NullKind | None | If None, run all three null kinds (gaussian_walk, exponential, poisson_iat) and return a dict keyed by name. If a specific kind, return a single NullCase. | None |
n | int | Sample size per null. | 20000 |
seed | int | RNG seed. | 42 |
Returns:
| Type | Description |
|---|---|
dict[str, NullCase] | NullCase | Either a dict[str, NullCase] (when kind is None) or a single NullCase. |
Notes
Use the dict form for the standard validation suite. The returned cases each carry a correctly_rejected flag — pipeline is healthy iff all three reject power-law.
Source code in packages/soc-pipeline/src/soc_pipeline/null_controls.py
NullCase dataclass ¶
Result of running the pipeline on one synthetic null distribution.
Attributes:
| Name | Type | Description |
|---|---|---|
name | NullKind | Which null distribution generated the sample. |
fit | FitResult | FitResult from passing the sample through the SOC pipeline. |
correctly_rejected | bool | True iff the pipeline reported rejects_power_law. |
Universal collapse¶
shape_normalized_collapse ¶
shape_normalized_collapse(samples: dict[str, tuple[ndarray, float]], s_star_percentile: float = 99.0, n_points: int = 120) -> CollapseResult
Compute shape-normalized collapse curves across systems.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
samples | dict[str, tuple[ndarray, float]] | dict mapping system name -> (event_sizes, known_alpha). event_sizes: 1-D positive array. known_alpha: scaling exponent from Clauset fit (or literature value). | required |
s_star_percentile | float | Percentile used to choose system-specific cutoff s*. 99 means s* = 99th percentile (robust to outliers). | 99.0 |
n_points | int | Number of log-spaced CCDF grid points per system. | 120 |
Returns:
| Type | Description |
|---|---|
CollapseResult | CollapseResult with one SystemCurve per system. |
Source code in packages/soc-pipeline/src/soc_pipeline/universal_collapse.py
CollapseResult dataclass ¶
CollapseResult(systems: dict[str, SystemCurve] = dict(), alpha_range: tuple[float, float] | None = None, n_systems: int = 0, notes: str = '')
Result of shape-normalized collapse over multiple systems.
Attributes:
| Name | Type | Description |
|---|---|---|
systems | dict[str, SystemCurve] | Dict mapping system name -> SystemCurve. |
alpha_range | tuple[float, float] | None | (min_alpha, max_alpha) across systems. |
n_systems | int | Number of systems included. |
notes | str | Free-text summary. |
Omori-law decay¶
fit_omori_p ¶
fit_omori_p(dts_sec: ndarray, min_sec: float = 300.0, max_sec: float = 30 * 86400, n_bins: int = 24, c_grid_days: tuple[float, ...] = (0.001, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5)) -> OmoriResult
Omori-Utsu fit on a stack of aftershock times after a main shock.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
dts_sec | ndarray | Delay (seconds) of each aftershock after its main shock. | required |
min_sec | float | Lower edge of fit window (default 5 min). | 300.0 |
max_sec | float | Upper edge of fit window (default 30 days). | 30 * 86400 |
n_bins | int | Number of log-spaced time bins. | 24 |
c_grid_days | tuple[float, ...] | Grid for the c (time-shift) parameter; best by R^2 wins. | (0.001, 0.005, 0.01, 0.02, 0.05, 0.1, 0.2, 0.5) |
Returns:
| Type | Description |
|---|---|
OmoriResult | OmoriResult dataclass. |
Source code in packages/soc-pipeline/src/soc_pipeline/omori.py
59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 | |
OmoriResult dataclass ¶
OmoriResult(p: float | None = None, p_sigma: float | None = None, c_days: float | None = None, logK: float | None = None, R2: float | None = None, n_aftershocks_in_fit: int = 0, n_bins_used: int = 0, t_range_days: tuple[float, float] | None = None, n_main: int | None = None, mu: float | None = None, sigma: float | None = None, threshold: float | None = None, error: str | None = None, extra: dict[str, Any] = dict())
Result of an Omori-Utsu p-value fit.
Attributes:
| Name | Type | Description |
|---|---|---|
p | float | None | Omori-Utsu decay exponent. |
p_sigma | float | None | Standard error on p. |
c_days | float | None | Time-shift constant (days) chosen from grid by best R^2. |
logK | float | None | log10 of productivity K. |
R2 | float | None | Goodness-of-fit on log-spaced bins. |
n_aftershocks_in_fit | int | How many aftershocks fed the regression. |
n_bins_used | int | How many time bins survived the count>=3 filter. |
t_range_days | tuple[float, float] | None | (t_min, t_max) of valid bins in days. |
n_main | int | None | For bin_and_omori only: how many main shocks were detected. |
mu | float | None | For bin_and_omori only: mean bin count. |
sigma | float | None | For bin_and_omori only: std bin count. |
threshold | float | None | For bin_and_omori only: mu + sigma_k * sigma. |
error | str | None | Error string when fit failed. |
extra | dict[str, Any] | Misc fields preserved for backward-compat. |
bin_and_omori_from_events ¶
bin_and_omori_from_events(event_times_sec: ndarray, bin_seconds: float = 60.0, sigma_k: float = 3.0, window_bins: int = 60) -> OmoriResult
Discrete-time Omori detector for event streams without main/aftershock labels.
Pipeline:
- Bin events into windows of bin_seconds.
- Detect main shocks where count > mu + sigma_k * sigma.
- Stack post-shock counts in window_bins succeeding bins.
- Fit log(rate - mu) = logK - p * log(tau + 1) on positive-excess bins.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
event_times_sec | ndarray | 1-D array of event timestamps in seconds. | required |
bin_seconds | float | Bin width in seconds. | 60.0 |
sigma_k | float | Number of std above mean for main-shock threshold. | 3.0 |
window_bins | int | How many bins after a main shock to track. | 60 |
Returns:
| Type | Description |
|---|---|
OmoriResult | OmoriResult dataclass. |
Source code in packages/soc-pipeline/src/soc_pipeline/omori.py
150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 | |
Gutenberg-Richter b-value¶
fit_b_value ¶
fit_b_value(magnitudes: ndarray, mc: float | None = None, bin_width: float = 0.1, bootstrap: bool = False, n_boot: int = 500, seed: int = 42) -> BValueResult
Fit a Gutenberg-Richter b-value using Aki 1965 MLE.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
magnitudes | ndarray | 1-D array of earthquake magnitudes. | required |
mc | float | None | Magnitude of completeness; if None, estimated by max-curvature. | None |
bin_width | float | Magnitude binning step (used for bias correction). | 0.1 |
bootstrap | bool | If True, compute 95% bootstrap CI on b. | False |
n_boot | int | Number of bootstrap resamples. | 500 |
seed | int | RNG seed for the bootstrap. | 42 |
Returns:
| Type | Description |
|---|---|
BValueResult | BValueResult dataclass. |
Source code in packages/soc-pipeline/src/soc_pipeline/b_value.py
b_to_clauset_alpha ¶
Map G-R b-value to equivalent Clauset alpha on energy.
Energy scaling s = 10^(1.5 M) (Hanks-Kanamori). The CDF transformation gives alpha = 1 + b/1.5.
Source code in packages/soc-pipeline/src/soc_pipeline/b_value.py
Time-resolution sweep¶
time_resolution_sweep ¶
time_resolution_sweep(event_times: ndarray, bin_sizes_sec: Sequence[float] = (60.0, 300.0, 900.0, 3600.0, 21600.0, 86400.0), stability_threshold: float = 0.15) -> dict[str, Any]
Bin events at multiple time resolutions and fit alpha to each.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
event_times | ndarray | 1-D array of event timestamps in seconds. | required |
bin_sizes_sec | Sequence[float] | Sequence of bin sizes (seconds) to sweep. | (60.0, 300.0, 900.0, 3600.0, 21600.0, 86400.0) |
stability_threshold | float | Max alpha spread (max-min) for "stable" verdict. | 0.15 |
Returns:
| Type | Description |
|---|---|
dict[str, Any] | dict with: |
dict[str, Any] |
|
dict[str, Any] |
|
dict[str, Any] |
|
Notes
Genuinely SOC processes should be roughly bin-invariant. Sharp alpha dependence on bin size suggests artifacts (e.g., Poisson smoothing from undersampling).
Source code in packages/soc-pipeline/src/soc_pipeline/time_resolution.py
Utilities¶
empirical_ccdf ¶
Compute the complementary CDF P(X > s) on a log-spaced grid.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
vals | ndarray | 1-D array of positive values. | required |
n_points | int | Number of log-spaced sample points. | 200 |
Returns:
| Type | Description |
|---|---|
ndarray | None | (grid, ccdf) — both shape (n_points,). Returns (None, None) if input |
ndarray | None | is empty after filtering for positive finite values. |
Source code in packages/soc-pipeline/src/soc_pipeline/utils.py
verdict_from_alpha_band ¶
verdict_from_alpha_band(alpha: float | None, predicted: tuple[float, float], literature: tuple[float, float] | None = None) -> str
Standard 3-tier SOC verdict.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
alpha | float | None | Fitted alpha value or None. | required |
predicted | tuple[float, float] | (low, high) first-principles prediction band. | required |
literature | tuple[float, float] | None | (low, high) wider literature-acceptance band. Optional. | None |
Returns:
| Type | Description |
|---|---|
str | 'CONFIRMED' | 'CONFIRMED (literature band)' | 'DEVIATING' | 'INCONCLUSIVE' |
Source code in packages/soc-pipeline/src/soc_pipeline/utils.py
Pandas accessor¶
The package registers a .soc accessor on pandas.Series:
import pandas as pd
import soc_pipeline # registers .soc accessor as side-effect
s = pd.Series([...])
v = s.soc.validate(label="my_series", expected_band=(2.0, 3.0))
SocAccessor ¶
Pandas Series .soc accessor — see module docstring for usage.
Source code in packages/soc-pipeline/src/soc_pipeline/pandas_accessor.py
validate ¶
validate(label: str | None = None, expected_band: tuple[float, float] | None = None, n_boot: int | None = 200, discrete: bool = False, seed: int = 42, min_samples: int = 100) -> Verdict
Full SOC validation on this series. See module-level validate().
Source code in packages/soc-pipeline/src/soc_pipeline/pandas_accessor.py
fit_alpha ¶
Convenience: return just the point-estimate alpha (skip bootstrap).
Source code in packages/soc-pipeline/src/soc_pipeline/pandas_accessor.py
is_pass ¶
Convenience: True iff verdict is PASS.