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

194-基于Python的脑肿瘤患者数据分析可视化

🧠 基于Python的脑肿瘤患者数据分析可视化系统:从数据到智能预测的完整解决方案

码界筑梦坊 | 2025年技术分享

📋 目录

  • 项目概述
  • 技术架构
  • 核心功能实现
  • 数据可视化展示
  • 机器学习模型
  • 代码实现详解
  • 部署与运行
  • 性能优化
  • 项目总结
  • 联系方式

项目概述

在医疗数据科学领域,脑肿瘤数据分析是一个极具挑战性的课题。本项目基于Python构建了一个完整的脑肿瘤患者数据分析可视化系统,集成了数据管理、多维度分析、智能预测和现代化Web界面,为医疗机构和研究人员提供了强大的数据分析工具。

🎯 项目亮点

  • 全栈技术栈:FastAPI + SQLite + ECharts + Bootstrap
  • 智能预测:基于机器学习的肿瘤类型分类和存活率预测
  • 丰富可视化:多维度数据分析和交互式图表展示
  • 现代化界面:响应式设计,支持多设备访问
  • 完整功能:从数据管理到AI预测的全流程解决方案

技术架构

🏗️ 整体架构图

用户界面层
Web服务层
业务逻辑层
数据访问层
数据存储层
HTML/CSS/JS
Bootstrap 5
ECharts
FastAPI
Uvicorn
Jinja2
数据分析模块
机器学习模块
用户认证模块
SQLite
Pandas
NumPy
患者数据
用户数据
模型文件

🛠️ 技术栈详解

后端技术
  • Python 3.8+ - 主要编程语言
  • FastAPI - 现代化异步Web框架
  • Uvicorn - 高性能ASGI服务器
  • SQLite - 轻量级关系型数据库
  • aiosqlite - 异步数据库操作
数据处理
  • Pandas - 数据分析和处理
  • NumPy - 数值计算
  • Scikit-learn - 机器学习算法库
  • Joblib - 模型持久化
前端技术
  • HTML5/CSS3 - 页面结构
  • Bootstrap 5 - 响应式UI框架
  • ECharts - 数据可视化图表库
  • jQuery - JavaScript工具库
机器学习
  • RandomForest - 随机森林算法
  • 特征工程 - 自动数据预处理
  • 模型评估 - 性能指标计算

项目演示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

核心功能实现

🔐 用户认证系统

# 用户认证核心代码
from fastapi import FastAPI, Request, HTTPException, status, Form
from starlette.middleware.sessions import SessionMiddlewareapp.add_middleware(SessionMiddleware, secret_key="brain-tumor-analysis-secret-key-2024")async def authenticate_user(self, username: str, password: str) -> dict:"""用户认证"""async with aiosqlite.connect(self.db_path) as db:password_hash = self.hash_password(password)cursor = await db.execute("SELECT id, username, email FROM users WHERE username = ? AND password_hash = ?",(username, password_hash))row = await cursor.fetchone()if row:return {"id": row[0],"username": row[1],"email": row[2]}return None

📊 数据管理模块

# 患者数据管理
async def get_patients(self, page: int = 1, size: int = 20, search: str = ""):"""获取患者数据(分页)"""async with aiosqlite.connect(self.db_path) as db:db.row_factory = aiosqlite.Rowoffset = (page - 1) * sizewhere_clause = ""params = []if search:# 支持多条件搜索search_parts = search.strip().split()for part in search_parts:if ':' in part:key, value = part.split(':', 1)if key in ['gender', 'tumor_type', 'location']:where_clause += f" AND {key} = ?"params.append(value)else:where_clause += " AND (patient_id LIKE ? OR age LIKE ?)"params.extend([f"%{part}%", f"%{part}%"])query = f"""SELECT * FROM brain_tumor_patients WHERE 1=1 {where_clause}ORDER BY created_at DESC LIMIT ? OFFSET ?"""params.extend([size, offset])cursor = await db.execute(query, params)patients = await cursor.fetchall()# 获取总数count_query = f"SELECT COUNT(*) FROM brain_tumor_patients WHERE 1=1 {where_clause}"count_cursor = await db.execute(count_query, params[:-2])total = await count_cursor.fetchone()return {"patients": [dict(patient) for patient in patients],"total": total[0],"page": page,"size": size,"pages": (total[0] + size - 1) // size}

📈 数据分析模块

