mcpField
F
fda-database

fda-database

github.com/ovachiever数据与数据库5651 次安装48 周前更新
代码仓库

关于 fda-database

通过 openFDA 查询 FDA 监管数据的 Python Skill,统一访问药品、医疗器械、食品、兽医产品和物质数据,并提供安全性与监管分析示例。

主要功能

  1. 01统一查询多类 FDA 数据
  2. 02药品与器械安全研究
  3. 03召回和执法行动监测
  4. 04物质及标识符查询
  5. 05内置缓存与速率限制
  6. 06分页与重试处理

适用场景

  1. 01分析药品不良事件模式
  2. 02监测器械召回和许可信息
  3. 03追踪食品召回与过敏原问题
  4. 04比较产品安全记录

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/ovachiever/droid-tings --skill fda-database

安装后在 Claude Code 中输入/fda-database确认已加载。

包含的文件

除 SKILL.md 外,安装时一起下载的参考资料和脚本。

references/
animal_veterinary.md
api_basics.md
devices.md
drugs.md
foods.md
other.md
scripts/
fda_examples.py
fda_query.py

详细介绍

FDA 数据库访问

概述

通过 openFDA 访问全面的 FDA 监管数据,openFDA 是 FDA 为公共数据集提供开放 API 的倡议。使用 Python 和标准化接口,查询有关药品、医疗器械、食品、动物/兽医产品以及物质的信息。

核心能力:

  • 查询药品、器械、食品和兽医产品的不良事件
  • 访问产品标签、批准信息和监管申报资料
  • 监控召回和执法行动
  • 查询国家药品代码(NDC)和物质标识符(UNII)
  • 分析器械分类和许可(510k、PMA)
  • 追踪药品短缺和供应问题
  • 研究化学结构和物质关系

何时使用本技能

本技能适用于以下场景:

  • 药品研究:安全性概况、不良事件、标签、批准、短缺
  • 医疗器械监测:不良事件、召回、510(k) 许可、PMA 批准
  • 食品安全:召回、过敏原追踪、不良事件、膳食补充剂
  • 兽医医学:按物种和品种划分的动物药品不良事件
  • 化学/物质数据:UNII 查询、CAS 号映射、分子结构
  • 监管分析:批准路径、执法行动、合规追踪
  • 药物警戒:上市后监测、安全信号检测
  • 科学研究:药物相互作用、比较安全性、流行病学研究

快速开始

1. 基本设置
from scripts.fda_query import FDAQuery

# Initialize (API key optional but recommended)
fda = FDAQuery(api_key="YOUR_API_KEY")

# Query drug adverse events
events = fda.query_drug_events("aspirin", limit=100)

# Get drug labeling
label = fda.query_drug_label("Lipitor", brand=True)

# Search device recalls
recalls = fda.query("device", "enforcement",
                   search="classification:Class+I",
                   limit=50)
2. API 密钥设置

虽然无需密钥即可使用 API,但注册后可获得更高的速率限制:

  • 无密钥:240 次请求/分钟,1,000 次/天
  • 有密钥:240 次请求/分钟,120,000 次/天

注册地址:https://open.fda.gov/apis/authentication/

设置为环境变量:

export FDA_API_KEY="your_key_here"
3. 运行示例
# Run comprehensive examples
python scripts/fda_examples.py

# This demonstrates:
# - Drug safety profiles
# - Device surveillance
# - Food recall monitoring
# - Substance lookup
# - Comparative drug analysis
# - Veterinary drug analysis

FDA 数据库类别

药品

访问 6 个与药品相关的端点,覆盖从批准到上市后监测的完整药品生命周期。

端点:

  1. 不良事件 - 副作用、错误和治疗失败报告
  2. 产品标签 - 处方信息、警告、适应症
  3. NDC 目录 - 国家药品代码产品信息
  4. 执法报告 - 药品召回和安全行动
  5. Drugs@FDA - 自 1939 年以来的历史批准数据
  6. 药品短缺 - 当前和已解决的供应问题

常见用例:

# Safety signal detection
fda.count_by_field("drug", "event",
                  search="patient.drug.medicinalproduct:metformin",
                  field="patient.reaction.reactionmeddrapt")

# Get prescribing information
label = fda.query_drug_label("Keytruda", brand=True)

# Check for recalls
recalls = fda.query_drug_recalls(drug_name="metformin")

# Monitor shortages
shortages = fda.query("drug", "drugshortages",
                     search="status:Currently+in+Shortage")

参考: 详细文档见 references/drugs.md

器械

