220-基于Python的诺贝尔奖数据可视化分析系统

基于Python的诺贝尔奖数据可视化分析系统 --- 技术文档

1. 项目概述

1.1 项目背景

诺贝尔奖自 1901 年首次颁发以来,已有超过百年的历史,涵盖物理学、化学、生理学或医学、文学、和平、经济学六大领域。本系统旨在通过数据可视化技术,对诺贝尔奖获奖数据进行多维度分析,帮助用户直观了解百年学术荣耀的数据规律。

1.2 项目目标

  • 提供完整的诺贝尔奖数据浏览与管理功能
  • 实现多维度数据可视化分析(年度趋势、地理分布、人口统计、交叉对比)
  • 支持全屏可视化大屏展示
  • 提供用户认证与角色权限管理(普通用户 + 管理员)
  • 支持数据的 CSV 导入/导出

1.3 技术选型

层次 技术 版本 说明
后端框架 FastAPI 0.104.1 高性能异步 Web 框架
模板引擎 Jinja2 3.1.2 服务端 HTML 模板渲染
前端框架 Bootstrap 5.x 响应式 CSS 组件库
图表库 ECharts 5.x 百度开源可视化图表库
图标库 Bootstrap Icons 精简版 约 400 个常用图标
数据库 MySQL 5.7+ 关系型数据库
数据库驱动 PyMySQL 1.1.0 Python MySQL 连接器
数据分析 Pandas 2.1.4 数据处理与分析库
数值计算 NumPy 1.25.2 科学计算库
密码加密 Passlib + bcrypt 1.7.4 安全密码哈希
ASGI 服务器 Uvicorn 0.24.0 异步 HTTP 服务器
配置管理 PyYAML 6.0.1 YAML 配置文件解析

2. 系统架构

2.1 整体架构

系统采用 MVC(Model-View-Controller) 架构模式:

复制代码
┌──────────────────────────────────────────────┐
│                  浏览器 (Browser)               │
│          HTML + Bootstrap + ECharts            │
└────────────────────┬─────────────────────────┘
                     │ HTTP
┌────────────────────▼─────────────────────────┐
│              FastAPI 路由层 (main.py)           │
│  ┌─────────┐ ┌──────────┐ ┌───────────────┐  │
│  │ 认证路由 │ │ 分析路由  │ │ 管理/API 路由  │  │
│  └────┬────┘ └─────┬────┘ └──────┬────────┘  │
│       │            │              │            │
│  ┌────▼────────────▼──────────────▼────────┐  │
│  │         业务逻辑 + Pandas 数据处理         │  │
│  └────────────────┬───────────────────────┘  │
└───────────────────┼──────────────────────────┘
                    │
┌───────────────────▼──────────────────────────┐
│           数据层 (database.py)                  │
│  ┌──────────────┐  ┌─────────────────────┐   │
│  │   用户管理    │  │    数据集管理         │   │
│  └──────────────┘  └─────────────────────┘   │
└───────────────────┬──────────────────────────┘
                    │ PyMySQL
┌───────────────────▼──────────────────────────┐
│              MySQL 数据库                       │
│    design_220_nobel (users + dataset_data)     │
└──────────────────────────────────────────────┘

2.2 目录结构

复制代码
code/
├── main.py                     # FastAPI 主路由文件(所有 Web 路由)
├── database.py                 # 数据库操作类(用户管理 + 数据管理)
├── config.yaml                 # 项目配置文件(数据库、字段、模块开关)
├── run.py                      # 项目启动脚本(依赖检查 + uvicorn 启动)
├── requirements.txt            # Python 依赖列表
├── data/
│   └── nobel.csv               # 诺贝尔奖原始数据集
├── static/
│   ├── css/
│   │   ├── bootstrap.min.css   # Bootstrap 5 CSS
│   │   ├── bootstrap-icons.css # Bootstrap Icons(精简版)
│   │   ├── boxicons.min.css    # Boxicons CSS
│   │   └── style.css           # 项目主题样式(金色主题)
│   ├── js/
│   │   ├── bootstrap.bundle.min.js  # Bootstrap JS
│   │   └── echarts.min.js      # ECharts 图表库
│   └── image/
│       └── index.png           # 首页装饰图
└── templates/
    ├── base.html               # 基础模板(导航栏 + 页脚)
    ├── index.html              # 首页
    ├── login.html              # 登录页
    ├── register.html           # 注册页
    ├── profile.html            # 个人资料页
    ├── edit_profile.html       # 编辑资料页
    ├── change_password.html    # 修改密码页
    ├── analytics.html          # 数据分析概览页
    ├── award_overview.html     # 获奖概览分析页
    ├── geographic.html         # 地理分布分析页
    ├── demographics.html       # 人口统计分析页
    ├── correlations.html       # 综合对比分析页
    ├── dashboard.html          # 全屏可视化大屏
    ├── data_manage.html        # 数据管理列表页
    ├── data_manage_edit.html   # 数据新增/编辑页
    └── admin/
        ├── dashboard.html      # 管理控制台
        └── users.html          # 用户管理页

