当前位置: 首页 > news >正文

基因突变VCF分析系统

项目背景

ANU研究生专题项目,给定VCF基因突变文件和评分算法,写Python脚本分析致病风险,开发包括数据库、ETL管道、API服务和前端看板的数据平台。

GitHub 仓库:https://github.com/LuckLuffy/gene-mutation-platform


项目流程

读取VCF文件并解析每个文件里记录的基因突变信息,然后用指定算法计算每个患者的疾病风险评分,最后用 Z-Score 分出是健康还是患病。

核心问题

  1. 解析并记录VCF文件数据
  2. 实现查筛改比等功能
  3. 开发网页前端
  4. 检查数据质量,记录运行结果

关键词:ETL、数据库、API、前端


整体结构

├── 数据库层 (db/) ← 把结果存进数据库 ├── ETL管道 (etl/) ← 把处理流程拆成 Extract → Transform → Load ├── API服务 (api/) ← 用FastAPI暴露接口,浏览器就能访问 ├── 前端看板 (frontend/) ← 用图表展示数据 └── Docker部署 ← 用docker-compose一键启动所有服务

第1步:数据存储

解析VCF文件数据,结果存到数据库里。

-- 6张表的ER关系patients-- 每个VCF文件对应一个患者├── gene_mutations-- 一个患者有多条基因突变记录 (外键 → patients)├── predictions-- 一个患者有一条预测结果 (外键 → patients)└── subnetwork_burdens-- 基因互作网络中的突变负荷 (外键 → patients)data_quality_logs-- 每次质量检查的记录 (独立表)etl_pipeline_logs-- 管道每次运行的记录 (独立表)

为什么分6张表而不是1张大宽表

如果不分表,把所有信息塞一起,患者的名字在每一行突变里都要重复一遍。更新一个患者信息要改N个地方。

分表之后,每张表只描述一个实体:患者是谁、有哪些突变、预测结果是什么、质量检查怎么样。表之间通过外键关联。

支持三种数据库

开发的时候用 SQLite — 不需要装任何东西,一个文件就是数据库。生产环境可以切到 PostgreSQL,同时做了 MySQL 的兼容,因为 Flink CDC 演示需要 MySQL 作为源端。

# db/connection.py 的核心逻辑ifdb_type=='sqlite':engine_url=f"sqlite:///{database}.db"elifdb_type=='postgresql':engine_url=f"postgresql://{user}:{password}@{host}:{port}/{database}"

SQLAlchemy 做的抽象层,切数据库只改配置文件,不用动业务代码。


第2步:ETL管道

实现三层分离的ETL管道:

Extract Transform Load ┌──────────┐ ┌──────────────────┐ ┌──────────┐ │ 读VCF文件 │ → │ 1.清洗 (去脏) │ → │ 写patients│ │ 解析INFO │ │ 2.校验 (质量检查) │ │ 写mutations│ │ 返回字典 │ │ 3.特征 (算评分) │ │ 写predictions│ └──────────┘ └──────────────────┘ │ 写质量日志 │ └──────────┘

对应代码结构:

etl/ ├── extractors/vcf_extractor.py → Extract ├── transformers/data_cleaner.py → Transform: 清洗 ├── transformers/data_validator.py → Transform: 校验 ├── transformers/feature_engineer.py → Transform: 特征工程 ├── loaders/db_loader.py → Load └── pipeline.py → 编排这5步

YAML 配置驱动

致病阈值放到pipeline_config.yaml

scoring:cadd_threshold:20sift_threshold:0.05polyphen_threshold:0.85primateai_threshold:0.7

想调试模型效果改YAML就行,不用碰代码。


第3步:数据质量

设置DataValidator,对清洗后的数据做5项检查:

