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 是否混装同一库的不同版本。

医疗数据融合环境:从数据源到可复现分析 HIS / 数据仓库 PostgreSQL 示例 LIS 检验系统 SQL Server 示例 PACS 影像 DICOM 文件目录 导出文件 CSV / Excel 连接与读取 SQLAlchemy Engine psycopg2 / pyodbc pandas.read_sql pydicom 读取 编码/类型校验 Anaconda 环境 medfusion Python 3.11 · 依赖隔离 environment.yml 复现 conda + pip 安装医疗库 JupyterLab 交互探查 ipykernel 注册独立内核 缺失率 / 字段类型体检 Docker 镜像 medfusion:0.1 依赖固化 · 跨机器一致 挂载数据卷 · 环境变量传密 数据源 → 连接读取 → 隔离环境 / 交互探查 / 容器交付,形成可复现的医疗数据融合底座

六、环境自检清单

环境搭好后,建议按下面顺序做一次端到端自检,任何一步失败都先解决再进入数据融合:

检查项命令/操作通过判据
环境激活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 等数据源的可用连接。这套底座是后续多源数据清洗、对齐与融合的前提。