访问 9 个与器械相关的端点,覆盖医疗器械安全性、批准和注册信息。

端点:

  1. 不良事件 - 器械故障、伤害、死亡
  2. 510(k) 许可 - 上市前通知
  3. 分类 - 器械类别和风险等级
  4. 执法报告 - 器械召回
  5. 召回 - 详细召回信息
  6. PMA - III 类器械的上市前批准数据
  7. 注册与列名 - 生产设施数据
  8. UDI - 唯一器械标识数据库
  9. COVID-19 血清学 - 抗体检测性能数据

常见用例:

# Monitor device safety
events = fda.query_device_events("pacemaker", limit=100)

# Look up device classification
classification = fda.query_device_classification("DQY")

# Find 510(k) clearances
clearances = fda.query_device_510k(applicant="Medtronic")

# Search by UDI
device_info = fda.query("device", "udi",
                       search="identifiers.id:00884838003019")

参考: 详细文档见 references/devices.md

食品

访问 2 个与食品相关的端点,用于安全监测和召回。

端点:

  1. 不良事件 - 食品、膳食补充剂和化妆品事件
  2. 执法报告 - 食品产品召回

常见用例:

# Monitor allergen recalls
recalls = fda.query_food_recalls(reason="undeclared peanut")

# Track dietary supplement events
events = fda.query_food_events(
    industry="Dietary Supplements")

# Find contamination recalls
listeria = fda.query_food_recalls(
    reason="listeria",
    classification="I")

参考: 详细文档见 references/foods.md

动物与兽医

访问兽医药品不良事件数据,包含特定物种信息。

端点:

  1. 不良事件 - 按物种、品种和产品划分的动物药品副作用

常见用例:

# Species-specific events
dog_events = fda.query_animal_events(
    species="Dog",
    drug_name="flea collar")

# Breed predisposition analysis
breed_query = fda.query("animalandveterinary", "event",
    search="reaction.veddra_term_name:*seizure*+AND+"
           "animal.breed.breed_component:*Labrador*")

参考: 详细文档见 references/animal_veterinary.md

物质及其他

使用 UNII 代码、化学结构及关系访问分子级别的物质数据。

端点:

  1. 物质数据 - UNII、CAS、化学结构、关系
  2. NSDE - 历史物质数据(旧版)

常见用例:

# UNII to CAS mapping
substance = fda.query_substance_by_unii("R16CO5Y76E")

# Search by name
results = fda.query_substance_by_name("acetaminophen")

# Get chemical structure
structure = fda.query("other", "substance",
    search="names.name:ibuprofen+AND+substanceClass:chemical")

参考: 详见 references/other.md 获取详细文档

常见查询模式

模式 1:安全性档案分析

创建结合多个数据源的全面安全性档案:

def drug_safety_profile(fda, drug_name):
    """Generate complete safety profile."""

    # 1. Total adverse events
    events = fda.query_drug_events(drug_name, limit=1)
    total = events["meta"]["results"]["total"]

    # 2. Most common reactions
    reactions = fda.count_by_field(
        "drug", "event",
        search=f"patient.drug.medicinalproduct:*{drug_name}*",
        field="patient.reaction.reactionmeddrapt",
        exact=True
    )

    # 3. Serious events
    serious = fda.query("drug", "event",
        search=f"patient.drug.medicinalproduct:*{drug_name}*+AND+serious:1",
        limit=1)

    # 4. Recent recalls
    recalls = fda.query_drug_recalls(drug_name=drug_name)

    return {
        "total_events": total,
        "top_reactions": reactions["results"][:10],
        "serious_events": serious["meta"]["results"]["total"],
        "recalls": recalls["results"]
    }
模式 2:时间趋势分析

使用日期范围分析随时间变化的趋势:

from datetime import datetime, timedelta

def get_monthly_trends(fda, drug_name, months=12):
    """Get monthly adverse event trends."""
    trends = []

    for i in range(months):
        end = datetime.now() - timedelta(days=30*i)
        start = end - timedelta(days=30)

        date_range = f"[{start.strftime('%Y%m%d')}+TO+{end.strftime('%Y%m%d')}]"
        search = f"patient.drug.medicinalproduct:*{drug_name}*+AND+receivedate:{date_range}"

        result = fda.query("drug", "event", search=search, limit=1)
        count = result["meta"]["results"]["total"] if "meta" in result else 0

        trends.append({
            "month": start.strftime("%Y-%m"),
            "events": count
        })

    return trends
模式 3:对比分析

并排比较多个产品:

def compare_drugs(fda, drug_list):
    """Compare safety profiles of multiple drugs."""
    comparison = {}

    for drug in drug_list:
        # Total events
        events = fda.query_drug_events(drug, limit=1)
        total = events["meta"]["results"]["total"] if "meta" in events else 0

        # Serious events
        serious = fda.query("drug", "event",
            search=f"patient.drug.medicinalproduct:*{drug}*+AND+serious:1",
            limit=1)
        serious_count = serious["meta"]["results"]["total"] if "meta" in serious else 0

        comparison[drug] = {
            "total_events": total,
            "serious_events": serious_count,
            "serious_rate": (serious_count/total*100) if total > 0 else 0
        }

    return comparison
模式 4:跨数据库查询

跨多个端点链接数据:

def comprehensive_device_lookup(fda, device_name):
    """Look up device across all relevant databases."""

    return {
        "adverse_events": fda.query_device_events(device_name, limit=10),
        "510k_clearances": fda.query_device_510k(device_name=device_name),
        "recalls": fda.query("device", "enforcement",
                           search=f"product_description:*{device_name}*"),
        "udi_info": fda.query("device", "udi",
                            search=f"brand_name:*{device_name}*")
    }

处理结果

响应结构

所有 API 响应遵循以下结构:

{
    "meta": {
        "disclaimer": "...",
        "results": {
            "skip": 0,
            "limit": 100,
            "total": 15234
        }
    },
    "results": [
        # Array of result objects
    ]
}
错误处理

始终处理潜在错误:

result = fda.query_drug_events("aspirin", limit=10)

if "error" in result:
    print(f"Error: {result['error']}")
elif "results" not in result or len(result["results"]) == 0:
    print("No results found")
else:
    # Process results
    for event in result["results"]:
        # Handle event data
        pass
分页

对于较大的结果集,使用分页:

# Automatic pagination
all_results = fda.query_all(
    "drug", "event",
    search="patient.drug.medicinalproduct:aspirin",
    max_results=5000
)

# Manual pagination
for skip in range(0, 1000, 100):
    batch = fda.query("drug", "event",
                     search="...",
                     limit=100,
                     skip=skip)
    # Process batch

最佳实践

1. 使用精确搜索

推荐:

# Specific field search
search="patient.drug.medicinalproduct:aspirin"

不推荐:

# Overly broad wildcard
search="*aspirin*"
2. 实施速率限制

FDAQuery 类会自动处理速率限制,但请注意以下限制:

  • 每分钟 240 次请求
  • 每天 120,000 次请求(使用 API 密钥)
3. 缓存频繁访问的数据

FDAQuery 类包含内置缓存(默认启用):

# Caching is automatic
fda = FDAQuery(api_key=api_key, use_cache=True, cache_ttl=3600)
4. 使用精确匹配进行计数

在进行计数/聚合时,使用 .exact 后缀:

# Count exact phrases
fda.count_by_field("drug", "event",
                  search="...",
                  field="patient.reaction.reactionmeddrapt",
                  exact=True)  # Adds .exact automatically
5. 验证输入数据

清理并验证搜索词:

def clean_drug_name(name):
    """Clean drug name for query."""
    return name.strip().replace('"', '\\"')

drug_name = clean_drug_name(user_input)

API 参考

有关以下内容的详细信息:

  • 身份验证和速率限制 → 参见 references/api_basics.md
  • 药品数据库 → 参见 references/drugs.md
  • 器械数据库 → 参见 references/devices.md
  • 食品数据库 → 参见 references/foods.md
  • 动物/兽医数据库 → 参见 references/animal_veterinary.md
  • 物质数据库 → 参见 references/other.md

脚本

scripts/fda_query.py

主查询模块,包含 FDAQuery 类,提供:

  • 所有 FDA 端点的统一接口
  • 自动速率限制和缓存
  • 错误处理和重试逻辑
  • 常见查询模式
scripts/fda_examples.py

综合示例,演示:

  • 药品安全性档案分析
  • 器械监测监控
  • 食品召回跟踪
  • 物质查询
  • 药品对比分析
  • 兽药分析

运行示例:

python scripts/fda_examples.py

其他资源

支持与故障排除

常见问题

问题:超出速率限制

  • 解决方案:使用 API 密钥、实施延迟或降低请求频率

问题:未找到结果

  • 解决方案:尝试更宽泛的搜索词、检查拼写、使用通配符

问题:无效的查询语法

  • 解决方案:查看 references/api_basics.md 中的查询语法

问题:结果中缺少字段

  • 解决方案:并非所有记录都包含所有字段;始终检查字段是否存在
获取帮助

评论

支持 Markdown