# 肿瘤类型分析
async def get_tumor_type_analysis(self):"""肿瘤类型分析"""data = await self.db.get_all_patients_data()df = pd.DataFrame(data)# 统一数据格式df['gender'] = df['gender'].replace({'男': 'Male', '女': 'Female'})df['tumor_type'] = df['tumor_type'].replace({'良性': 'Benign', '恶性': 'Malignant'})# 基础统计malignant_count = len(df[df['tumor_type'] == 'Malignant'])benign_count = len(df[df['tumor_type'] == 'Benign'])total_count = len(df)statistics = {'malignant_count': malignant_count,'benign_count': benign_count,'total_count': total_count,'malignant_rate': round((malignant_count / total_count * 100), 1),'benign_rate': round((benign_count / total_count * 100), 1)}# 性别与肿瘤类型关系gender_tumor = df.groupby(['gender', 'tumor_type']).size().unstack(fill_value=0)# 年龄段分析age_bins = [20, 30, 40, 50, 60, 70]age_labels = ['20-30岁', '30-40岁', '40-50岁', '50-60岁', '60-70岁']df['age_group'] = pd.cut(df['age'], bins=age_bins, labels=age_labels, right=False)return self.clean_data_for_json({'statistics': statistics,'gender_analysis': gender_tumor.to_dict(),'age_analysis': df.groupby(['age_group', 'tumor_type']).size().unstack(fill_value=0).to_dict()})

数据可视化展示

📊 图表类型与实现

1. 肿瘤类型分布 - 水球图
// ECharts水球图配置
const tumorTypeOption = {series: [{type: 'liquidFill',data: [malignantRate / 100],color: ['#ff6b6b'],center: ['50%', '50%'],radius: '80%',label: {normal: {textStyle: {color: '#fff',fontSize: 20,fontWeight: 'bold'}}}}]
};
2. 年龄分布分析 - 柱状图
// 年龄分布柱状图
const ageDistributionOption = {title: {text: '患者年龄分布',left: 'center'},tooltip: {trigger: 'axis',axisPointer: {type: 'shadow'}},xAxis: {type: 'category',data: ageLabels},yAxis: {type: 'value'},series: [{name: '患者数量',type: 'bar',data: ageCounts,itemStyle: {color: '#4ecdc4'}}]
};
3. 治疗效果分析 - 雷达图
// 治疗效果雷达图
const treatmentOption = {radar: {indicator: [{ name: '手术治疗', max: 100 },{ name: '放射治疗', max: 100 },{ name: '化学治疗', max: 100 },{ name: '综合治疗', max: 100 }]},series: [{name: '治疗效果',type: 'radar',data: [{value: treatmentData,name: '治疗方式对比'}]}]
};

🎨 可视化效果展示

注意:以下为预留的可视化展示区域,实际项目中包含丰富的交互式图表

仪表板概览
  • 📈 实时统计数据展示
  • 🎯 关键指标监控
  • 📊 多维度数据对比
分析图表
  • 🥧 肿瘤类型分布饼图
  • 📊 年龄分布柱状图
  • 🌡️ 存活率趋势图
  • 🎯 治疗效果雷达图
  • 📍 位置分布地图

机器学习模型

🤖 模型架构

class BrainTumorModel:def __init__(self):self.tumor_type_model = Noneself.survival_rate_model = Noneself.label_encoders = {}self.scaler = StandardScaler()self.is_trained = False

🔧 特征工程

def preprocess_data(self, df):"""数据预处理"""data = df.copy()# 处理分类变量categorical_features = ['Gender', 'Location', 'Histology', 'Stage', 'Radiation_Treatment', 'Surgery_Performed', 'Chemotherapy', 'Family_History', 'MRI_Result']for feature in categorical_features:if feature not in self.label_encoders:self.label_encoders[feature] = LabelEncoder()data[feature] = self.label_encoders[feature].fit_transform(data[feature])return data

🎯 模型训练

async def train_tumor_type_classifier(self, data):"""训练肿瘤类型分类器"""features = ['Age', 'Gender', 'Tumor_Size', 'Location', 'Histology', 'Stage', 'Family_History', 'MRI_Result']X = data[features]y = data['Tumor_Type_Encoded']# 数据分割X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 特征标准化X_train_scaled = self.scaler.fit_transform(X_train)X_test_scaled = self.scaler.transform(X_test)# 训练随机森林模型self.tumor_type_model = RandomForestClassifier(n_estimators=100, random_state=42)self.tumor_type_model.fit(X_train_scaled, y_train)# 模型评估y_pred = self.tumor_type_model.predict(X_test_scaled)accuracy = accuracy_score(y_test, y_pred)print(f"肿瘤类型分类模型准确率: {accuracy:.4f}")

🔮 智能预测

