127-基于Flask的德国银行信贷客户数据可视化分析系统

基于 Flask 的德国银行信贷客户数据可视化分析系统 --- 技术文档

版本:v1.0 | 最后更新:2026-05-18


目录

  1. 项目概述
  2. 系统架构
  3. 技术栈
  4. 目录结构
  5. 数据库设计
  6. [后端路由与 API](#后端路由与 API)
  7. 前端设计
  8. 数据可视化
  9. 机器学习模块
  10. 配置与部署
  11. 已知问题与改进方向

1. 项目概述

1.1 项目背景

本系统是一个基于 Flask 框架的 Web 应用,用于对德国银行信贷客户数据集(German Credit Data)进行多维度可视化分析和机器学习预测。系统提供用户认证、数据管理、统计分析、可视化展示和预测建模等完整功能。

1.2 核心功能

功能模块 说明
用户认证 注册、登录、登出,基于 Flask-Login 的会话管理
数据看板 5 个分析维度、60+ 张交互式图表,覆盖人口统计、财务状况、信贷分析、统计分析
数据管理 对信贷数据的增删改查(CRUD),支持分页与搜索
预测分析 K-Means 客户聚类、随机森林信用风险预测、肘部法则、混淆矩阵

1.3 数据集说明

数据来源:UCI Machine Learning Repository --- German Credit Data

  • 记录数:1000 条
  • 字段数:10 个
  • 数据格式:CSV
字段 类型 说明
Id Integer 记录编号(0-999)
Age Integer 客户年龄
Sex String 性别:male / female
Job Integer 职业类型:0=非居民非技术工, 1=居民非技术工, 2=技术工, 3=高技能工
Housing String 住房情况:own / rent / free
Saving accounts String 储蓄账户等级:little / moderate / quite rich / rich(可为空)
Checking account String 支票账户等级:little / moderate / rich(可为空)
Credit amount Integer 信贷金额(单位:德国马克 DM)
Duration Integer 贷款期限(月)
Purpose String 贷款用途:car / radio/TV / furniture/equipment / business / education / repairs / vacation/others / domestic appliances

























2. 系统架构

2.1 架构概览

复制代码
┌─────────────────────────────────────────────────────────┐
│                      浏览器 (Client)                      │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐ │
│  │ 登录页面  │  │ 数据看板  │  │ 数据管理  │  │ 预测分析  │ │
│  └────┬─────┘  └────┬─────┘  └────┬─────┘  └────┬─────┘ │
│       │             │             │             │        │
│       │     ECharts  │   Fetch API │   Fetch API │        │
└───────┼─────────────┼─────────────┼─────────────┼────────┘
        │             │             │             │
        ▼             ▼             ▼             ▼
┌─────────────────────────────────────────────────────────┐
│                   Flask 应用服务器                        │
│                                                         │
│  ┌─────────────┐  ┌─────────────┐  ┌─────────────────┐ │
│  │  认证路由     │  │  统计 API    │  │  预测 API        │ │
│  │  /login      │  │  /api/stats/ │  │  /api/predict/  │ │
│  │  /register   │  │  (32 个端点)  │  │  (4 个端点)      │ │
│  │  /logout     │  │             │  │                 │ │
│  └──────┬──────┘  └──────┬──────┘  └────────┬────────┘ │
│         │                │                   │          │
│  ┌──────┴────────────────┴───────────────────┴────────┐ │
│  │              Flask-Login 会话管理                    │ │
│  └──────────────────────┬─────────────────────────────┘ │
│                         │                               │
│  ┌──────────────────────┴─────────────────────────────┐ │
│  │              SQLAlchemy ORM                         │ │
│  └──────────────────────┬─────────────────────────────┘ │
└─────────────────────────┼───────────────────────────────┘
                          │
                          ▼
               ┌─────────────────────┐
               │   SQLite 数据库      │
               │   credit_data.db    │
               │   - users           │
               │   - credit_data     │
               └─────────────────────┘

2.2 设计模式

  • 应用工厂模式 :通过 create_app() 函数创建 Flask 实例,便于测试和配置管理
  • MVC 模式
    • Modelmodels.py 定义 SQLAlchemy 数据模型
    • Viewtemplates/ 下的 Jinja2 模板
    • Controllerapp.py 中的路由处理函数
  • 前端数据驱动:页面加载后通过 AJAX 调用 API 获取数据,ECharts 渲染图表

3. 技术栈

3.1 后端

组件 技术 版本 用途
Web 框架 Flask 3.0.0 路由、请求处理、模板渲染
ORM Flask-SQLAlchemy 3.1.1 数据库操作抽象层
认证 Flask-Login 0.6.3 用户会话管理、登录保护
密码加密 Werkzeug 3.0.1 密码哈希(pbkdf2)
数据处理 pandas 2.1.4 CSV 读取、数据聚合、统计计算
数值计算 numpy 1.26.2 数组运算、统计指标(分位数、箱线图)
机器学习 scikit-learn 1.3.2 KMeans 聚类、随机森林分类、特征编码
可视化(备用) matplotlib 3.8.2 后端绘图(运行时未使用)
可视化(备用) seaborn 0.13.0 后端绘图(运行时未使用)
数据库 SQLite 内置 本地文件数据库

3.2 前端

组件 技术 版本 用途
图表库 ECharts 5.4.3 (CDN) 60+ 张交互式图表渲染
模板引擎 Jinja2 Flask 内置 HTML 模板继承与渲染
样式 自定义 CSS3 --- 完整设计系统,无第三方框架
脚本 原生 JavaScript --- 无框架,无构建工具
字体 Google Fonts --- Cormorant Garamond(标题)、DM Sans(正文)、JetBrains Mono(数据)

3.3 开发环境

工具 说明
Python 3.8+ / 3.11
操作系统 Windows 11

4. 目录结构

复制代码
code/
├── app.py                  # 主应用文件(1326 行),包含所有路由和 API
├── config.py               # 配置文件(10 行)
├── models.py               # 数据模型定义(50 行)
├── init_db.py              # 数据库初始化脚本(45 行)
├── requirements.txt        # Python 依赖清单
├── credit_data.db          # SQLite 数据库文件(86KB)
│
├── data/
│   ├── german_credit_data.csv              # 原始数据集(1000 条)
│   ├── 关于银行信贷客户数据集的探索.ipynb    # 探索性数据分析 Notebook
│   └── 参考链接.url
│
├── static/
│   ├── css/
│   │   └── style.css       # 完整样式系统(1552 行)
│   ├── js/
│   │   └── main.js         # 全局脚本(23 行)
│   └── images/
│       └── auth-bg.jpg     # 登录页背景图
│
└── templates/
    ├── base.html           # 后端布局模板(侧边栏 + 顶栏)
    ├── login.html          # 登录页(独立页面)
    ├── register.html       # 注册页(独立页面)
    ├── dashboard.html      # 数据看板(1721 行,含 60+ 图表)
    ├── data_manage.html    # 数据管理 CRUD 页面
    └── predict.html        # 预测分析页面

5. 数据库设计

5.1 ER 关系图

复制代码
┌──────────────────┐         ┌──────────────────────────┐
│      users       │         │       credit_data         │
├──────────────────┤         ├──────────────────────────┤
│ id (PK)          │         │ id (PK, autoincrement)   │
│ username (UNIQUE) │         │ original_id (UNIQUE)      │
│ password_hash     │         │ age                      │
│ created_at        │         │ sex                      │
└──────────────────┘         │ job                      │
                              │ housing                  │
                              │ saving_accounts (NULL)   │
                              │ checking_account (NULL)  │
                              │ credit_amount            │
                              │ duration                 │
                              │ purpose                  │
                              └──────────────────────────┘

5.2 users 表

存储系统注册用户信息,用于身份认证。

字段 类型 约束 默认值 说明
id INTEGER PRIMARY KEY AUTOINCREMENT 用户 ID
username VARCHAR(80) UNIQUE, NOT NULL, INDEX --- 用户名
password_hash VARCHAR(256) NOT NULL --- 密码哈希值(pbkdf2)
created_at DATETIME --- UTC now 注册时间

模型方法:

  • set_password(password):使用 werkzeug.security.generate_password_hash 生成密码哈希
  • check_password(password):使用 werkzeug.security.check_password_hash 验证密码
  • 继承 flask_login.UserMixin,提供 is_authenticatedis_active 等属性

5.3 credit_data 表

存储德国银行信贷客户数据,从 CSV 导入。

字段 类型 约束 说明
id INTEGER PRIMARY KEY, AUTOINCREMENT 内部记录 ID
original_id INTEGER UNIQUE CSV 中的原始 Id 列
age INTEGER NOT NULL 客户年龄
sex VARCHAR(10) NOT NULL 性别
job INTEGER NOT NULL 职业类型编码(0-3)
housing VARCHAR(20) NOT NULL 住房情况
saving_accounts VARCHAR(20) NULLABLE 储蓄账户等级
checking_account VARCHAR(20) NULLABLE 支票账户等级
credit_amount INTEGER NOT NULL 信贷金额(DM)
duration INTEGER NOT NULL 贷款期限(月)
purpose VARCHAR(50) NOT NULL 贷款用途

模型方法:

  • to_dict():序列化为字典,空值字段转换为空字符串

5.4 数据库初始化

运行 init_db.py 执行以下操作:

  1. 删除所有现有表(db.drop_all()
  2. 创建新表(db.create_all()
  3. data/german_credit_data.csv 导入 1000 条记录
  4. 创建默认管理员账户:用户名 admin,密码 admin123
bash 复制代码
python init_db.py

6. 后端路由与 API

6.1 应用入口

app.py 使用应用工厂模式,通过 create_app() 函数创建 Flask 应用实例。应用运行在 端口 5004,开启调试模式。

python 复制代码
# app.py 末尾
if __name__ == '__main__':
    app = create_app()
    app.run(debug=True, port=5004)

6.2 认证机制

  • 会话管理:基于 Flask-Login 的 Cookie-Session 机制
  • 密码存储:Werkzeug 的 pbkdf2 哈希算法
  • 路由保护 :使用 @login_required 装饰器保护需要登录的页面
  • 登录重定向 :未登录用户自动跳转到 /login,登录后跳转回原页面
  • 记住登录login_user(user, remember=True) 启用持久化会话

6.3 页面路由

路由 方法 认证 模板 说明
/ GET --- 根路由,已登录跳 dashboard,未登录跳 login
/login GET, POST login.html 登录页面
/register GET, POST register.html 注册页面
/logout GET --- 登出,跳转到登录页
/dashboard GET dashboard.html 数据看板(默认维度)
/dashboard/demographics GET dashboard.html 人口统计维度
/dashboard/financial GET dashboard.html 财务状况维度
/dashboard/credit GET dashboard.html 信贷分析维度
/dashboard/stats GET dashboard.html 统计分析维度
/data GET data_manage.html 数据管理页面
/predict GET predict.html 预测分析页面

6.4 数据 CRUD API

所有 API 返回 JSON 格式数据。

GET /api/data/list

分页查询信贷数据,支持搜索。

请求参数:

参数 类型 默认值 说明
page int 1 页码
per_page int 20 每页条数
search string "" 搜索关键词(模糊匹配 sex、housing、purpose、saving_accounts、checking_account)

响应示例:

json 复制代码
{
  "data": [
    {
      "id": 1,
      "original_id": 0,
      "age": 67,
      "sex": "male",
      "job": 2,
      "housing": "own",
      "saving_accounts": "",
      "checking_account": "little",
      "credit_amount": 1169,
      "duration": 6,
      "purpose": "radio/TV"
    }
  ],
  "total": 1000,
  "pages": 50,
  "current_page": 1
}
POST /api/data/add

新增信贷记录。

请求体(JSON):

json 复制代码
{
  "age": 30,
  "sex": "male",
  "job": 2,
  "housing": "own",
  "saving_accounts": "moderate",
  "checking_account": "little",
  "credit_amount": 5000,
  "duration": 24,
  "purpose": "car"
}
POST /api/data/update

更新信贷记录。请求体同上,额外包含 id 字段。

POST /api/data/delete

删除信贷记录。请求体:{ "id": 1 }

6.5 统计分析 API(32 个端点)

所有统计 API 均为 GET 请求,返回 JSON 数据,供前端 ECharts 图表使用。

概览统计
端点 说明 返回字段
/api/stats/overview 总览数据 total_count, avg_age, avg_credit, avg_duration
/api/stats/credit_stats_summary 综合统计摘要 16 个统计指标(均值、中位数、标准差、极值、分位数等)
/api/stats/credit_health_gauge 信贷健康评分 score (0-100), 各维度得分
人口统计维度
端点 说明 图表类型
/api/stats/age_distribution 年龄分布(6 组) 柱状图
/api/stats/sex_distribution 性别比例 饼图
/api/stats/job_distribution 职业类型分布 饼图
/api/stats/housing_distribution 住房情况分布 饼图
/api/stats/age_credit_analysis 年龄 × 信贷分析 分组柱状图
/api/stats/job_credit_analysis 职业 × 信贷分析 分组柱状图
/api/stats/sex_credit_analysis 性别 × 信贷分析 分组柱状图
/api/stats/purpose_sex_analysis 贷款用途 × 性别 水平分组柱状图
/api/stats/age_funnel 年龄组漏斗图 漏斗图
/api/stats/credit_by_age_sex 年龄 × 性别信贷 分组柱状图
/api/stats/job_housing_credit_sunburst 职业 → 住房旭日图 旭日图
/api/stats/checking_saving_scatter 支票 × 储蓄散点图 散点图
/api/stats/age_duration_scatter 年龄 × 期限散点图 散点图
/api/stats/age_sex_credit_heatmap 年龄 × 性别信贷热力图 热力图
/api/stats/sex_age_distribution 性别 × 年龄分布 分组柱状图
财务状况维度
端点 说明 图表类型
/api/stats/saving_distribution 储蓄账户分布 饼图
/api/stats/checking_distribution 支票账户分布 饼图
/api/stats/housing_credit_analysis 住房 × 信贷分析 分组柱状图
/api/stats/risk_factors 风险因子分析 柱状图
/api/stats/job_housing_matrix 职业 × 住房矩阵 堆叠柱状图
/api/stats/checking_credit_analysis 支票 × 信贷分析 分组柱状图
/api/stats/saving_checking_heatmap 储蓄 × 支票热力图 热力图
/api/stats/housing_saving_credit 住房 × 储蓄信贷热力图 热力图
/api/stats/job_credit_sunburst 职业 → 储蓄旭日图 旭日图
/api/stats/purpose_duration_radar 用途 × 期限雷达图 雷达图
/api/stats/age_credit_boxplot 年龄 × 信贷箱线图 箱线图
信贷分析维度
端点 说明 图表类型
/api/stats/purpose_distribution 贷款用途分布 水平柱状图
/api/stats/credit_by_purpose 用途 × 信贷统计 分组柱状图
/api/stats/credit_amount_distribution 信贷金额分布 直方图
/api/stats/duration_distribution 贷款期限分布 直方图
/api/stats/purpose_duration_analysis 用途 × 期限分析 分组柱状图
/api/stats/credit_percentiles 信贷百分位数 柱状图
/api/stats/purpose_credit_boxplot 用途 × 信贷箱线图 箱线图
/api/stats/credit_duration_scatter 信贷 × 期限散点图 散点图
/api/stats/duration_credit_boxplot 期限 × 信贷箱线图 箱线图
/api/stats/duration_purpose_heatmap 期限 × 用途热力图 热力图
/api/stats/purpose_housing_sunburst 用途 → 住房旭日图 旭日图
/api/stats/credit_by_saving_job 储蓄 × 职业信贷堆叠图 堆叠柱状图
/api/stats/default_rate_by_purpose 用途违约率 柱状图
统计分析维度
端点 说明 图表类型
/api/stats/customer_radar 客户画像雷达图 雷达图(整体/男/女)
/api/stats/correlation_matrix 相关性矩阵 热力图
/api/stats/sex_age_credit_bubble 性别 × 年龄 × 信贷气泡图 气泡图
/api/stats/saving_checking_credit_scatter 储蓄 × 支票信贷散点图 散点图
/api/stats/job_purpose_credit_sankey 职业 → 用途 → 信贷桑基图 桑基图
/api/stats/job_duration_analysis 职业 × 期限分析 双轴柱状图
/api/stats/job_purpose_heatmap 职业 × 用途热力图 热力图

6.6 预测分析 API(4 个端点)

端点 方法 说明
/api/predict/cluster GET K-Means 聚类分析(k=4)
/api/predict/elbow GET 肘部法则(k=2~10)
/api/predict/credit_risk GET 随机森林信用风险预测
/api/predict/confusion_matrix GET 混淆矩阵

详细算法说明见[第 9 节](#第 9 节)。


7. 前端设计

7.1 设计系统

系统采用自定义 CSS 设计系统(static/css/style.css,1552 行),无第三方 CSS 框架。

颜色体系
变量名 色值 用途
--midnight #0c1222 主背景色(深色主题)
--gold #d4a574 强调色、品牌色
--indigo #6366f1 主要交互色
--teal #2dd4bf 积极指标
--coral #f87171 警告/消极指标
--violet #a78bfa 辅助强调色
字体系统
字体 用途
Cormorant Garamond 品牌标题(衬线体)
DM Sans 正文内容(无衬线体)
JetBrains Mono 数据展示(等宽体)
响应式断点
断点 适配
> 1200px 桌面端(3 列图表网格)
768px - 1200px 平板端(2 列)
< 768px 移动端(1 列,侧边栏折叠为汉堡菜单)
动画效果
  • fadeInUp:卡片进入动画
  • slideDown:面板展开
  • shimmer:加载骨架屏
  • spin:加载旋转
  • pulse:脉冲高亮
  • ripple:按钮点击波纹
  • 毛玻璃效果(backdrop-filter: blur):登录/注册卡片

7.2 页面结构

布局模板(base.html)
复制代码
┌──────────────────────────────────────────────────┐
│ ┌──────────┐ ┌──────────────────────────────────┐ │
│ │          │ │  顶栏:汉堡菜单 | 页面标题 | 日期  │ │
│ │  侧边栏   │ ├──────────────────────────────────┤ │
│ │          │ │                                  │ │
│ │  品牌Logo │ │                                  │ │
│ │          │ │          内容区域                  │ │
│ │  主功能   │ │     (block content)              │ │
│ │  - 看板   │ │                                  │ │
│ │  - 数据   │ │                                  │ │
│ │  - 预测   │ │                                  │ │
│ │          │ │                                  │ │
│ │  分析维度 │ │                                  │ │
│ │  - 人口   │ │                                  │ │
│ │  - 财务   │ │                                  │ │
│ │  - 信贷   │ │                                  │ │
│ │  - 统计   │ │                                  │ │
│ │          │ │                                  │ │
│ │  用户信息 │ │                                  │ │
│ │  退出登录 │ │                                  │ │
│ └──────────┘ └──────────────────────────────────┘ │
└──────────────────────────────────────────────────┘
登录/注册页

独立页面(不继承 base.html),采用全屏背景图 + 毛玻璃卡片设计:

  • 左侧:品牌标识 + 登录/注册表单
  • 右侧:装饰性统计数字(1000 样本、8+ 维度、4 种风险类型)
  • 背景:auth-bg.jpg + 网格覆盖层 + 发光效果
数据看板(dashboard.html)
  • 顶部:4 个统计卡片(总客户数、平均年龄、平均信贷、平均期限),带数字递增动画
  • 标签导航:5 个维度标签页,支持懒加载(首次切换时加载图表)
  • 图表网格:每行 3 列,部分全宽图表跨越整行
  • 加载状态:标签切换时显示进度条动画,图表加载时显示旋转图标
数据管理页(data_manage.html)
  • 搜索框(300ms 防抖)
  • 分页数据表格(每页 20 条)
  • 新增/编辑模态框(9 个表单字段)
  • 删除确认对话框
  • Toast 通知(成功/错误)
预测分析页(predict.html)
  • K-Means 聚类区域:散点图 + 肘部图 + 聚类摘要卡片
  • 风险预测区域:指标行 + 特征重要性图 + 风险分布饼图 + 混淆矩阵热力图 + 准确率仪表盘
  • 两个区域各有"运行分析"按钮,触发并行 API 请求

8. 数据可视化

8.1 图表类型总览

系统使用 ECharts 5.4.3 实现了 60+ 张交互式图表,涵盖以下类型:

图表类型 数量 应用场景
柱状图/条形图 18 分布统计、分组对比
饼图/环形图 8 占比分布
散点图/气泡图 6 相关性分析、聚类展示
热力图 6 交叉分析、相关矩阵
箱线图 4 分布离散程度
旭日图 4 多层级关系
雷达图 3 多维画像
堆叠柱状图 3 构成分析
桑基图 1 流向关系
漏斗图 1 转化/分布
仪表盘 2 综合评分
树图 1 层级占比
玫瑰图 1 极坐标分布
双轴柱状图 1 多指标对比
直方图 2 频率分布

8.2 图表渲染机制

  1. 懒加载:图表仅在对应标签页首次激活时初始化,避免首屏加载过慢
  2. 异步数据 :每个图表通过 fetch() 调用对应的 /api/stats/* 端点获取数据
  3. 响应式 :监听 window.resize 事件,自动调整图表尺寸
  4. 主题适配:统一使用深色主题配色,与整体 UI 风格一致
  5. 交互特性:支持悬浮提示(Tooltip)、图例筛选、数据缩放

8.3 关键图表说明

信贷健康评分仪表盘

综合 5 个维度的加权评分(0-100 分):

维度 权重 计算方式
储蓄充足度 25% rich/quite rich 占比
支票覆盖度 20% rich/moderate 占比
住房自有率 20% own 占比
低信贷比例 15% 低于中位数的比例
短期限比例 20% 低于中位数的比例
相关性矩阵

对 9 个编码后的数值特征计算 Pearson 相关系数:

  • 特征:age, sex, job, housing, saving_accounts, checking_account, credit_amount, duration, purpose
  • 分类特征通过 LabelEncoder 转换为数值
职业 → 用途 → 信贷桑基图

三层层级流向图:

  • 第一层:职业类型(4 类)
  • 第二层:贷款用途(8 类)
  • 第三层:信贷等级(低/中/高)

9. 机器学习模块

9.1 K-Means 客户聚类

端点/api/predict/cluster

算法配置:

  • 算法:KMeans
  • 簇数:k=4
  • 随机种子:42
  • 初始化次数:n_init=10

特征工程:

特征 类型 预处理
age 数值 StandardScaler 标准化
job 数值 StandardScaler 标准化
credit_amount 数值 StandardScaler 标准化
duration 数值 StandardScaler 标准化
sex 分类 LabelEncoder → StandardScaler
housing 分类 LabelEncoder → StandardScaler

输出:

  • 散点图数据(credit_amount vs duration,按簇着色)
  • 聚类摘要:每个簇的客户数、平均年龄、平均信贷、平均期限
  • 惯性值(Inertia)

簇命名规则: 按信贷金额和年龄排序动态分配标签。

9.2 肘部法则

端点/api/predict/elbow

测试 k=2 到 k=10 的惯性值,用于辅助确定最优簇数。返回各 k 值对应的 inertia 值,前端绘制肘部曲线图。

9.3 信用风险预测

端点/api/predict/credit_risk

风险标签构造(规则引擎):

python 复制代码
risk_score = 0
if credit_amount > median_credit:
    risk_score += 1
if duration > median_duration:
    risk_score += 1
risk_score += saving_risk  # rich/quite_rich=0, moderate=1, little=2
high_risk = 1 if risk_score >= 3 else 0

特征矩阵(8 个特征):

特征 预处理
age 原始值
job 原始值
credit_amount 原始值
duration 原始值
sex LabelEncoder
housing LabelEncoder
saving_accounts LabelEncoder
checking_account LabelEncoder

模型配置:

  • 算法:RandomForestClassifier
  • 树数量:100
  • 随机种子:42
  • 训练/测试划分:80/20

输出:

  • 模型准确率
  • 特征重要性排名(柱状图)
  • 风险分布(饼图:低风险 vs 高风险)
  • 混淆矩阵(2×2 热力图)

9.4 模型评估

混淆矩阵结构:

预测低风险 预测高风险
实际低风险 TN FP
实际高风险 FN TP

10. 配置与部署

10.1 应用配置

配置定义在 config.py 中:

python 复制代码
class Config:
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'german-credit-analysis-secret-key-2024'
    SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(BASE_DIR, 'credit_data.db')
    SQLALCHEMY_TRACK_MODIFICATIONS = False
    DATA_CSV_PATH = os.path.join(BASE_DIR, 'data', 'german_credit_data.csv')
配置项 说明 生产环境建议
SECRET_KEY 会话加密密钥 必须通过环境变量设置强随机值
SQLALCHEMY_DATABASE_URI 数据库连接字符串 生产环境建议切换至 PostgreSQL/MySQL
SQLALCHEMY_TRACK_MODIFICATIONS 禁用修改追踪 保持 False
DATA_CSV_PATH CSV 数据文件路径 仅初始化时使用

10.2 安装与运行

环境要求
  • Python 3.8+
  • pip
安装步骤
bash 复制代码
# 1. 克隆或下载项目
cd code

# 2. 创建虚拟环境(推荐)
python -m venv venv
venv\Scripts\activate        # Windows
# source venv/bin/activate   # Linux/Mac

# 3. 安装依赖
pip install -r requirements.txt

# 4. 初始化数据库
python init_db.py

# 5. 启动应用
python app.py
访问地址
  • 应用地址:http://localhost:5004
  • 默认管理员:用户名 admin,密码 admin123

10.3 生产部署建议

bash 复制代码
# 使用 Gunicorn(Linux/Mac)
pip install gunicorn
gunicorn -w 4 -b 0.0.0.0:5004 "app:create_app()"

# 使用 Waitress(Windows)
pip install waitress
waitress-serve --port=5004 app:create_app

生产环境清单:

  • 设置强随机 SECRET_KEY 环境变量
  • 关闭调试模式(debug=False
  • 切换数据库至 PostgreSQL 或 MySQL
  • 配置 HTTPS(Nginx 反向代理 + SSL 证书)
  • 添加 CSRF 保护(Flask-WTF)
  • 配置日志记录
  • 添加请求频率限制
  • 配置静态文件 CDN

11. 已知问题与改进方向

11.1 已知问题

问题 严重程度 说明
ML 模型每次请求重新训练 K-Means 和 RandomForest 在每次 API 调用时重新 fit,高并发下性能差
无 CSRF 保护 POST 端点缺少 CSRF Token 验证
密钥硬编码 SECRET_KEY 有默认值回退,生产环境存在安全风险
单文件架构 app.py 1326 行,所有路由和业务逻辑集中在一个文件
无 API 限流 缺少请求频率限制,可能被滥用
默认管理员密码 init_db.py 硬编码 admin/admin123

11.2 改进方向

架构优化
  • app.py 拆分为 Flask Blueprint:
    • auth.py:认证路由
    • dashboard.py:看板路由
    • data_api.py:数据 CRUD API
    • stats_api.py:统计分析 API
    • predict_api.py:预测分析 API
  • 引入应用配置分层(开发/测试/生产)
性能优化
  • 模型持久化:训练后序列化保存(joblib),避免重复训练
  • 统计结果缓存:使用 functools.lru_cache 或 Redis 缓存高频查询
  • 数据库索引:为 credit_data 表的 purposesexhousing 等常用查询字段添加索引
安全增强
  • 集成 Flask-WTF 添加 CSRF 保护
  • 移除 SECRET_KEY 硬编码默认值
  • 添加 API 请求频率限制(Flask-Limiter)
  • 实施密码复杂度策略
功能扩展
  • 数据导出(CSV/Excel)
  • 自定义图表配置(维度选择、图表类型切换)
  • 更多 ML 模型(逻辑回归、SVM、XGBoost)
  • 模型性能对比面板
  • 定时数据刷新
  • 多语言支持

附录 A:API 端点完整索引

共计 51 个路由:11 个页面路由 + 40 个 API 端点。

编号 端点 方法 类别
1 / GET 页面
2 /login GET, POST 认证
3 /register GET, POST 认证
4 /logout GET 认证
5 /dashboard GET 页面
6 /dashboard/demographics GET 页面
7 /dashboard/financial GET 页面
8 /dashboard/credit GET 页面
9 /dashboard/stats GET 页面
10 /data GET 页面
11 /predict GET 页面
12 /api/data/list GET CRUD
13 /api/data/add POST CRUD
14 /api/data/update POST CRUD
15 /api/data/delete POST CRUD
16-47 /api/stats/* GET 统计(32 个)
48 /api/predict/cluster GET 预测
49 /api/predict/elbow GET 预测
50 /api/predict/credit_risk GET 预测
51 /api/predict/confusion_matrix GET 预测

附录 B:依赖清单

复制代码
flask==3.0.0
flask-sqlalchemy==3.1.1
flask-login==0.6.3
werkzeug==3.0.1
pandas==2.1.4
numpy==1.26.2
scikit-learn==1.3.2
matplotlib==3.8.2
seaborn==0.13.0

附录 C:数据字段编码对照表

职业类型(Job)

编码 含义
0 非技术工 - 非居民
1 非技术工 - 居民
2 技术工
3 高技能工

储蓄账户等级(Saving accounts)

等级 说明
little 少量储蓄
moderate 中等储蓄
quite rich 较多储蓄
rich 大量储蓄

支票账户等级(Checking account)

等级 说明
little 少量余额
moderate 中等余额
rich 大量余额

贷款用途(Purpose)

用途 说明
car 购车
radio/TV 电子产品
furniture/equipment 家具/设备
business 商业经营
education 教育
repairs 维修
vacation/others 度假/其他
domestic appliances 家用电器
相关推荐
ch.ju4 小时前
Java Programming Chapter 4——Composition of objects
java·开发语言
qq_401700414 小时前
Qt 中获取程序路径、用户目录、桌面路径等常用特殊路径
开发语言·qt
Highcharts.js4 小时前
音频可视化图表开发|基于 Highcharts 内置音频合成器制作音乐排行榜图代码
javascript·信息可视化·音视频·highcharts
子午4 小时前
基于YOLO的车牌识别检测~Python+YOLOV8算法+车牌定位+车牌检测+深度学习
python·算法·yolo
weixin_307779134 小时前
OCR图片文本提取代码
图像处理·python·opencv·自动化·ocr
ZC跨境爬虫4 小时前
模块化烹饪小程序开发日记 Day3:(Flask后端初始化、数据库配置与自定义日志系统搭建)
前端·javascript·数据库·后端·python·flask
格林黄4 小时前
语音电子病历python_websocket实现
开发语言·python·websocket
JavaEdge.4 小时前
07-LangChain Toolkit 实战:从工具函数到 Python Agent,再到 SQL Agent
python·sql·langchain
listhi5204 小时前
基于NSGA-II的多目标整数规划MATLAB实现
开发语言·matlab