Python使用Medical Information Dataset实战2025.07版(上)
Python使用Medical Information Dataset实战2025.07版(全流程)
药物信息处理作为精准医疗体系的核心环节,其数据质量直接影响临床决策安全性与治疗方案有效性。在实际应用中,药物名称歧义现象(如通用名与商品名混淆、国际非专利名称(INN)翻译差异)和适应症文本的非结构化特征(如电子病历中自由文本记录),常导致临床信息提取偏差,增加用药错误风险。据统计,约 30% 的临床决策延误与药物信息处理不当直接相关,凸显该领域标准化处理的紧迫性。
现有药物信息处理工具存在显著场景适应性缺陷:传统 Python 脚本虽具备灵活的数据处理能力,但需使用者掌握复杂的编程语法,在非技术背景的医疗团队中普及率不足 20%;传统 BI 工具虽提供可视化界面,但多聚焦于静态数据展示,缺乏针对药物信息动态检索(如实时相互作用查询)和多维度分类(如按治疗领域、不良反应等级)的专业功能模块,难以满足临床场景下的即时决策需求。
构建医疗专用可视化操作界面,通过整合自然语言处理(NLP)技术与交互式数据可视化组件,实现药物信息的一站式处理流程。该界面将支持三大核心功能:结构化解析非标准药物文本数据、构建动态更新的药物知识图谱检索系统、开发基于机器学习模型的适应症自动分类工具。这种轻量化、模块化的设计不仅降低操作门槛,使临床人员无需编程基础即可完成复杂数据处理任务,更通过实时交互反馈机制提升决策效率,为精准医疗场景下的药物信息管理提供技术范式创新。
1) 环境与工程模板
# 建议使用 Python 3.10+
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activatepip install -U pandas pyarrow polars[all] numpy scikit-learn imbalanced-learn lightgbm \rapidfuzz[full] sentence-transformers faiss-cpu \pydantic[dotenv] python-dotenv rich tqdm matplotlib \nltk spacy
python -m nltk.downloader stopwords wordnet punkt
python -m spacy download en_core_web_sm
目录建议:
mid_project/├── data/ # 放 MID 原始与中间数据├── notebooks/ # 交互式探索├── src/│ ├── config.py│ ├── io_utils.py│ ├── text_clean.py│ ├── labeling.py│ ├── train_baseline.py│ └── retrieve.py└── .env # 可存放数据路径等私密配置
.env
示例:
MID_DATA_DIR=./data
MID_MAIN_FILE=./data/mid_main.parquet
2) 典型数据字段(示例假设)
由于不同发布版本/镜像字段可能不同,这里给出最常见的列名映射,你按实际情况替换即可:
drug_id
:药品唯一 IDdrug_name
:通用名/商品名indications
:适应症文本description
:药品描述atc_codes
:ATC 码(可能多值,分号/逗号分隔)therapeutic_class
:治疗类别(44 类之一;可能多标签)side_effects
:不良反应文本contraindications
:禁忌文本labels
:官方标签/治疗标签(多标签)
如果你手里是 CSV/JSON/Parquet,只需要对应到这些语义即可。
3) 读取与快速体检(CSV/Parquet/JSON 通吃)
import os
import pandas as pd
from dotenv import load_dotenv
load_dotenv()DATA = os.getenv("MID_MAIN_FILE", "./data/mid_main.parquet")def load_mid(path: str) -> pd.DataFrame:if path.endswith(".parquet"):df = pd.read_parquet(path)elif path.endswith(".csv"):df = pd.read_csv(path)elif path.endswith(".json") or path.endswith(".jsonl"):df = pd.read_json(path, lines=path.endswith(".jsonl"))else:raise ValueError("Unsupported file format.")return dfdf = load_mid(DATA)
print(df.shape)
print(df.head(3))
print(df.isna().mean().sort_values(ascending=False).head(10))
小贴士:
- 大表优先用 Parquet(读写更快、类型稳定)。
- 若文本很长,确认
dtype='string'
,避免被当作object
导致内存浪费。
4) 文本清洗与标准化
目标:规范大小写、去噪、统一分隔、去重、拼写轻纠正、实体/术语归一(如 ATC/UMLS 对齐)。
import re
import pandas as pd
from rapidfuzz import process, fuzz
import spacy, nltk
from nltk.corpus import stopwordsnlp = spacy.load("en_core_web_sm")
STOP = set(stopwords.words('english'))def normalize_multilabel(col: pd.Series) -> pd.Series:# 把 "A; B, C" → ["a","b","c"] 的标准多值列def parse(x):if pd.isna(x): return []parts = re.split(r"[;,|/]+", str(x))return sorted({p.strip().lower() for p in parts if p.strip()})return col.apply(parse)def clean_text(s: str) -> str:if pd.isna(s)