2.3 模块划分

模块 功能 状态
auth 用户认证(登录、注册、登出、密码管理) 启用
analytics 数据分析(4 个分析页面 + 概览) 启用
data_manage 数据管理(CRUD + CSV 导入/导出) 启用
dashboard 全屏可视化大屏 启用
prediction 机器学习预测 未启用
model_evaluation 模型评估 未启用

2.4 演示图片

























3. 数据库设计

3.1 数据库信息

  • 数据库名称design_220_nobel
  • 字符集:utf8mb4
  • 存储引擎:InnoDB

3.2 表结构

3.2.1 用户表 users
字段名 类型 约束 说明
id INT PRIMARY KEY, AUTO_INCREMENT 用户唯一标识
username VARCHAR(100) UNIQUE, NOT NULL 用户名(3-20字符)
email VARCHAR(200) UNIQUE, NOT NULL 邮箱地址
password_hash VARCHAR(255) NOT NULL bcrypt 加密后的密码哈希
role VARCHAR(20) DEFAULT 'user' 角色:user / admin
status VARCHAR(20) DEFAULT 'active' 状态:active / disabled
full_name VARCHAR(100) DEFAULT '' 姓名
phone VARCHAR(30) DEFAULT '' 手机号
gender VARCHAR(20) DEFAULT '' 性别
age INT NULL 年龄
bio TEXT NULL 个人简介
last_login_at DATETIME NULL 最后登录时间
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP 注册时间
3.2.2 数据集表 dataset_data

该表字段根据 config.yaml 中的 features 配置动态生成:

字段名 类型 说明
id INT (AUTO_INCREMENT) 记录唯一标识
awardyear DOUBLE 获奖年份
category VARCHAR(200) 奖项类别
name TEXT 获奖者姓名
gender VARCHAR(200) 性别
birth_continent VARCHAR(200) 出生洲
birth_countrynow VARCHAR(200) 出生国家(现名)
prizeamount DOUBLE 奖金金额(瑞典克朗)
prizeamountadjusted DOUBLE 调整后奖金
motivation TEXT 获奖理由
ind_or_org VARCHAR(200) 个人/组织
birth_date TEXT 出生日期
death_date TEXT 逝世日期
affiliation_1 TEXT 所属机构
portion VARCHAR(200) 奖金份额(1, 1/2, 1/3, 1/4)
created_at TIMESTAMP 记录创建时间

注意:MySQL 存储时字段名自动转为小写(如 awardYearawardyear)。

3.3 ER 关系

系统中 users 表和 dataset_data 表之间没有直接的外键关系。users 表管理系统用户,dataset_data 表存储诺贝尔奖数据记录。两张表通过权限控制逻辑关联------只有 admin 角色用户可以对 dataset_data 进行增删改操作。

3.4 默认数据

系统启动时自动创建默认管理员账户:

  • 用户名:admin
  • 密码:admin123
  • 角色:admin

4. 功能模块

4.1 用户认证模块

功能说明
  • 登录:用户名 + 密码认证,Session 存储登录状态
  • 注册:支持填写用户名、邮箱、密码、姓名、手机、性别、年龄、简介
  • 登出:清除 Session 后重定向到登录页
  • 修改密码:需验证原密码
  • 编辑资料:修改姓名、手机、性别、年龄、邮箱、简介
安全机制
  • 密码使用 bcrypt 算法加密存储
  • Session 中间件使用 secret key 签名
  • 服务端表单验证(用户名长度、邮箱格式、密码长度)
  • 账号禁用状态检查(status = disabled 的用户无法登录)

4.2 数据分析模块

4.2.1 分析概览页(analytics.html)
  • 4 个统计卡片:总记录数、年份跨度、奖项类别数、国家数
  • 2 个饼图:奖项类别分布、性别分布
  • 4 个导航卡片:快速进入各详细分析页面