async def predict(self, patient_data):"""进行预测"""try:# 预处理输入数据processed_input = self.preprocess_input(patient_data)# 肿瘤类型预测tumor_features = ['Age', 'Gender', 'Tumor_Size', 'Location', 'Histology', 'Stage', 'Family_History', 'MRI_Result']tumor_input = [processed_input.get(feature, 0) for feature in tumor_features]tumor_input_scaled = self.scaler.transform([tumor_input])tumor_pred = self.tumor_type_model.predict(tumor_input_scaled)[0]tumor_prob = self.tumor_type_model.predict_proba(tumor_input_scaled)[0]# 存活率预测survival_features = ['Age', 'Gender', 'Tumor_Size', 'Location', 'Histology', 'Stage', 'Radiation_Treatment', 'Surgery_Performed', 'Chemotherapy', 'Tumor_Growth_Rate', 'Family_History']survival_input = [processed_input.get(feature, 0) for feature in survival_features]survival_rate = self.survival_rate_model.predict([survival_input])[0]return {"tumor_type": self.label_encoders['Tumor_Type'].inverse_transform([tumor_pred])[0],"tumor_type_probability": float(max(tumor_prob)),"predicted_survival_rate": float(survival_rate),"risk_level": self.get_risk_level(tumor_pred, survival_rate)}except Exception as e:return {"error": str(e)}

代码实现详解

📁 项目结构

brain-tumor-analysis/
├── main.py                 # 主应用程序入口
├── database.py             # 数据库操作模块
├── data_analyzer.py        # 数据分析模块
├── ml_model.py            # 机器学习模型
├── retrain_models.py      # 模型重训练脚本
├── init_database.py       # 数据库初始化
├── start.py               # 启动脚本
├── requirements.txt       # 依赖包列表
├── brain_tumor_analysis.db # SQLite数据库文件
├── models/                # 机器学习模型文件
│   ├── survival_rate_model.pkl
│   ├── tumor_type_model.pkl
│   ├── scaler.pkl
│   └── label_encoders.pkl
├── data/                  # 数据文件
│   └── brain_tumor_dataset.csv
├── templates/             # HTML模板
│   ├── base.html
│   ├── login.html
│   ├── register.html
│   ├── dashboard.html
│   ├── data_management.html
│   ├── analysis.html
│   ├── prediction.html
│   ├── profile.html
│   └── analysis/
│       ├── tumor_type.html
│       ├── age_distribution.html
│       ├── treatment_effectiveness.html
│       ├── symptoms.html
│       └── location.html
├── static/                # 静态资源
│   ├── css/
│   ├── js/
│   ├── fonts/
│   └── image/
└── README.md             # 项目说明文档

🚀 启动流程

# main.py - 应用启动
@asynccontextmanager
async def lifespan(app: FastAPI):# 启动时初始化global db, ml_model, data_analyzer# 初始化核心组件db = Database()ml_model = BrainTumorModel()data_analyzer = DataAnalyzer()# 初始化数据库await db.init_database()# 创建默认管理员用户await create_default_user()# 加载数据到数据库await db.load_brain_tumor_data()# 训练机器学习模型await ml_model.train_model()print("系统初始化完成!")yield# 关闭时清理资源print("系统正在关闭...")

🔧 核心API接口

# 数据分析API
@app.get("/api/analysis/tumor-type")
async def get_tumor_type_analysis(request: Request):"""获取肿瘤类型分析数据"""redirect_response = require_login(request)if redirect_response:return redirect_responseanalysis_data = await data_analyzer.get_tumor_type_analysis()return JSONResponse(content=analysis_data)# AI预测API
@app.post("/api/predict")
async def predict_tumor(request: Request, patient_data: dict):"""AI预测接口"""redirect_response = require_login(request)if redirect_response:return redirect_responseprediction = await ml_model.predict(patient_data)return JSONResponse(content=prediction)# 患者数据API
@app.get("/api/patients")
async def get_patients(request: Request,page: int = 1,size: int = 20,search: str = ""
):"""获取患者数据"""redirect_response = require_login(request)if redirect_response:return redirect_responsepatients_data = await db.get_patients(page, size, search)return JSONResponse(content=patients_data)

部署与运行

📦 环境配置

# 创建虚拟环境
python -m venv venv# 激活虚拟环境
# Windows
venv\Scripts\activate
# Linux/Mac
source venv/bin/activate# 安装依赖
pip install -r requirements.txt

🚀 启动服务

# 初始化数据库
python init_database.py# 启动应用
python start.py
# 或
uvicorn main:app --host 0.0.0.0 --port 8000 --reload

🌐 访问地址

  • 系统首页: http://localhost:8000
  • API文档: http://localhost:8000/docs
  • 默认账户: admin / password

性能优化

⚡ 数据库优化

