关于 ddinter-database
ddinter-database 是用于查询药物相互作用的数据库技能,面向药物安全评估与药物审查工作流。它通过免认证的 JSON REST API 提供相互作用严重程度、机制和临床管理建议。
主要功能
- 01按药名搜索并解析 DDInter ID
- 02查询单药或药物对的相互作用
- 03查看严重程度、机制及临床建议
- 04筛查药物清单中的相互作用
- 05构建药物相互作用网络
适用场景
- 01核查两种合用药物的相互作用及严重程度
- 02评估多药治疗方案的相互作用风险
- 03按严重程度筛选药物相互作用
- 04分析药物组的相互作用网络
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ jaechang-hits/ sciagent-skills --skill ddinter-database安装后在 Claude Code 中输入/ddinter-database确认已加载。
详细介绍
DDInter 药物-药物相互作用数据库
概述
DDInter 是一个开放且经过整理的药物-药物相互作用(DDI)数据库,涵盖 2,400 多种药物和 170 多万种成对相互作用,并提供结构化的严重程度分级(重大、中度、轻微)、机制注释和临床管理建议。可通过 https://ddinter.scbdd.com/api/ 上的 JSON REST API 访问,无需身份验证或注册。
适用场景
- 检查两种合用药物是否存在已知相互作用及其严重程度(重大/中度/轻微)
- 检索某种药物的所有已知相互作用,以支持多重用药风险评估
- 确定药物-药物相互作用的机制基础(药代动力学还是药效学)
- 在临床决策支持前筛查药物组合列表中的潜在重大相互作用
- 为用药审查或药物再利用工作流构建自动化 DDI 检查流程
- 分析某一药物类别的 DDI 网络(例如 CYP3A4 底物的所有重大相互作用)
- 如需 FDA 批准的药品标签文本(适应症、剂量、禁忌症),请使用
dailymed-database - 如需药物基因组学相互作用(CYP 基因型-药物关联),请使用
clinpgx-database;DDInter 涵盖药物-药物而非基因-药物配对 - 如需 FAERS 中的药物不良事件报告,请使用
fda-database
前置条件
- Python 软件包:
requests、pandas、matplotlib、networkx - 数据要求:药物名称或 DDInter 药物 ID
- 环境:需要互联网连接;无需 API 密钥
- 速率限制:未正式公布速率限制;批量循环请求时,请在请求之间使用
time.sleep(0.3),以礼貌地访问服务
pip install requests pandas matplotlib networkx
快速开始
import requests
BASE = "https://ddinter.scbdd.com/api"
# Search for a drug by name
r = requests.get(f"{BASE}/drug/", params={"drug_name": "warfarin", "format": "json"}, timeout=15)
r.raise_for_status()
data = r.json()
print(f"Results for 'warfarin': {data['count']} drugs found")
for drug in data["results"][:3]:
print(f" ID={drug['ddinter_id']} Name={drug['drug_name']}")
# Results for 'warfarin': 1 drugs found
# ID=DDInter_D00001 Name=Warfarin
核心 API
查询 1:按名称搜索药物
通过搜索药物名称查找其 DDInter ID。所有相互作用查询都需要 DDInter ID。
import requests
import pandas as pd
BASE = "https://ddinter.scbdd.com/api"
def search_drug(drug_name):
"""Search DDInter for a drug by name. Returns list of matching drug records."""
r = requests.get(f"{BASE}/drug/",
params={"drug_name": drug_name, "format": "json"},
timeout=15)
r.raise_for_status()
return r.json()
# Search for warfarin
result = search_drug("warfarin")
print(f"Matches: {result['count']}")
if result["results"]:
drug = result["results"][0]
print(f"DDInter ID: {drug['ddinter_id']}")
print(f"Drug name: {drug['drug_name']}")
# Store DDInter ID for interaction queries
warfarin_id = drug["ddinter_id"]
print(f"\nWarfarin DDInter ID: {warfarin_id}")
# Batch name lookup
drugs_to_find = ["warfarin", "aspirin", "atorvastatin", "metformin", "amiodarone"]
id_map = {}
for name in drugs_to_find:
res = search_drug(name)
if res["results"]:
id_map[name] = res["results"][0]["ddinter_id"]
print(f" {name:20s} → {res['results'][0]['ddinter_id']}")
查询 2:获取某种药物的所有相互作用
通过药物的 DDInter ID 检索其所有已知 DDI。返回相互作用药物、严重程度和临床信息。
import requests
import pandas as pd
BASE = "https://ddinter.scbdd.com/api"
def get_drug_interactions(drug_id, page_size=100):
"""Get all DDIs for a drug by DDInter ID. Handles pagination automatically."""
all_interactions = []
url = f"{BASE}/interaction/"
params = {"drug_id": drug_id, "format": "json", "page_size": page_size}
while url:
r = requests.get(url, params=params, timeout=20)
r.raise_for_status()
data = r.json()
all_interactions.extend(data.get("results", []))
url = data.get("next") # None when last page
params = {} # next URL already includes params
return all_interactions
# Get all interactions for warfarin (DDInter_D00001)
interactions = get_drug_interactions("DDInter_D00001")
print(f"Warfarin total interactions: {len(interactions)}")
# Summarize by severity
df = pd.DataFrame(interactions)
if not df.empty and "level" in df.columns:
severity_counts = df["level"].value_counts()
print("\nInteractions by severity:")
for level, count in severity_counts.items():
print(f" {level:15s}: {count:4d}")
# Major: 45
# Moderate: 312
# Minor: 198
查询 3:按相互作用 ID 获取相互作用详情
检索特定药物-药物相互作用的完整详情,包括作用机制和临床建议。
import requests
BASE = "https://ddinter.scbdd.com/api"
def get_interaction_detail(interaction_id):
"""Get full details for a specific interaction by its DDInter interaction ID."""
r = requests.get(f"{BASE}/interaction/{interaction_id}/",
params={"format": "json"},
timeout=15)
r.raise_for_status()
return r.json()
# Example interaction ID (format: DDInter_I_XXXXXX)
interaction_id = "DDInter_I_000001" # example
try:
detail = get_interaction_detail(interaction_id)
print(f"Interaction: {detail.get('interaction_id')}")
print(f"Drug A: {detail.get('drug_a')}")
print(f"Drug B: {detail.get('drug_b')}")
print(f"Severity: {detail.get('level')}")
print(f"Mechanism: {detail.get('mechanism', 'Not specified')[:200]}")
print(f"Recommendation: {detail.get('recommendation', 'Not specified')[:200]}")
print(f"PK type: {detail.get('pharmacokinetic_type', 'N/A')}")
print(f"PD type: {detail.get('pharmacodynamic_type', 'N/A')}")
except Exception as e:
print(f"Note: Use a valid interaction ID from get_drug_interactions() results. Error: {e}")
查询 4:检查两种特定药物之间的相互作用
使用两种药物的 DDInter ID 查询它们之间的相互作用。
import requests
BASE = "https://ddinter.scbdd.com/api"
def check_drug_pair(drug_id_1, drug_id_2):
"""Check interactions between two specific drugs by their DDInter IDs."""
r = requests.get(f"{BASE}/between/",
params={"drug1": drug_id_1, "drug2": drug_id_2, "format": "json"},
timeout=15)
r.raise_for_status()
return r.json()
def find_drug_id(drug_name):
"""Helper: resolve drug name to DDInter ID."""
r = requests.get(f"{BASE}/drug/",
params={"drug_name": drug_name, "format": "json"},
timeout=15)
r.raise_for_status()
results = r.json()["results"]
return results[0]["ddinter_id"] if results else None
# Check warfarin + aspirin interaction
warfarin_id = find_drug_id("warfarin")
aspirin_id = find_drug_id("aspirin")
if warfarin_id and aspirin_id:
interactions = check_drug_pair(warfarin_id, aspirin_id)
count = interactions.get("count", 0)
print(f"Warfarin + Aspirin: {count} interaction(s) found")
for ix in interactions.get("results", []):
print(f" Severity: {ix.get('level')}")
print(f" Mechanism: {ix.get('mechanism', 'N/A')[:200]}")
print(f" Recommendation: {ix.get('recommendation', 'N/A')[:200]}")
else:
print(f"Could not resolve drug IDs: warfarin={warfarin_id}, aspirin={aspirin_id}")
查询 5:按严重程度筛选相互作用
仅检索某种药物的高严重程度(重大)相互作用,这对于快速临床风险筛查至关重要。
import requests
import pandas as pd
BASE = "https://ddinter.scbdd.com/api"
def get_major_interactions(drug_id):
"""Get only major-severity interactions for a drug."""
all_interactions = []
r = requests.get(f"{BASE}/interaction/",
params={"drug_id": drug_id, "format": "json", "page_size": 200},
timeout=20)
r.raise_for_status()
data = r.json()
all_interactions.extend(data.get("results", []))
# Filter to major severity
major = [ix for ix in all_interactions
if ix.get("level", "").lower() == "major"]
return major
# Get major interactions for amiodarone (known high-interaction drug)
drug_id = "DDInter_D00023" # example amiodarone ID; resolve with search_drug()
major_ixs = get_major_interactions(drug_id)
print(f"Major interactions: {len(major_ixs)}")
if major_ixs:
df = pd.DataFrame(major_ixs)
# Show drug partners and mechanism type
for col in ["drug_a", "drug_b", "level", "pharmacokinetic_type"]:
if col in df.columns:
print(f" {col}: {df[col].value_counts().head(3).to_dict()}")
df.to_csv("amiodarone_major_interactions.csv", index=False)
print("Saved: amiodarone_major_interactions.csv")
查询 6:筛查药物列表中的多重用药相互作用
筛查用药列表中的所有成对重大和中度相互作用。
import requests
import time
import itertools
import pandas as pd
BASE = "https://ddinter.scbdd.com/api"
def find_drug_id(drug_name):
r = requests.get(f"{BASE}/drug/",
params={"drug_name": drug_name, "format": "json"},
timeout=15)
r.raise_for_status()
results = r.json()["results"]
return (results[0]["ddinter_id"], results[0]["drug_name"]) if results else (None, None)
def check_pair(id1, id2):
r = requests.get(f"{BASE}/between/",
params={"drug1": id1, "drug2": id2, "format": "json"},
timeout=15)
r.raise_for_status()
return r.json().get("results", [])
# Medication list to screen
medication_names = ["warfarin", "aspirin", "atorvastatin", "metformin", "amiodarone"]
# Resolve to DDInter IDs
id_map = {}
for name in medication_names:
ddid, resolved_name = find_drug_id(name)
if ddid:
id_map[name] = (ddid, resolved_name)
print(f" {name:20s} → {ddid}")
time.sleep(0.3)
# Check all pairs
flagged = []
for (n1, (id1, rn1)), (n2, (id2, rn2)) in itertools.combinations(id_map.items(), 2):
ixs = check_pair(id1, id2)
for ix in ixs:
level = ix.get("level", "unknown")
if level.lower() in ("major", "moderate"):
flagged.append({
"drug_1": rn1,
"drug_2": rn2,
"severity": level,
"mechanism": ix.get("mechanism", "")[:100],
})
time.sleep(0.3)
df = pd.DataFrame(flagged)
print(f"\nFlagged interactions: {len(df)}")
if not df.empty:
print(df.to_string(index=False))
df.to_csv("polypharmacy_screening.csv", index=False)
print("Saved: polypharmacy_screening.csv")
查询 7:可视化相互作用网络
为一组药物构建并可视化药物-药物相互作用网络,并按严重程度为边着色。
import requests
import time
import itertools
import pandas as pd
import networkx as nx
import matplotlib.pyplot as plt
BASE = "https://ddinter.scbdd.com/api"
def find_drug_id(drug_name):
r = requests.get(f"{BASE}/drug/",
params={"drug_name": drug_name, "format": "json"},
timeout=15)
r.raise_for_status()
results = r.json()["results"]
return (results[0]["ddinter_id"], results[0]["drug_name"]) if results else (None, None)
def check_pair(id1, id2):
r = requests.get(f"{BASE}/between/",
params={"drug1": id1, "drug2": id2, "format": "json"},
timeout=15)
r.raise_for_status()
return r.json().get("results", [])
SEVERITY_COLORS = {"major": "#D32F2F", "moderate": "#F57C00", "minor": "#388E3C"}
# Drug list
drugs = ["warfarin", "aspirin", "atorvastatin", "fluconazole", "amiodarone"]
id_map = {}
for name in drugs:
ddid, rname = find_drug_id(name)
if ddid:
id_map[name] = (ddid, rname)
time.sleep(0.3)
# Build network
G = nx.Graph()
for name, (ddid, rname) in id_map.items():
G.add_node(rname)
edge_colors = []
for (n1, (id1, rn1)), (n2, (id2, rn2)) in itertools.combinations(id_map.items(), 2):
ixs = check_pair(id1, id2)
for ix in ixs:
level = ix.get("level", "minor").lower()
G.add_edge(rn1, rn2, severity=level, weight=3 if level == "major" else 1)
time.sleep(0.3)
# Visualize
fig, ax = plt.subplots(figsize=(9, 7))
pos = nx.spring_layout(G, seed=42, k=2)
for level, color in SEVERITY_COLORS.items():
edges = [(u, v) for u, v, d in G.edges(data=True) if d.get("severity") == level]
if edges:
width = 4 if level == "major" else 2
nx.draw_networkx_edges(G, pos, edgelist=edges, edge_color=color, width=width, alpha=0.8, ax=ax)
nx.draw_networkx_nodes(G, pos, node_color="#1565C0", node_size=1200, alpha=0.9, ax=ax)
nx.draw_networkx_labels(G, pos, font_color="white", font_size=8, font_weight="bold", ax=ax)
# Legend
from matplotlib.patches import Patch
legend = [Patch(color=c, label=l.capitalize()) for l, c in SEVERITY_COLORS.items()]
ax.legend(handles=legend, title="Severity", loc="upper right")
ax.set_title("Drug-Drug Interaction Network\n(DDInter)")
ax.axis("off")
plt.tight_layout()
plt.savefig("ddi_network.png", dpi=150, bbox_inches="tight")
print(f"Saved: ddi_network.png ({G.number_of_nodes()} drugs, {G.number_of_edges()} interactions)")
关键概念
严重程度分类
DDInter 依据公认的临床药理学标准,将相互作用分为三个严重程度级别:
| 严重程度 | 代码 | 临床含义 | 应对措施 |
|---|---|---|---|
| 重大 | major | 可能危及生命或造成永久性损害 | 避免合用;改用替代药物 |
| 中度 | moderate | 可能导致临床状况恶化;需要加强监测 | 谨慎使用;密切监测 |
| 轻微 | minor | 临床影响有限;虽有记录,但很少造成显著影响 | 通常安全;如出现症状则进行监测 |
作用机制类型
相互作用按机制分类:
- 药代动力学(PK):一种药物影响另一种药物的吸收、分布、代谢或排泄(ADME)(例如,抑制 CYP 酶)
- 药效学(PD):药物在药理学靶点层面产生相加、协同或拮抗作用(例如,出血风险增加)
- 混合型:药代动力学和药效学机制均有影响
药物识别
DDInter 使用自有的顺序标识符方案(例如,华法林的标识符为 DDInter_D00001)。在事先搜索名称之前,无法直接映射到 ChEMBL ID、PubChem CID 或 RxCUI。查询相互作用之前,务必先使用 /drug/ 端点将药物名称解析为 DDInter ID。
常见工作流
工作流 1:获取药物的全面 DDI 概况
目标:检索某种药物的所有相互作用,按严重程度分类,并导出结构化报告。
import requests
import time
import pandas as pd
BASE = "https://ddinter.scbdd.com/api"
def find_drug_id(name):
r = requests.get(f"{BASE}/drug/",
params={"drug_name": name, "format": "json"},
timeout=15)
r.raise_for_status()
res = r.json()["results"]
return (res[0]["ddinter_id"], res[0]["drug_name"]) if res else (None, None)
def get_all_interactions(drug_id, page_size=200):
all_results = []
url = f"{BASE}/interaction/"
params = {"drug_id": drug_id, "format": "json", "page_size": page_size}
while url:
r = requests.get(url, params=params, timeout=30)
r.raise_for_status()
data = r.json()
all_results.extend(data.get("results", []))
url = data.get("next")
params = {}
return all_results
# Build DDI profile for clopidogrel
drug_name = "clopidogrel"
drug_id, resolved_name = find_drug_id(drug_name)
if drug_id:
print(f"Drug: {resolved_name} ({drug_id})")
ixs = get_all_interactions(drug_id)
df = pd.DataFrame(ixs)
print(f"Total interactions: {len(df)}")
if "level" in df.columns:
print("\nSeverity breakdown:")
for level, grp in df.groupby("level"):
print(f" {level:15s}: {len(grp):4d} interactions")
# Major interactions table
major = df[df["level"].str.lower() == "major"].copy()
print(f"\nMajor interactions ({len(major)}):")
for _, row in major.head(10).iterrows():
partner = row.get("drug_b") if row.get("drug_a") == resolved_name else row.get("drug_a")
mech = str(row.get("mechanism", ""))[:80]
print(f" + {partner}: {mech}")
df.to_csv(f"{drug_name}_ddi_profile.csv", index=False)
print(f"\nSaved: {drug_name}_ddi_profile.csv")
工作流 2:药物面板的两两相互作用矩阵
目标:构建严重程度矩阵,展示精选药物面板中所有药物两两之间的相互作用,适用于临床药理学和药品目录审核。
import requests
import time
import itertools
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
BASE = "https://ddinter.scbdd.com/api"
SEVERITY_SCORE = {"major": 3, "moderate": 2, "minor": 1, "none": 0}
def find_drug_id(name):
r = requests.get(f"{BASE}/drug/",
params={"drug_name": name, "format": "json"},
timeout=15)
r.raise_for_status()
res = r.json()["results"]
return (res[0]["ddinter_id"], res[0]["drug_name"]) if res else (None, None)
def check_pair(id1, id2):
r = requests.get(f"{BASE}/between/",
params={"drug1": id1, "drug2": id2, "format": "json"},
timeout=15)
r.raise_for_status()
return r.json().get("results", [])
# Drug panel
drug_names = ["warfarin", "aspirin", "atorvastatin", "fluconazole", "metformin"]
id_map = {}
for name in drug_names:
ddid, rname = find_drug_id(name)
if ddid:
id_map[name] = (ddid, rname)
time.sleep(0.3)
resolved = {name: rname for name, (ddid, rname) in id_map.items()}
n = len(id_map)
names = list(id_map.keys())
rnames = [resolved[n] for n in names]
# Build matrix
matrix = np.zeros((n, n), dtype=int)
for i, (n1, (id1, _)) in enumerate(id_map.items()):
for j, (n2, (id2, _)) in enumerate(id_map.items()):
if i < j:
ixs = check_pair(id1, id2)
if ixs:
worst = max(SEVERITY_SCORE.get(ix.get("level", "none").lower(), 0) for ix in ixs)
matrix[i, j] = matrix[j, i] = worst
time.sleep(0.3)
# Heatmap
fig, ax = plt.subplots(figsize=(7, 6))
im = ax.imshow(matrix, cmap="RdYlGn_r", vmin=0, vmax=3)
ax.set_xticks(range(n))
ax.set_yticks(range(n))
ax.set_xticklabels(rnames, rotation=30, ha="right", fontsize=9)
ax.set_yticklabels(rnames, fontsize=9)
for i in range(n):
for j in range(n):
text = ["None", "Minor", "Mod", "Major"][matrix[i, j]]
ax.text(j, i, text, ha="center", va="center", fontsize=7)
plt.colorbar(im, ax=ax, label="Severity (0=None, 3=Major)")
ax.set_title("Drug-Drug Interaction Severity Matrix\n(DDInter)")
plt.tight_layout()
plt.savefig("ddi_severity_matrix.png", dpi=150, bbox_inches="tight")
print("Saved: ddi_severity_matrix.png")
关键参数
| 参数 | 端点 | 默认值 | 范围 / 选项 | 作用 |
|---|---|---|---|---|
drug_name | /drug/ | — | 任意药物名称字符串 | 用于查询药物名称的搜索词 |
drug_id | /interaction/ | — | DDInter_DXXXXX 字符串 | 用于查询相互作用的 DDInter 药物 ID |
drug1、drug2 | /between/ | — | DDInter_DXXXXX 字符串 | 检查特定药物对时两者均为必填项 |
format | 所有端点 | json | json | 响应格式;API 仅支持 JSON |
page_size | /interaction/、/drug/ | 10 | 正整数 | 每页结果数;批量检索时使用 200 |
level | 响应字段 | — | major、moderate、minor | 相互作用严重程度;在客户端筛选 |
pharmacokinetic_type | 响应字段 | — | PK、PD、mixed | 作用机制类别 |
最佳实践
-
务必先将药物名称解析为 DDInter ID:API 不接受在相互作用查询中使用自由文本药物名称。使用
/drug/?drug_name=获取ddinter_id,然后将其传递给/interaction/或/between/。 -
处理分页以获取完整的相互作用列表:默认页面最多返回 10 条结果。华法林或胺碘酮等药物有数百种相互作用——持续遍历
nextURL,直到其值为null:while url: data = requests.get(url, params=params).json() results.extend(data["results"]) url = data.get("next") params = {} # clear params after first request -
单项查询使用
check_pair(),完整概况使用get_interactions():只需查询一对药物时,/between/端点速度更快。全面分析 DDI 概况则需要使用/interaction/端点。 -
在批量循环中添加
time.sleep(0.3):DDInter 未公布速率限制,但适当延迟可避免这个公开托管的研究数据库在服务器端进行限流。 -
在客户端按严重程度筛选:API 不支持在
/interaction/端点进行服务端严重程度筛选。请检索所有相互作用,然后使用 pandas 筛选:df = pd.DataFrame(interactions) major_only = df[df["level"].str.lower() == "major"] -
与临床数据库交叉参考,以支持决策:DDInter 提供基于证据的相互作用记录,但对于临床决策,务必使用
dailymed-database中最新的处方信息和机构药物相互作用工具进行核实。
常见用法
用法:快速检查一对药物的安全性
适用场景:合用两种药物前,快速查询单对药物之间的相互作用。
import requests
BASE = "https://ddinter.scbdd.com/api"
def quick_check(drug1_name, drug2_name):
"""Check interaction between two drugs by name. Returns severity or 'No interaction found'."""
def get_id(name):
r = requests.get(f"{BASE}/drug/",
params={"drug_name": name, "format": "json"},
timeout=15)
r.raise_for_status()
results = r.json()["results"]
return (results[0]["ddinter_id"], results[0]["drug_name"]) if results else (None, name)
id1, rn1 = get_id(drug1_name)
id2, rn2 = get_id(drug2_name)
if not id1 or not id2:
return f"Drug not found: {drug1_name if not id1 else drug2_name}"
r = requests.get(f"{BASE}/between/",
params={"drug1": id1, "drug2": id2, "format": "json"},
timeout=15)
r.raise_for_status()
ixs = r.json().get("results", [])
if not ixs:
return f"{rn1} + {rn2}: No interaction found in DDInter"
worst = max(ixs, key=lambda x: {"major": 3, "moderate": 2, "minor": 1}.get(x.get("level", "minor").lower(), 0))
return f"{rn1} + {rn2}: {worst.get('level', 'unknown').upper()} — {worst.get('mechanism', 'N/A')[:120]}"
print(quick_check("warfarin", "aspirin"))
print(quick_check("metformin", "atorvastatin"))
print(quick_check("warfarin", "fluconazole"))
用法:统计多种药物按严重程度划分的相互作用数量
适用场景:生成汇总表,比较多种药物的 DDI 负担。
import requests
import time
import pandas as pd
BASE = "https://ddinter.scbdd.com/api"
def get_severity_summary(drug_name):
"""Return severity counts (major/moderate/minor) for a drug."""
r = requests.get(f"{BASE}/drug/",
params={"drug_name": drug_name, "format": "json"},
timeout=15)
r.raise_for_status()
results = r.json()["results"]
if not results:
return None
drug_id = results[0]["ddinter_id"]
# Get all interactions
all_ixs = []
url = f"{BASE}/interaction/"
params = {"drug_id": drug_id, "format": "json", "page_size": 200}
while url:
r2 = requests.get(url, params=params, timeout=20)
r2.raise_for_status()
data = r2.json()
all_ixs.extend(data.get("results", []))
url = data.get("next")
params = {}
from collections import Counter
counts = Counter(ix.get("level", "unknown").lower() for ix in all_ixs)
return {
"drug": results[0]["drug_name"],
"total": len(all_ixs),
"major": counts.get("major", 0),
"moderate": counts.get("moderate", 0),
"minor": counts.get("minor", 0),
}
drugs = ["warfarin", "amiodarone", "metformin", "atorvastatin"]
records = []
for name in drugs:
summary = get_severity_summary(name)
if summary:
records.append(summary)
print(f" {name:20s} total={summary['total']:4d} major={summary['major']:3d} mod={summary['moderate']:3d} minor={summary['minor']:3d}")
time.sleep(0.5)
df = pd.DataFrame(records)
df = df.sort_values("major", ascending=False)
df.to_csv("ddi_severity_summary.csv", index=False)
print(f"\nSaved: ddi_severity_summary.csv")
用法:导出药物列表中的所有主要相互作用
适用场景:为药品目录审核或临床决策支持构建按优先级排序的相互作用警报列表。
import requests
import time
import pandas as pd
BASE = "https://ddinter.scbdd.com/api"
drug_list = ["warfarin", "aspirin", "clopidogrel", "amiodarone", "fluconazole"]
all_major = []
for drug_name in drug_list:
r = requests.get(f"{BASE}/drug/",
params={"drug_name": drug_name, "format": "json"}, timeout=15)
r.raise_for_status()
res = r.json()["results"]
if not res:
continue
drug_id, resolved = res[0]["ddinter_id"], res[0]["drug_name"]
r2 = requests.get(f"{BASE}/interaction/",
params={"drug_id": drug_id, "format": "json", "page_size": 200}, timeout=30)
r2.raise_for_status()
for ix in r2.json().get("results", []):
if ix.get("level", "").lower() == "major":
all_major.append({
"query_drug": resolved,
"interaction_partner": ix.get("drug_a") if ix.get("drug_b") == resolved else ix.get("drug_b"),
"severity": "major",
"mechanism": str(ix.get("mechanism", ""))[:200],
"recommendation": str(ix.get("recommendation", ""))[:200],
})
time.sleep(0.5)
df = pd.DataFrame(all_major).drop_duplicates()
print(f"Total major interactions across {len(drug_list)} drugs: {len(df)}")
df.to_csv("major_interactions_alert_list.csv", index=False)
print("Saved: major_interactions_alert_list.csv")
故障排查
| 问题 | 原因 | 解决方案 |
|---|---|---|
/interaction/ 返回 404 Not Found | DDInter 药物 ID 无效或格式错误 | 重新查询 /drug/?drug_name= 以获取有效 ID;格式必须为 DDInter_DXXXXX |
/drug/ 搜索返回 count: 0 | 药物名称与 DDInter 命名法不匹配 | 尝试使用 INN 名称(例如,使用 "acetylsalicylic acid" 而非 "aspirin");尝试使用部分名称 |
| 相互作用列表不完整 | 默认的 page_size=10 截断了结果 | 将 page_size=200,并迭代 next URL,直到值为 null |
/between/ 返回空结果 | 该药物对在 DDInter 中没有经整理的相互作用 | 不存在不代表没有相互作用——请检查 dailymed-database 的标签文本 |
出现 ConnectionError 或超时 | 服务暂时不可用 | 使用 timeout=30 重试;批量请求时采用指数退避 |
| 批量导出中出现重复相互作用 | 同一相互作用分别从两种药物的角度出现 | 按字母顺序排列药物 ID 后,依据 (drug_a, drug_b) 药物对去重 |
出现 JSONDecodeError | 服务返回了非 JSON 错误页面 | 检查 HTTP 状态码;解析前调用 r.raise_for_status() |
相关技能
dailymed-database— FDA 批准的药品标签文本,包含药物相互作用部分(非结构化)fda-database— openFDA 不良事件报告和药物召回数据drugbank-database-access— DrugBank 本地 XML,包含结构化的 DDI 和靶点数据clinpgx-database— PharmGKB 药物-基因(药物基因组学)相互作用数据pytdc-therapeutics-data-commons— 用于 ML 模型训练的 TDC DDI 基准数据集
参考资料
- DDInter 数据库 — 官方 Web 界面和文档
- DDInter REST API — 可浏览的 API,包含端点文档
- Xiong 等人,《Nucleic Acids Research》,2022 — DDInter 数据库论文,介绍整理方法、数据来源和覆盖范围
- WHO INN 药物名称 — 用于解析药物名称变体的国际非专利药品名称