4.2.2 获奖概览分析(award_overview.html)
  • 年度获奖人数趋势:折线图 + 面积填充 + 数据缩放
  • 奖项类别分布:环形饼图
  • 平均奖金金额趋势:折线图(调整后金额)
  • 各类别年度获奖趋势:堆叠面积图
4.2.3 地理分布分析(geographic.html)
  • 各国获奖人数 TOP30:横向柱状图
  • 各洲获奖分布:环形饼图
  • TOP10 国家各类别获奖对比:堆叠柱状图
4.2.4 人口统计分析(demographics.html)
  • 性别分布:环形饼图
  • 个人 vs 组织:环形饼图
  • 获奖年龄分布:柱状图(5 年一组)
  • 各类别平均获奖年龄:横向柱状图
  • 男女获奖者年度趋势:折线图 + 数据缩放
4.2.5 综合对比分析(correlations.html)
  • 各类别性别对比:分组柱状图
  • 各洲获奖类别对比:堆叠柱状图
  • 各年代获奖类别分布:堆叠柱状图
4.2.6 年份筛选功能

所有 4 个分析页面均支持年份区间筛选:

  • 页面顶部提供起始年份和结束年份两个下拉选择器
  • 选择后通过 URL 参数 ?year_start=1950&year_end=2000 传递
  • 后端 Pandas DataFrame 在生成图表数据前进行过滤
  • 默认不筛选,显示全部年份数据

4.3 可视化大屏模块

全屏展示核心数据指标和动态图表:

  • 顶部统计条:总记录数、年份范围、类别数、国家数
  • 奖项类别分布饼图
  • 性别分布饼图
  • 各洲分布饼图
  • 年度趋势折线图
  • 各国 TOP15 柱状图
  • 近期获奖者列表

4.4 数据管理模块

功能说明(仅管理员可用)
  • 数据列表:分页展示(每页 20 条),支持按姓名/类别/国家搜索
  • 新增数据:表单填写所有字段后插入数据库
  • 编辑数据:修改已有记录的任意字段
  • 删除数据:确认后删除单条记录
  • CSV 导入 :将 data/nobel.csv 批量导入数据库(200 条/批)
  • CSV 导出:将数据库中所有记录导出为 CSV 文件下载

4.5 管理控制台模块

功能说明(仅管理员可用)
  • 统计概览:注册用户数、数据记录数、奖项类别数
  • 各年代获奖记录图表:ECharts 柱状图展示各年代数据量
  • 最近注册用户:最近 5 位注册用户列表(用户名、角色、注册时间)
  • 快捷操作:一键跳转到用户管理、数据管理、数据分析、可视化大屏
  • 系统信息:项目名称、技术栈、数据库名、端口号

4.6 用户管理模块

功能说明(仅管理员可用)
  • 创建用户:管理员可直接创建新用户并指定角色
  • 角色管理:下拉菜单切换用户角色(user / admin)
  • 状态管理:启用/禁用用户账号
  • 重置密码 :将用户密码重置为默认值 123456
  • 删除用户:删除用户账号(不可删除自己)

5. API 路由表

5.1 页面路由

方法 路径 功能 权限
GET / 首页 公开
GET /login 登录页 公开
POST /login 登录提交 公开
GET /register 注册页 公开
POST /register 注册提交 公开
GET /logout 登出 需登录
GET /profile 个人资料 需登录
GET /edit_profile 编辑资料页 需登录
POST /edit_profile 编辑资料提交 需登录
GET /change_password 修改密码页 需登录
POST /change_password 修改密码提交 需登录

5.2 数据分析路由

方法 路径 功能 权限
GET /analytics 数据分析概览 公开
GET /analytics/award_overview 获奖概览分析 公开
GET /analytics/geographic 地理分布分析 公开
GET /analytics/demographics 人口统计分析 公开
GET /analytics/correlations 综合对比分析 公开
GET /dashboard 全屏可视化大屏 公开

分析页面支持可选参数 ?year_start=&year_end= 进行年份筛选。

5.3 数据管理路由

方法 路径 功能 权限
GET /data_manage 数据管理列表 管理员
GET /data_manage/add 新增数据页 管理员
POST /data_manage/add 新增数据提交 管理员
GET /data_manage/edit/{id} 编辑数据页 管理员
POST /data_manage/edit/{id} 编辑数据提交 管理员
POST /data_manage/delete/{id} 删除数据 管理员
GET /data_manage/export_csv 导出 CSV 文件 管理员
POST /data_manage/import_csv 从 CSV 导入数据 管理员