classDataValidator:defvalidate(self,data):checks={'null_check':self._check_nulls(data),# CADD等字段是否缺失'range_check':self._check_ranges(data),# AF是否在[0,1]、CADD是否≥0'duplicate_check':self._check_duplicates(data),# 有没有重复突变记录'distribution_check':...,# 各字段分布是否合理'completeness_check':...,# 必要字段是否齐全}

检查结果

-- 每次检查的结果写入 data_quality_logs 表,永久可追溯INSERTINTOdata_quality_logs(table_name,check_type,failed_rows,total_rows,pass_rate)VALUES('gene_mutations','null_check',3,1616,0.998);

跑完管道后在数据库里能看到:哪次检查、查了什么、多少条没过、通过率多少。管道运行日志同理,记录到etl_pipeline_logs表里。实现数据溯源。


第4步:API服务

用 FastAPI 暴露 RESTful 接口后,浏览器打开http://localhost:8000/docs就能调所有功能。

api/ ├── main.py ← FastAPI入口,注册路由 ├── routers/ ← 每个资源一个router文件 │ ├── patients.py → /api/v1/patients │ ├── mutations.py → /api/v1/mutations │ ├── predictions.py → /api/v1/predictions │ └── data_quality.py → /api/v1/data-quality ├── schemas/ ← Pydantic数据模型(自动校验请求格式) └── services/ ← 业务逻辑(预测服务、查询服务)

为什么分 router 和 service 两层

router 只负责收HTTP请求、调service、返回响应。service 负责具体的业务逻辑。好处是——

  • 测预测逻辑时不需要启动服务器,直接调prediction_service.py
  • 改预测算法也只改 service,不影响 router 的接口格式

Swagger 文档

FastAPI 自带 Swagger UI,访问/docs就能看到所有接口,支持在线调试,自动生成接口文档,无需手动维护。


第5步:前端看板

纯静态 HTML/CSS/JS,不需要构建工具,直接浏览器打开。5个Tab标签页:

标签展示内容
仪表盘统计卡片(患者数/突变数/预测数/质量等级) + Chart.js渲染的环图柱状图
患者管理患者列表、分页、按组筛选、点开展示详情
突变浏览1616条突变分页表格、按基因搜索、统计面板
风险预测表单输入患者编号 → 调用API → 展示预测结果(评分/等级/置信度)
数据质量质量概览、检查历史、ETL管道运行记录

怎么和后端通信

前端通过 HTTP 请求调 FastAPI 的接口:

// frontend/js/api.jsconstAPI_BASE='http://localhost:8000';asyncfunctiongetPatients(page=1,limit=20){consturl=`${API_BASE}/api/v1/patients/?page=${page}&limit=${limit}`;constresponse=awaitfetch(url);constdata=awaitresponse.json();returndata;}

因为是跨域请求(file://访问http://localhost:8000),后端需要加 CORS 中间件,否则浏览器会拦截。


第6步:Docker部署

用 Docker Compose 把整套环境打包:

# docker-compose.yml 核心服务services:api:# FastAPI 应用frontend:# Nginx 托管前端静态文件postgres:# 数据仓库mysql:# CDC 源端(演示用)
docker-composeup-d# 一条命令启动所有服务

Dockerfile实现:装 Python 依赖、复制代码、暴露端口。


核心算法简述

评分算法由老师指定。

1. 共识评分

四个预测工具(CADD、PolyPhen、SIFT、PrimateAI)各自给一个分数,如果四个都认为有害,总分×3:

consensus=0.25*CADD_norm+0.25*PolyPhen+0.25*(1-SIFT)+0.25*PrimateAIif四个都达标:consensus*=3.0

SIFT 要反转(1-SIFT)是因为它"越小越有害",和其他三个方向相反。

2. 线性回归

score=0.05*(1-AF)+0.12*(10-constraint)+0.28*consensus+1.0*phenotypic

表型(phenotypic)的系数最大(1.0),因为"已知致病"优先级最高。

3. Z-Score 分类

不设绝对阈值,而是算这个人的分数离哪组(健康/疾病)更近:

z_healthy=|个人分-健康组均值|/健康组标准差 z_disease=|个人分-疾病组均值|/疾病组标准差# 哪个Z-score小就分到哪组

技术栈清单

模块用的什么为什么选它
数据库SQLite(开发) / PostgreSQL(生产) / MySQL(CDC源)SQLite零配置方便开发
数据处理Python (纯标准库+sklearn)个人习惯
API框架FastAPI写代码少、自动生成文档、性能够用
前端纯HTML/CSS/JS + Chart.js不用学框架,能跑就行
容器化Docker + Docker Compose环境打包,便于移动

项目反思

  1. ETL三层分离开发便利后期改动— 换个数据源只改提取层,调算法只改转换层
  2. YAML配置外置— 改阈值不用翻代码
  3. FastAPI + Pydantic— 自动校验减少逻辑冗余
  4. Docker Compose— 打包便于移动

如果对你有帮助可以给个 Star ⭐,欢迎提 Issue 讨论。

GitHub:https://github.com/LuckLuffy/gene-mutation-platform

http://www.jsqmd.com/news/1098978/

相关文章:

  • 5分钟搭建无人机强化学习仿真环境:从零到精通的完整指南
  • TypeScript回调函数详解
  • 一文读懂工业物联SD-WAN组网:如何破解协议壁垒,及零停机部署实战
  • 第3篇:Context Engineer:构建 AI 的长期记忆与动态知识库
  • 储能 PCS 远程运维怎么做?OTA 升级、固件调试与协议授权的 6 个工程点
  • 终极英雄联盟工具:免费开源LCU API助手完整使用指南
  • 【python】我用AI辅助开发了LanChat 局域网即时通讯的小软件
  • 基于AWS构建Agentic AI智能体:从原理到实战,实现工作流自动化与复利增长
  • 从API报错到本地拦截:电子面单快递公司前置校验改造
  • 3步轻松解密QQ音乐加密音频:qmcdump让你的音乐重获自由
  • SwiftKey整合GPT-4 Turbo:移动端AI输入范式重构
  • FreeRTOS 内核 IPC 通信全家桶——队列、信号量、互斥量、任务通知选型指南
  • VLA-Adapter论文解读(二):三大关键发现
  • 灵衢协议学习——物理层(三)
  • YOLO vs Halcon缺陷检测实战:别被AI焦虑绑架,选对技术才是真本事
  • Advanced XRay技术深度解析:如何通过方块渲染优化实现高效矿石定位
  • 管道泄漏识别 图像数据集 油气泄漏监测 水管泄漏检测图像数据
  • Android 7系统输入(五):应用侧 — InputChannel、ViewRootImpl与事件消费
  • 英雄联盟国服免费换肤终极指南:R3nzSkin完全教程
  • 抖音内容保存终极指南:douyin-downloader让你的收藏变得轻松高效
  • 英伟达“技术没有秘密“合理吗:研发总监拆解护城河的真相
  • 多 Agent 路由设计:当不同渠道、不同用户需要匹配不同“大脑”
  • 智能零售结账系统 文具用品识别数据集 YOLO与OpenCV实现+文具店橡皮+铅笔+尺子识别
  • 链表相关的算法
  • 北京昆仑数智-sql学习笔记
  • 爬虫去重别只会用Set!Python实现亿级数据清洗的4种工业级方案
  • 【VMware OVF导出终极指南】:20年资深架构师亲授5大避坑要点与3种加速导出实战技巧
  • 【数字孪生国标落地第一个月,我给新能源行业测了测段位】
  • 主流开源LLM(Qwen、ChatGLM等)的本地化部署
  • 验厂时,食品工作服需要注意什么?