3. Python医疗数据处理环境搭建
医疗数据融合工程的第一步不是写模型,而是让数据“进得来、跑得动、可复现”。医疗数据通常分散在 HIS 的 Oracle、LIS 的 SQL Server、影像系统的 PACS 文件目录,以及各类 CSV/Excel 导出文件中,同时还要满足患者隐私保护与审计要求。因此本节搭建的环境需要同时解决四件事:Python 依赖隔离、交互式探索、跨机器一致性、以及到多种数据源的连接能力。
一、用 Anaconda 建立可复现的医疗数据环境
Anaconda 的价值在于把 Python 解释器、科学计算库和包管理工具打包在一起,避免医疗项目中常见的“同一份脚本在同事机器上跑不通”。建议不要直接使用 base 环境,而是为每个数据融合项目单独建环境,并把环境导出为文件纳入版本管理。
# 创建医疗数据融合专用环境,指定 Python 版本
conda create -n medfusion python=3.11 -y
conda activate medfusion
# 配置国内镜像可显著提升医疗专用库下载速度(示例)
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
conda config --set show_channel_urls yes
# 导出环境,供团队复现
conda env export --no-builds > environment.yml
# 他人复现:conda env create -f environment.yml
这里选择 Python 3.11 是因为主流医疗数据处理库(pandas、SQLAlchemy、PyDICOM 等)对其支持成熟。环境名 medfusion 只是示例命名,实际可按项目或科室命名,如 onc_fusion。导出时加 --no-builds 可去掉平台相关的构建号,提高跨操作系统复现成功率。
二、Jupyter:面向医疗数据的交互式探查
医疗数据字段多、缺失模式复杂,适合用 Jupyter Notebook 边看边处理。安装后建议注册为独立内核,避免与 base 环境混淆:
conda install -n medfusion jupyterlab ipykernel -y
python -m ipykernel install --user --name medfusion --display-name "Python (medfusion)"
启动 jupyter lab 后,在 Notebook 中先做一次“数据体检”,确认连接与编码是否正常。医疗数据常见 GBK/UTF-8 混杂、日期格式不统一,下面示例演示读取一份患者检验结果 CSV 并检查关键字段:
import pandas as pd
df = pd.read_csv("lab_results.csv", encoding="utf-8", dtype={"patient_id": str})
print(df.shape)
print(df[["patient_id", "test_code", "result_value", "report_time"]].head())
print(df.isna().mean().sort_values(ascending=False).head(8))
把 patient_id 显式读成字符串很关键:若被推断为整数,前导零会丢失,导致与 HIS 主索引对不上。缺失率排序则帮助判断哪些检验项目需要重点清洗。
三、Docker:让医疗数据处理环境跨机器一致
当数据融合任务需要交付到院内服务器或脱敏沙箱时,Docker 能保证“本地能跑、服务器也能跑”。推荐基于官方镜像构建,把依赖固化进镜像,而不是运行时临时安装。
FROM continuumio/miniconda3:latest
WORKDIR /app
COPY environment.yml .
RUN conda env create -f environment.yml && conda clean -afy
SHELL ["conda", "run", "-n", "medfusion", "/bin/bash", "-c"]
COPY . /app
CMD ["python", "pipeline.py"]
构建与运行示例:docker build -t medfusion:0.1 .,运行时通过挂载卷把数据目录映射进容器,并用环境变量传入数据库口令,避免把敏感信息写进镜像:
docker run --rm -v /data/his_export:/app/data \
-e DB_PASSWORD=****** medfusion:0.1
四、数据库连接:SQLAlchemy 统一多源入口
医疗数据源驱动各异,直接用各数据库原生驱动会让代码难以维护。推荐用 SQLAlchemy 的 Engine 统一管理连接,配合 pandas 读取。下面示例分别连接 PostgreSQL(示例为院内数据仓库)与 SQL Server(示例为 LIS):
from sqlalchemy import create_engine
import pandas as pd
pg = create_engine("postgresql+psycopg2://user:pwd@10.0.0.21:5432/clinical_dw")
mssql = create_engine(
"mssql+pyodbc://user:pwd@10.0.0.35/lis"
"?driver=ODBC+Driver+17+for+SQL+Server")
sql = "SELECT patient_id, test_code, result_value, report_time FROM lab_results WHERE report_time >= '2024-01-01'"
lab = pd.read_sql(sql, mssql)
print(lab.dtypes)
连接成功后应重点核对三件事:时间字段是否被解析为 datetime、数值字段是否混入“<0.05”这类带符号文本、患者标识是否与主索引类型一致。这三点直接决定后续融合能否对齐。
五、医疗专用库安装与验证
在通用库之外,医疗场景常需以下专用库,建议一次性安装并做导入验证:
pydicom:读写 DICOM 影像与元数据;SimpleITK:医学图像配准与重采样;hl7/python-hl7:解析 HL7 v2 消息;fhir.resources:校验 FHIR 资源结构;missingno:可视化医疗数据缺失模式。
conda install -n medfusion -c conda-forge pydicom simpleitk missingno -y
pip install hl7 fhir.resources
安装后执行一次导入自检,确认没有版本冲突:
import pydicom, SimpleITK, hl7, missingno
print(pydicom.__version__, SimpleITK.Version_VersionString())
若导入报错,优先检查是否在 medfusion 环境内执行,以及 conda 与 pip 是否混装同一库的不同版本。
六、环境自检清单
环境搭好后,建议按下面顺序做一次端到端自检,任何一步失败都先解决再进入数据融合:
| 检查项 | 命令/操作 | 通过判据 |
|---|---|---|
| 环境激活 | conda activate medfusion | 提示符显示 medfusion |
| 内核注册 | jupyter kernelspec list | 出现 Python (medfusion) |
| 数据库连通 | engine.connect() | 无异常,可执行 SELECT 1 |
| 医疗库导入 | import pydicom, SimpleITK | 无 ImportError |
| 容器构建 | docker build -t medfusion:0.1 . | 镜像构建成功 |
完成本节后,你应当拥有一个名为 medfusion 的隔离环境、一个可交互探查的 Jupyter 内核、一个可交付的 Docker 镜像,以及到 HIS/LIS 等数据源的可用连接。这套底座是后续多源数据清洗、对齐与融合的前提。