药物化学过滤库Skill medchem

Medchem 是一个用于药物发现中分子过滤和优先化的 Python 库,提供多种规则和过滤器,如 Lipinski 规则、PAINS 过滤器、结构警报和复杂度指标,以高效筛选化合物。关键词:药物化学,分子过滤,规则应用,化合物筛选,药物研发

药物研发 0 次安装 0 次浏览 更新于 3/16/2026

name: medchem description: “药物化学过滤器。应用药物相似性规则(Lipinski、Veber)、PAINS 过滤器、结构警报、复杂度指标,用于化合物优先化和库过滤。”

Medchem

概述

Medchem 是一个 Python 库,用于药物发现工作流程中的分子过滤和优先化。应用数百个已建立和新的分子过滤器、结构警报和药物化学规则,以高效地大规模筛选和优先化化合物库。规则和过滤器是上下文特定的—作为指南与领域专业知识结合使用。

何时使用此技能

此技能应在以下情况下使用:

  • 应用药物相似性规则(Lipinski、Veber 等)到化合物库
  • 通过结构警报或 PAINS 模式过滤分子
  • 优先化化合物进行先导优化
  • 评估化合物质量和药物化学性质
  • 检测反应性或问题功能基团
  • 计算分子复杂度指标

安装

通过 conda 或 pip 安装 medchem:

# 通过 conda
micromamba install -c conda-forge medchem

# 通过 pip
pip install medchem

核心功能

1. 药物化学规则

使用 medchem.rules 模块对分子应用已建立的药物相似性规则。

可用规则:

  • 五规则(Lipinski)
  • Oprea 规则
  • CNS 规则
  • 先导样规则(软性和严格)
  • 三规则
  • Reos 规则
  • 药物规则
  • Veber 规则
  • 黄金三角形
  • PAINS 过滤器

单规则应用:

import medchem as mc

# 对 SMILES 字符串应用五规则
smiles = "CC(=O)OC1=CC=CC=C1C(=O)O"  # 阿司匹林
passes = mc.rules.basic_rules.rule_of_five(smiles)
# 返回:True

# 检查特定规则
passes_oprea = mc.rules.basic_rules.rule_of_oprea(smiles)
passes_cns = mc.rules.basic_rules.rule_of_cns(smiles)

多规则与 RuleFilters:

import datamol as dm
import medchem as mc

# 加载分子
mols = [dm.to_mol(smiles) for smiles in smiles_list]

# 创建包含多个规则的过滤器
rfilter = mc.rules.RuleFilters(
    rule_list=[
        "rule_of_five",
        "rule_of_oprea",
        "rule_of_cns",
        "rule_of_leadlike_soft"
    ]
)

# 使用并行化应用过滤器
results = rfilter(
    mols=mols,
    n_jobs=-1,  # 使用所有 CPU 核心
    progress=True
)

结果格式: 结果以字典形式返回,包含每个规则的通过/失败状态和详细信息。

2. 结构警报过滤器

使用 medchem.structural 模块检测潜在问题结构模式。

可用过滤器:

  1. 常见警报 - 源自 ChEMBL 管理和文献的一般结构警报
  2. NIBR 过滤器 - Novartis 生物医学研究所过滤器集
  3. Lilly 扣分 - Eli Lilly 的扣分系统(275 条规则,扣分 >100 的分子被拒绝)

常见警报:

import medchem as mc

# 创建过滤器
alert_filter = mc.structural.CommonAlertsFilters()

# 检查单个分子
mol = dm.to_mol("c1ccccc1")
has_alerts, details = alert_filter.check_mol(mol)

# 批量过滤与并行化
results = alert_filter(
    mols=mol_list,
    n_jobs=-1,
    progress=True
)

NIBR 过滤器:

import medchem as mc

# 应用 NIBR 过滤器
nibr_filter = mc.structural.NIBRFilters()
results = nibr_filter(mols=mol_list, n_jobs=-1)

Lilly 扣分:

import medchem as mc

# 计算 Lilly 扣分
lilly = mc.structural.LillyDemeritsFilters()
results = lilly(mols=mol_list, n_jobs=-1)

# 每个结果包括扣分分数和是否通过(≤100 扣分)

3. 功能 API 用于高级操作

medchem.functional 模块提供常见工作流程的便捷函数。

快速过滤:

import medchem as mc

# 对列表应用 NIBR 过滤器
filter_ok = mc.functional.nibr_filter(
    mols=mol_list,
    n_jobs=-1
)

# 应用常见警报
alert_results = mc.functional.common_alerts_filter(
    mols=mol_list,
    n_jobs=-1
)

4. 化学基团检测

使用 medchem.groups 识别特定化学基团和功能基团。

可用基团:

  • 铰链结合物
  • 磷酸盐结合物
  • 迈克尔受体
  • 反应性基团
  • 自定义 SMARTS 模式

使用:

import medchem as mc

# 创建基团检测器
group = mc.groups.ChemicalGroup(groups=["hinge_binders"])

# 检查匹配
has_matches = group.has_match(mol_list)

# 获取详细匹配信息
matches = group.get_matches(mol)

5. 命名目录

通过 medchem.catalogs 访问精选化学结构集合。

可用目录:

  • 功能基团
  • 保护基团
  • 常见试剂
  • 标准片段

使用:

import medchem as mc

