Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Therapeutics Data Commons. AI-ready drug discovery datasets (ADME, toxicity, DTI), benchmarks, scaffold splits, molecular oracles, for therapeutic ML and pharmacological prediction.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | — | — |
| case-19 | ✗→✓ | ▲ Improved | — | — |
| case-23 | ✗→✓ | ▲ Improved | — | — |
| case-24 | ✗→✓ | ▲ Improved | — | — |
| case-20 | ✗→✓ | ▲ Improved | — | — |
PyTDC is an open-science platform providing AI-ready datasets and benchmarks for drug discovery and development. Access curated datasets spanning the entire therapeutics pipeline with standardized evaluation metrics and meaningful data splits, organized into three categories: single-instance prediction (molecular/protein properties), multi-instance prediction (drug-target interactions, DDI), and generation (molecule generation, retrosynthesis).
This skill should be used when:
Install PyTDC using pip:
bashuv pip install PyTDC
To upgrade to the latest version:
bashuv pip install PyTDC --upgrade
Core dependencies (automatically installed):
Additional packages are installed automatically as needed for specific features.
The basic pattern for accessing any TDC dataset follows this structure:
pythonfrom tdc.<problem> import <Task> data = <Task>(name='<Dataset>') split = data.get_split(method='scaffold', seed=1, frac=[0.7, 0.1, 0.2]) df = data.get_data(format='df')
Where:
<problem>: One of single_pred, multi_pred, or generation<Task>: Specific task category (e.g., ADME, DTI, MolGen)<Dataset>: Dataset name within that taskExample - Loading ADME data:
pythonfrom tdc.single_pred import ADME data = ADME(name='Caco2_Wang') split = data.get_split(method='scaffold') # Returns dict with 'train', 'valid', 'test' DataFrames
Single-instance prediction involves forecasting properties of individual biomedical entities (molecules, proteins, etc.).
Predict pharmacokinetic properties of drug molecules.
pythonfrom tdc.single_pred import ADME data = ADME(name='Caco2_Wang') # Intestinal permeability # Other datasets: HIA_Hou, Bioavailability_Ma, Lipophilicity_AstraZeneca, etc.
Common ADME datasets:
Predict toxicity and adverse effects of compounds.
pythonfrom tdc.single_pred import Tox data = Tox(name='hERG') # Cardiotoxicity # Other datasets: AMES, DILI, Carcinogens_Lagunin, etc.
Common toxicity datasets:
Bioactivity predictions from screening data.
pythonfrom tdc.single_pred import HTS data = HTS(name='SARSCoV2_Vitro_Touret')
Quantum mechanical properties of molecules.
pythonfrom tdc.single_pred import QM data = QM(name='QM7')
Single prediction datasets typically return DataFrames with columns:
Drug_ID or Compound_ID: Unique identifierDrug or X: SMILES string or molecular representationY: Target label (continuous or binary)Multi-instance prediction involves forecasting properties of interactions between multiple biomedical entities.
Predict binding affinity between drugs and protein targets.
pythonfrom tdc.multi_pred import DTI data = DTI(name='BindingDB_Kd') split = data.get_split()
Available datasets:
Data format: Drug_ID, Target_ID, Drug (SMILES), Target (sequence), Y (binding affinity)
Predict interactions between drug pairs.
pythonfrom tdc.multi_pred import DDI data = DDI(name='DrugBank') split = data.get_split()
Multi-class classification task predicting interaction types. Dataset contains 191,808 DDI pairs with 1,706 drugs.
Predict protein-protein interactions.
pythonfrom tdc.multi_pred import PPI data = PPI(name='HuRI')
Generation tasks involve creating novel biomedical entities with desired properties.
Generate diverse, novel molecules with desirable chemical properties.
pythonfrom tdc.generation import MolGen data = MolGen(name='ChEMBL_V29') split = data.get_split()
Use with oracles to optimize for specific properties:
pythonfrom tdc import Oracle oracle = Oracle(name='GSK3B') score = oracle('CC(C)Cc1ccc(cc1)C(C)C(O)=O') # Evaluate SMILES
See references/oracles.md for all available oracle functions.
Predict reactants needed to synthesize a target molecule.
pythonfrom tdc.generation import RetroSyn data = RetroSyn(name='USPTO') split = data.get_split()
Dataset contains 1,939,253 reactions from USPTO database.
Generate molecule pairs (e.g., prodrug-drug pairs).
pythonfrom tdc.generation import PairMolGen data = PairMolGen(name='Prodrug')
For detailed oracle documentation and molecular generation workflows, refer to references/oracles.md and scripts/molecular_generation.py.
Benchmark groups provide curated collections of related datasets for systematic model evaluation.
pythonfrom tdc.benchmark_group import admet_group group = admet_group(path='data/') # Get benchmark datasets benchmark = group.get('Caco2_Wang') predictions = {} for seed in [1, 2, 3, 4, 5]: train, valid = benchmark['train'], benchmark['valid'] # Train model here predictions[seed] = model.predict(benchmark['test']) # Evaluate with required 5 seeds results = group.evaluate(predictions)
ADMET Group includes 22 datasets covering absorption, distribution, metabolism, excretion, and toxicity.
Available benchmark groups include collections for:
For benchmark evaluation workflows, see scripts/benchmark_evaluation.py.
TDC provides comprehensive data processing utilities organized into four categories.
Retrieve train/validation/test partitions with various strategies:
python# Scaffold split (default for most tasks) split = data.get_split(method='scaffold', seed=1, frac=[0.7, 0.1, 0.2]) # Random split split = data.get_split(method='random', seed=42, frac=[0.8, 0.1, 0.1]) # Cold split (for DTI/DDI tasks) split = data.get_split(method='cold_drug', seed=1) # Unseen drugs in test split = data.get_split(method='cold_target', seed=1) # Unseen targets in test
Available split strategies:
random: Random shufflingscaffold: Scaffold-based (for chemical diversity)cold_drug, cold_target, cold_drug_target: For DTI taskstemporal: Time-based splits for temporal datasetsUse standardized metrics for evaluation:
pythonfrom tdc import Evaluator # For binary classification evaluator = Evaluator(name='ROC-AUC') score = evaluator(y_true, y_pred) # For regression evaluator = Evaluator(name='RMSE') score = evaluator(y_true, y_pred)
Available metrics: ROC-AUC, PR-AUC, F1, Accuracy, RMSE, MAE, R2, Spearman, Pearson, and more.
TDC provides 11 key processing utilities:
pythonfrom tdc.chem_utils import MolConvert # Molecule format conversion converter = MolConvert(src='SMILES', dst='PyG') pyg_graph = converter('CC(C)Cc1ccc(cc1)C(C)C(O)=O')
Processing utilities include:
For comprehensive utilities documentation, see references/utilities.md.
TDC provides 17+ oracle functions for molecular optimization:
pythonfrom tdc import Oracle # Single oracle oracle = Oracle(name='DRD2') score = oracle('CC(C)Cc1ccc(cc1)C(C)C(O)=O') # Multiple oracles oracle = Oracle(name='JNK3') scores = oracle(['SMILES1', 'SMILES2', 'SMILES3'])
For complete oracle documentation, see references/oracles.md.
pythonfrom tdc.utils import retrieve_dataset_names # Get all ADME datasets adme_datasets = retrieve_dataset_names('ADME') # Get all DTI datasets dti_datasets = retrieve_dataset_names('DTI')
python# Get label mapping label_map = data.get_label_map(name='DrugBank') # Convert labels from tdc.chem_utils import label_transform transformed = label_transform(y, from_unit='nM', to_unit='p')
pythonfrom tdc.utils import cid2smiles, uniprot2seq # Convert PubChem CID to SMILES smiles = cid2smiles(2244) # Convert UniProt ID to amino acid sequence sequence = uniprot2seq('P12345')
See scripts/load_and_split_data.py for a complete example:
pythonfrom tdc.single_pred import ADME from tdc import Evaluator # Load data data = ADME(name='Caco2_Wang') split = data.get_split(method='scaffold', seed=42) train, valid, test = split['train'], split['valid'], split['test'] # Train model (user implements) # model.fit(train['Drug'], train['Y']) # Evaluate evaluator = Evaluator(name='MAE') # score = evaluator(test['Y'], predictions)
See scripts/benchmark_evaluation.py for a complete example with multiple seeds and proper evaluation protocol.
See scripts/molecular_generation.py for an example of goal-directed generation using oracle functions.
This skill includes bundled resources for common TDC workflows:
load_and_split_data.py: Template for loading and splitting TDC datasets with various strategiesbenchmark_evaluation.py: Template for running benchmark group evaluations with proper 5-seed protocolmolecular_generation.py: Template for molecular generation using oracle functionsdatasets.md: Comprehensive catalog of all available datasets organized by task typeoracles.md: Complete documentation of all 17+ molecule generation oraclesutilities.md: Detailed guide to data processing, splitting, and evaluation utilities| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-23 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-24 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 24 cases were attempted, and 23 counted toward the lift figure. The other 1 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +67 percentage points is the difference between those two pass rates over the 23 comparable cases. 3 cases got worse with the skill loaded, and they are included in that figure.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.