# 数据库索引优化
async def init_database(self):"""初始化数据库表结构"""async with aiosqlite.connect(self.db_path) as db:# 创建索引await db.execute("""CREATE INDEX IF NOT EXISTS idx_patients_gender ON brain_tumor_patients(gender)""")await db.execute("""CREATE INDEX IF NOT EXISTS idx_patients_tumor_type ON brain_tumor_patients(tumor_type)""")await db.execute("""CREATE INDEX IF NOT EXISTS idx_patients_age ON brain_tumor_patients(age)""")

🚀 缓存机制

# 数据缓存
from functools import lru_cache@lru_cache(maxsize=128)
def get_cached_analysis_data(analysis_type: str):"""缓存分析数据"""# 实现缓存逻辑pass

📊 异步处理

# 异步数据处理
async def process_large_dataset(self, data):"""异步处理大数据集"""# 分批处理数据batch_size = 1000for i in range(0, len(data), batch_size):batch = data[i:i + batch_size]await self.process_batch(batch)

项目总结

🎯 技术亮点

  1. 现代化技术栈: 采用FastAPI + SQLite + ECharts的现代化技术组合
  2. 完整功能体系: 从数据管理到AI预测的全流程解决方案
  3. 丰富可视化: 多维度数据分析和交互式图表展示
  4. 智能预测: 基于机器学习的肿瘤类型分类和存活率预测
  5. 用户体验: 响应式设计,支持多设备访问

📈 应用价值

  • 医疗研究: 为脑肿瘤研究提供数据分析工具
  • 临床辅助: 支持医生进行数据驱动的决策
  • 教学演示: 可作为医疗数据科学的教学案例
  • 技术学习: 展示全栈开发和机器学习的最佳实践

🔮 未来展望

  • 算法优化: 集成更多机器学习算法
  • 功能扩展: 增加更多分析维度和预测模型
  • 性能提升: 优化大数据处理能力
  • 移动端: 开发移动端应用

💡 技术收获

通过这个项目,我们深入实践了:

  • 全栈开发: 前后端分离的Web应用开发
  • 数据处理: Pandas和NumPy在数据分析中的应用
  • 机器学习: Scikit-learn在医疗数据上的应用
  • 数据可视化: ECharts在Web端的图表展示
  • 系统设计: 模块化、可扩展的系统架构

联系方式

码界筑梦坊 - 专注技术分享与创新

  • GitHub: 码界筑梦坊
  • 小红书: 码界筑梦坊
  • CSDN: 码界筑梦坊
  • 知乎: 码界筑梦坊
  • B站: 码界筑梦坊

感谢阅读! 如果这篇文章对您有帮助,请给个⭐️支持一下!

本文基于实际项目代码编写,所有代码示例均经过测试验证。项目仅用于教育和研究目的,不应用于临床诊断。


最后更新时间:2025年9月

http://www.dtcms.com/a/399342.html

相关文章:

  • 在 Mac 上无线挂载 Android /sdcard
  • Nature论文解读DeepSeek R1:MoE架构如何重构高效推理的技术范式
  • 拆炸弹-定长滑动窗口/环形数组
  • 成都市城乡建设局网站重庆市建设施工安全网站
  • 力扣1003
  • LeetCode 386 字典序排数 Swift 题解:模拟字典翻页的遍历技巧
  • 如何给 wot-ui(wot-design-uni)日历里给某几天加「原点」标注 —— 实战指南
  • 网站分析培训班西安有哪些大公司
  • Vue——02 Vue指令和Vue对象的配置项
  • 商城网站模板框架购物网站如何做推广
  • html个人网站设计网络营销推广的方式都有哪些
  • 【Linux】进程概念(五) 命令行参数与环境变量的深度解析
  • 网站认领微平台公众号
  • 微盟网站模板某购物网站开发项目
  • ManualResetEvent:C# 线程同步工具
  • 手机移动端网站怎么做的第一ppt模板官网
  • C# 车牌识别系统实现
  • 国内做医疗耗材的网站宁波seo推广哪家公司好
  • vue3中返回带参数如何实现?
  • Kafka Rebalance机制全解析
  • 温州集团网站建设网站怎么做外部链接
  • 华为云产品体系选择
  • 公司网站站群是什么赣州网上商城入驻方案
  • 驱动(二)Linux 系统移植、驱动开发框架
  • LDPC码的BP译码算法(一)
  • mit6s081 lab6: copy of write fork
  • 【多尺度/局部-全局融合与优化 】涉及的工业异常检测论文摘要整理
  • CRI与容器运行时:从Kubelet到Container的最后一公里
  • cnu摄影网站chrome官网
  • 一篇了解 Git 使用方法