# 访问命名目录
catalogs = mc.catalogs.NamedCatalogs

# 使用目录进行匹配
catalog = catalogs.get("functional_groups")
matches = catalog.get_matches(mol)

6. 分子复杂度

使用 medchem.complexity 计算近似合成可访问性的复杂度指标。

常见指标:

  • Bertz 复杂度
  • Whitlock 复杂度
  • Barone 复杂度

使用:

import medchem as mc

# 计算复杂度
complexity_score = mc.complexity.calculate_complexity(mol)

# 按复杂度阈值过滤
complex_filter = mc.complexity.ComplexityFilter(max_complexity=500)
results = complex_filter(mols=mol_list)

7. 约束过滤

使用 medchem.constraints 应用自定义基于属性的约束。

示例约束:

  • 分子量范围
  • LogP 边界
  • TPSA 限制
  • 可旋转键计数

使用:

import medchem as mc

# 定义约束
constraints = mc.constraints.Constraints(
    mw_range=(200, 500),
    logp_range=(-2, 5),
    tpsa_max=140,
    rotatable_bonds_max=10
)

# 应用约束
results = constraints(mols=mol_list, n_jobs=-1)

8. Medchem 查询语言

使用专门查询语言进行复杂过滤条件。

查询示例:

# 通过 Ro5 且没有常见警报的分子
"rule_of_five AND NOT common_alerts"

# CNS 样分子且低复杂度
"rule_of_cns AND complexity < 400"

# 先导样分子且无 Lilly 扣分
"rule_of_leadlike AND lilly_demerits == 0"

使用:

import medchem as mc

# 解析和应用查询
query = mc.query.parse("rule_of_five AND NOT common_alerts")
results = query.apply(mols=mol_list, n_jobs=-1)

工作流程模式

模式 1:化合物库的初始筛选

过滤大型化合物集合以识别药物样候选物。

import datamol as dm
import medchem as mc
import pandas as pd

# 加载化合物库
df = pd.read_csv("compounds.csv")
mols = [dm.to_mol(smi) for smi in df["smiles"]]

# 应用主要过滤器
rule_filter = mc.rules.RuleFilters(rule_list=["rule_of_five", "rule_of_veber"])
rule_results = rule_filter(mols=mols, n_jobs=-1, progress=True)

# 应用结构警报
alert_filter = mc.structural.CommonAlertsFilters()
alert_results = alert_filter(mols=mols, n_jobs=-1, progress=True)

# 合并结果
df["passes_rules"] = rule_results["pass"]
df["has_alerts"] = alert_results["has_alerts"]
df["drug_like"] = df["passes_rules"] & ~df["has_alerts"]

# 保存过滤后的化合物
filtered_df = df[df["drug_like"]]
filtered_df.to_csv("filtered_compounds.csv", index=False)

模式 2:先导优化过滤

在先导优化期间应用更严格的标准。

import medchem as mc

# 创建全面过滤器
filters = {
    "rules": mc.rules.RuleFilters(rule_list=["rule_of_leadlike_strict"]),
    "alerts": mc.structural.NIBRFilters(),
    "lilly": mc.structural.LillyDemeritsFilters(),
    "complexity": mc.complexity.ComplexityFilter(max_complexity=400)
}

# 应用所有过滤器
results = {}
for name, filt in filters.items():
    results[name] = filt(mols=candidate_mols, n_jobs=-1)

# 识别通过所有过滤器的化合物
passes_all = all(r["pass"] for r in results.values())

模式 3:识别特定化学基团

查找包含特定功能基团或支架的分子。

import medchem as mc

# 为多个基团创建基团检测器
group_detector = mc.groups.ChemicalGroup(
    groups=["hinge_binders", "phosphate_binders"]
)

# 筛选库
matches = group_detector.get_all_matches(mol_list)

# 过滤具有所需基团的分子
mol_with_groups = [mol for mol, match in zip(mol_list, matches) if match]

最佳实践

  1. 上下文重要:不要盲目应用过滤器。理解生物靶标和化学空间。
  2. 组合多个过滤器:使用规则、结构警报和领域知识一起做出更好决策。
  3. 使用并行化:对于大型数据集(>1000 分子),始终使用 n_jobs=-1 进行并行处理。
  4. 迭代细化:从广泛过滤器(Ro5)开始,然后根据需要应用更具体标准(CNS、先导样)。
  5. 记录过滤决策:跟踪哪些分子被过滤掉及原因,以实现可重复性。
  6. 验证结果:记住市售药物常违反标准过滤器—使用这些作为指南,而非绝对规则。
  7. 考虑前药:设计为前药的分子可能故意违反标准药物化学规则。

资源

references/api_guide.md

涵盖所有 medchem 模块的全面 API 参考,包括详细函数签名、参数和返回类型。

references/rules_catalog.md

可用规则、过滤器和警报的完整目录,包含描述、阈值和文献引用。

scripts/filter_molecules.py

用于批量过滤工作流程的生产就绪脚本。支持多种输入格式(CSV、SDF、SMILES)、可配置过滤器组合和详细报告。

使用:

python scripts/filter_molecules.py input.csv --rules rule_of_five,rule_of_cns --alerts nibr --output filtered.csv

文档

官方文档:https://medchem-docs.datamol.io/ GitHub 仓库:https://github.com/datamol-io/medchem