基于 XGBoost 与 SHAP 的医疗自动化办公与可视化系统(下)
— 登录接口 —
@app.post(“/token”)
def login(form_data: OAuth2PasswordRequestForm = Depends()):
user = fake_users_db.get(form_data.username)
if not user or form_data.password != user[“password”]:
raise HTTPException(status_code=400, detail=“用户名或密码错误”)
access_token = create_access_token(data={“sub”: user[“username”]})
return {“access_token”: access_token, “token_type”: “bearer”}
— AI 预测接口 —
@app.post(“/predict”)
def predict(file: UploadFile = File(…), username: str = Depends(verify_token)):
try:
model = load(“ai_module/model.pkl”)
scaler = load(“ai_module/scaler.pkl”)
except Exception:
raise HTTPException(status_code=500, detail=“模型未训练,请先训练”)
df = pd.read_csv(io.BytesIO(file.file.read()))
if not set(["age", "blood_pressure", "glucose", "cholesterol"]).issubset(df.columns):raise HTTPException(status_code=400, detail="CSV 缺少必要列")features = df[["age", "blood_pressure", "glucose", "cholesterol"]]
df["risk_score"] = model.predict_proba(scaler.transform(features))[:, 1]
return df.to_dict(orient="records")
---### 🚀 启动命令:```bash
uvicorn api_server.app:app --reload
🔐 Token 流程测试(推荐用 Postman 或 curl):
- 获取 token:
curl -X POST http://localhost:8000/token -F 'username=admin' -F 'password=admin123'
- 带 Token 调用
/predict
:
curl -X POST http://localhost:8000/predict \-H "Authorization: Bearer YOUR_TOKEN_HERE" \-F "file=@yourfile.csv"
完整模块:💻 streamlit_app.py
(企业级医疗门户 UI)
✅ 功能概览:
功能模块 | 描述 |
---|---|
🔐 登录界面 | 简易用户名+密码验证(可扩展为 OAuth 或 LDAP) |
📂 多文件上传 | 支持上传多个 CSV 并合并展示 |
🧠 风险预测 | 基于 XGBoost 模型计算 risk_score |
📊 可视化 | 展示分布图、趋势图、SHAP 图 |
📄 PDF 报告 | 可点击按钮下载 AI 分析报告 |
✅ 安装依赖(如未安装):
pip install streamlit pandas plotly joblib matplotlib fpdf
💻 streamlit_app.py
:
# streamlit_app.pyimport streamlit as st
import pandas as pd
import plotly.express as px
from joblib import load
import matplotlib.pyplot as plt
from PIL import Image
import os
from report.generate_pdf import generate_pdf # 调用你之前的 PDF 生成模块# 页面设置
st.set_page_config(page_title="医疗 AI 门户", layout="wide")
st.title("🏥 医疗 AI 辅助分析平台")# 登录模拟(可换成 OAuth、LDAP)
def login():st.sidebar.title("🔐 登录")username = st.sidebar.text_input("用户名")password = st.sidebar.text_input("密码", type="password")if st.sidebar.button("登录"):if username == "admin" and password == "admin123":st.session_state["authenticated"] = Trueelse:st.sidebar.error("用户名或密码错误")# 主体功能
def main_app():st.success("✅ 登录成功!欢迎使用医疗 AI 辅助系统")uploaded_files = st.file_uploader("📂 上传一份或多份 HIS 数据文件(CSV)", type="csv", accept_multiple_files=True)if uploaded_files:dfs = []for f in uploaded_files:df = pd.read_csv(f)df["source_file"] = f.namedfs.append(df)df = pd.concat(dfs, ignore_index=True)st.subheader("📝 数据预览")st.dataframe(df)# 模