API Reference¶
Splitter¶
PropertyStratifiedSplitter¶
from stratosampler import PropertyStratifiedSplitter
Constructor
PropertyStratifiedSplitter(
properties=["MolLogP", "MolWt", "TPSA"],
n_bins=5,
test_size=0.2,
val_size=0.0,
scaffold_aware=False,
min_bin_size=1,
random_state=None,
)
| Parameter | Type | Default | Description |
|---|---|---|---|
properties |
list[str] |
["MolLogP","MolWt","TPSA"] |
Properties to stratify on |
n_bins |
int |
5 |
Equal-frequency bins per property |
test_size |
float |
0.2 |
Fraction of data for test set |
val_size |
float |
0.0 |
Fraction for validation set (0 = no val) |
scaffold_aware |
bool |
False |
Keep Murcko scaffold groups together |
min_bin_size |
int |
1 |
Rare strata below this are merged into a catch-all bin |
random_state |
int \| None |
None |
Random seed |
split(data, smiles_col=None, property_cols=None)
Split the dataset and return integer index arrays.
| Parameter | Description |
|---|---|
data |
pd.DataFrame |
smiles_col |
Column containing SMILES strings. Required unless property_cols is given. |
property_cols |
Pre-computed property columns already in data. |
Returns (train_idx, test_idx) or (train_idx, val_idx, test_idx) — NumPy integer arrays.
get_split_dataframes(data, smiles_col=None, property_cols=None)
Same as split() but returns DataFrames instead of index arrays.
compute_properties(smiles, properties)¶
Compute RDKit molecular properties for a list of SMILES strings.
from stratosampler import compute_properties
prop_df = compute_properties(df["SMILES"], ["MolLogP", "MolWt", "TPSA"])
Returns a pd.DataFrame with one row per molecule and one column per property. Invalid SMILES produce NaN.
BUILTIN_PROPERTIES¶
Dictionary mapping built-in property names to their RDKit calculator functions. Inspect with:
from stratosampler import BUILTIN_PROPERTIES
print(list(BUILTIN_PROPERTIES))
Metrics¶
from stratosampler import split_summary, distribution_report, coverage_score, ks_distance, js_divergence
split_summary(data, train_idx, test_idx, property_cols, val_idx=None, strata=None)¶
Convenience wrapper returning a dict with all key quality metrics.
summary = split_summary(df, train_idx, test_idx, ["MolLogP", "MolWt", "TPSA"])
Returns a dict with:
| Key | Description |
|---|---|
n_total, n_train, n_test |
Set sizes |
train_frac, test_frac |
Fractions |
mean_ks_stat |
Mean KS statistic across properties (lower = better) |
mean_js_div |
Mean JS divergence across properties (lower = better) |
per_property |
pd.DataFrame with per-property metrics |
coverage_score |
Present if strata is supplied |
distribution_report(data, train_idx, test_idx, property_cols, val_idx=None)¶
Per-property distribution metrics as a DataFrame.
Returns a pd.DataFrame with columns: property, train_mean, test_mean, ks_stat, ks_pval, js_divergence (plus val_* columns if val_idx is given).
coverage_score(train_idx, test_idx, strata)¶
Fraction of unique strata that appear in both train and test sets.
A score of 1.0 means full applicability domain coverage.
from stratosampler import coverage_score
score = coverage_score(train_idx, test_idx, strata_array)
ks_distance(train_vals, test_vals)¶
Two-sample Kolmogorov-Smirnov test. Returns (statistic, p_value).
js_divergence(train_vals, test_vals, n_bins=20)¶
Jensen-Shannon divergence between train and test histograms. Returns a float in [0, 1].
Visualisation¶
from stratosampler import plot_property_distributions, plot_split_comparison, plot_chemical_space
All functions return a matplotlib.figure.Figure.
plot_property_distributions(data, train_idx, test_idx, property_cols, val_idx=None, n_bins=30, figsize=None)¶
Overlaid histograms of train/test (and optionally val) distributions, one subplot per property.
fig = plot_property_distributions(df, train_idx, test_idx, ["MolLogP", "MolWt", "TPSA"])
fig.savefig("distributions.png", dpi=150, bbox_inches="tight")
plot_split_comparison(metrics_dict, property_cols, metric='ks_stat', figsize=None)¶
Bar chart comparing a metric across multiple split strategies.
results = {
"random": split_summary(df, rand_train, rand_test, props),
"stratified": split_summary(df, train_idx, test_idx, props),
}
fig = plot_split_comparison(results, props, metric="ks_stat")
metric accepts "ks_stat" or "js_divergence".
plot_chemical_space(data, train_idx, test_idx, x_col, y_col, val_idx=None, figsize=(7,6), alpha=0.5, s=18)¶
2D scatter plot of two properties, coloured by split assignment.
fig = plot_chemical_space(df, train_idx, test_idx, x_col="MolLogP", y_col="MolWt")
IO (RDKit loaders)¶
from stratosampler import load_smiles, load_sdf, SmilesLoader, SdfLoader
Requires pip install "stratosampler[rdkit]".
load_smiles(filepath, smiles_column=0, delimiter=None, id_column=None, keep_properties=False, sanitize=True, add_hydrogens=False, compute_2d_coords=False, raise_on_invalid=False)¶
Load molecules from a SMILES file (plain .smi or delimited .csv/.tsv).
Returns (mols, data) — a list of RDKit molecule objects and a pd.DataFrame.
load_sdf(filepath, include_properties=True, sanitize=True, remove_hs=True, compute_2d_coords=False, raise_on_invalid=False)¶
Load molecules from an SDF file.
Returns (mols, data).
SmilesLoader / SdfLoader¶
Class-based loaders for fine-grained control:
loader = SmilesLoader(raise_on_invalid=False)
mols, data = loader.load("compounds.csv", delimiter=",", smiles_column=1)