5.4 管理员路由

方法 路径 功能 权限
GET /admin 管理控制台 管理员
GET /admin/users 用户管理 管理员
POST /admin/users/create 创建用户 管理员
POST /admin/users/{id}/role 修改用户角色 管理员
POST /admin/users/{id}/status 修改用户状态 管理员
POST /admin/users/{id}/reset_password 重置密码 管理员
POST /admin/users/{id}/delete 删除用户 管理员

5.5 API 端点(JSON 响应)

方法 路径 功能 权限
GET /api/overview 数据概览(类别/国家/年度统计) 公开
GET /api/map_data 各国获奖人数(地图数据) 公开

6. 页面说明

6.1 公开页面

页面 模板文件 说明
首页 index.html Hero 区域 + 核心功能介绍 + 数据概况统计(动态)
登录 login.html 左侧装饰面板 + 右侧登录表单
注册 register.html 左侧装饰面板 + 右侧多字段注册表单
分析概览 analytics.html 4 个统计卡片 + 2 个饼图 + 4 个导航卡片
获奖概览 award_overview.html 年份筛选器 + 4 个 ECharts 图表
地理分布 geographic.html 年份筛选器 + 3 个 ECharts 图表
人口统计 demographics.html 年份筛选器 + 5 个 ECharts 图表
综合对比 correlations.html 年份筛选器 + 3 个 ECharts 图表
可视化大屏 dashboard.html 深色主题全屏布局,核心指标 + 多图表

6.2 用户页面

页面 模板文件 说明
个人资料 profile.html 头像 + 用户信息表格 + 操作按钮
编辑资料 edit_profile.html 表单编辑个人信息
修改密码 change_password.html 原密码 + 新密码 + 确认密码

6.3 管理员页面

页面 模板文件 说明
管理控制台 admin/dashboard.html 统计卡片 + 年代图表 + 最近用户 + 快捷操作
用户管理 admin/users.html 创建用户表单 + 用户列表(角色/状态/操作)
数据管理 data_manage.html 搜索 + 导入/导出 + 数据表格 + 分页
数据编辑 data_manage_edit.html 动态表单(根据 config 字段自动生成)

7. 部署指南

7.1 环境要求

  • Python:3.8 及以上版本
  • MySQL:5.7 及以上版本
  • 操作系统:Windows / Linux / macOS

7.2 安装步骤

第一步:创建 MySQL 数据库

登录 MySQL 并执行以下命令:

sql 复制代码
CREATE DATABASE IF NOT EXISTS design_220_nobel CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;

如果数据库用户和密码与默认配置不同,请修改 config.yaml 中的数据库连接信息。

第二步:安装 Python 依赖
bash 复制代码
cd code
pip install -r requirements.txt

依赖列表:

包名 版本 用途
fastapi 0.104.1 Web 框架
uvicorn 0.24.0 ASGI 服务器
jinja2 3.1.2 模板引擎
python-multipart 0.0.6 表单数据解析
pandas 2.1.4 数据处理
numpy 1.25.2 数值计算
passlib[bcrypt] 1.7.4 密码加密
pymysql 1.1.0 MySQL 连接器
pyyaml 6.0.1 YAML 配置解析
aiofiles 23.2.1 异步文件处理
python-dotenv 1.0.0 环境变量加载
第三步:确认数据文件

确保 code/data/nobel.csv 文件存在。该文件是诺贝尔奖原始数据集,系统启动时会从此文件加载数据进行分析。

第四步:启动系统
bash 复制代码
cd code
python run.py

启动后控制台将输出:

复制代码
==================================================
诺贝尔奖数据可视化分析系统
==================================================
✓ 所有依赖已安装
✓ 数据文件检查通过
✓ 目录结构检查完成

启动系统...
访问地址: http://localhost:8000
按 Ctrl+C 停止服务
第五步:初始化数据
  1. 打开浏览器访问 http://localhost:8000
  2. 使用默认管理员账号登录:admin / admin123
  3. 进入「数据管理」页面,点击「从CSV导入数据」按钮
  4. 等待导入完成,即可查看完整数据

7.3 访问地址

页面 地址
首页 http://localhost:8000
登录 http://localhost:8000/login
数据分析 http://localhost:8000/analytics
可视化大屏 http://localhost:8000/dashboard
管理控制台 http://localhost:8000/admin

8. 配置说明

配置文件为 config.yaml,各字段含义如下:

8.1 项目配置 project

yaml 复制代码
project:
  id: '220'              # 项目编号
  name: 诺贝尔奖数据可视化分析系统  # 项目名称(显示在导航栏和页面标题)
  name_en: nobel          # 英文短名
  stack: fastapi_bootstrap  # 技术栈标识
  db_name: design_220_nobel  # MySQL 数据库名
  db_host: localhost      # 数据库主机
  db_port: 3306           # 数据库端口
  db_user: root           # 数据库用户名
  db_password: '123456'   # 数据库密码
  port: 8000              # Web 服务端口
  theme_color: '#B8860B'  # 主题色(金色)

8.2 数据集配置 dataset

yaml 复制代码
dataset:
  file: nobel.csv         # CSV 数据文件名(相对于 data/ 目录)
  target_column: category # 目标列(分类列)
  target_labels:          # 目标值的中文映射
    Physics: 物理学
    Chemistry: 化学
    ...
  features:               # 特征字段列表
  - key: awardYear        # 字段键名(对应 CSV 列名)
    label: 获奖年份        # 中文标签(前端显示)
    type: numeric          # 字段类型:numeric / categorical / text / binary
    unit: 年               # 单位(可选)
    range: [1901, 2025]   # 取值范围(可选,numeric 类型)
  - key: category
    label: 奖项类别
    type: categorical
    options:              # 可选值列表(categorical 类型)
    - Physics
    - Chemistry
    ...

字段类型与数据库映射

字段类型 数据库类型 说明
numeric DOUBLE 数值型
categorical VARCHAR(200) 类别型(有限选项)
text TEXT 文本型(长文本)
binary INT 二值型(0/1)

8.3 模块配置 modules

yaml 复制代码
modules:
  auth: true              # 用户认证模块
  roles: [user, admin]    # 支持的角色列表
  prediction: false       # 预测模块(未启用)
  analytics: true         # 数据分析模块
  data_manage: true       # 数据管理模块
  model_evaluation: false # 模型评估(未启用)
  dashboard: true         # 可视化大屏模块

8.4 分析页面配置 analysis_pages

yaml 复制代码
analysis_pages:
- route: award_overview     # URL 路由名
  title: 获奖概览           # 页面标题
  description: ...          # 页面描述
  columns:                  # 使用的数据列
  - awardYear
  - category
  - prizeAmount
- route: geographic
  title: 地理分布分析
  has_map: true            # 是否包含地图
  columns: [birth_countryNow, birth_continent]
...

附录

A. 主题色配色方案

系统使用金色(Nobel Gold)主题,完整调色板:

变量 色值 用途
--primary #AE7F0A 主色
--primary-dark #B8860B 主色深
--primary-darker #6E5006 主色更深
--primary-light #DCA00D 主色浅
--primary-lighter #FFC910 主色更浅
--accent #F97316 强调色(橙)
--success #059669 成功色(绿)
--warning #D97706 警告色(琥珀)
--danger #DC2626 危险色(红)
--info #0891B2 信息色(青)

B. ECharts 图表配色

所有分析页面统一使用以下配色数组:

javascript 复制代码
var chartColors = ['#B8860B', '#DCA00D', '#F97316', '#059669', '#0891B2', '#DC2626'];

C. 默认账户

用户名 密码 角色
admin admin123 管理员
相关推荐
m0_531237172 小时前
C语言-编程实例
c语言·开发语言·数据结构
风轻扬7772 小时前
SqlAlchemy异步IO
python·异步io
bai_lan_ya2 小时前
嵌入式linux学习--makefile的使用以及通用解析
开发语言·前端·javascript
waves浪游2 小时前
库制作与原理(上)
linux·运维·服务器·开发语言·c++
27669582922 小时前
微博评论采集
开发语言·python·微博·微博评论·微博评论采集
山北雨夜漫步2 小时前
MQ消息队列
java·开发语言
我的xiaodoujiao2 小时前
使用 Python 语言 从 0 到 1 搭建完整 Web UI自动化测试学习系列 51--CI/CD 4--推送本地代码到Git远程仓库
python·学习·测试工具·ci/cd·pytest
reasonsummer2 小时前
【办公类-109-10】20260228圆牌被子牌(接送卡&被子卡&床卡&入园卡_word编辑单面_添加有效期)
python·word