基于 PDFormer(Transformer 架构)的多元时间序列交通流量预测系统,提供完整的 Web 管理界面,支持历史数据查询、流量预测、统计分析及系统管理功能。
技术栈
| 层级 | 技术 |
|---|---|
| 后端框架 | Python FastAPI |
| 数据库 ORM | SQLAlchemy 2.x |
| 数据库 | MySQL 8.x(utf8mb4) |
| 身份认证 | JWT(python-jose) + bcrypt |
| 预测模型 | PDFormer(PyTorch) |
| 前端 | 原生 HTML / CSS / JavaScript |
| 图表 | ECharts 5 |
项目结构
plain
web_app/
├── .env # 本地环境变量(数据库密码等)
├── requirements.txt # Python 依赖
├── import_dyna.py # 历史交通数据批量导入工具
├── database/
│ └── init.sql # 数据库建表 + 初始化数据脚本
├── backend/
│ ├── main.py # FastAPI 入口,路由挂载,静态文件服务
│ ├── config.py # 全局配置(读取 .env)
│ ├── database.py # SQLAlchemy 引擎与会话
│ ├── core/
│ │ ├── security.py # 密码哈希、JWT 生成/解析
│ │ └── deps.py # FastAPI 依赖注入(DB会话、当前用户)
│ ├── models/ # SQLAlchemy ORM 模型
│ │ ├── user.py # 用户表
│ │ ├── traffic.py # 数据集、传感器、历史流量表
│ │ └── prediction.py # 预测记录、预测结果表
│ ├── schemas/ # Pydantic 请求/响应模型
│ │ ├── user.py
│ │ ├── traffic.py
│ │ └── prediction.py
│ ├── services/ # 业务逻辑层
│ │ ├── auth_service.py # 注册、登录、初始化管理员
│ │ ├── traffic_service.py # 数据集、传感器、历史查询、统计
│ │ └── prediction_service.py # 模型推理(含模拟模式回退)
│ └── routers/ # API 路由层
│ ├── auth.py # /api/auth/*
│ ├── users.py # /api/users/*
│ ├── traffic.py # /api/traffic/*
│ ├── models.py # /api/models/*
│ └── predictions.py # /api/predictions/*
└── frontend/
├── login.html # 登录 / 注册页
├── index.html # 首页 Dashboard
├── pages/
│ ├── history.html # 历史交通数据查询
│ ├── prediction.html # 交通流量预测
│ ├── stats.html # 道路未来车流量统计
│ └── admin/
│ ├── users.html # 用户管理(管理员)
│ ├── data.html # 数据管理(管理员)
│ ├── models.html # 模型管理(管理员)
│ └── pred_records.html # 预测记录管理(管理员)
└── static/
├── css/style.css # 全局样式
└── js/
├── api.js # 前端 API 请求封装
└── utils.js # 工具函数(认证、格式化、省略号分页等)
环境要求
- Python 3.8 及以上
- MySQL 8.0 及以上
- 已训练好的 PDFormer 模型权重文件(可选,无则自动使用模拟模式)
快速启动
第一步:初始化数据库
使用任意 MySQL 客户端执行:
sql
source web_app/database/init.sql
该脚本会自动创建 traffic_predict 数据库及所有表,并写入数据集、传感器节点、模型的初始数据。
第二步:配置环境变量
在 web_app/ 目录下创建 .env 文件:
plain
DB_HOST=localhost
DB_PORT=3306
DB_USER=root
DB_PASSWORD=你的MySQL密码
DB_NAME=traffic_predict
SECRET_KEY=traffic-predict-secret-key-2026-jay
ADMIN_PASSWORD=Admin@2026
ADMIN_PASSWORD是系统首次启动时自动创建的管理员密码,用户名固定为admin。
第三步:安装 Python 依赖
bash
pip install -r requirements.txt
第四步:导入历史交通数据
系统自带 **批量导入工具 **import_dyna.py,支持将原始数据文件导入 MySQL,需在 web_app/ 目录下执行:
bash
# 导入 PeMS04(307个传感器,约521万条,2~3分钟)
python import_dyna.py PeMS04
# 快速演示:只导入前30个传感器(约51万条,~20秒)
python import_dyna.py PeMS04 30
# 导入 CHIBike(270个网格节点,约119万条,~1分钟)
python import_dyna.py CHIBike
# 导入 PeMS07 / PeMS08
python import_dyna.py PeMS07
python import_dyna.py PeMS08
支持的原始数据文件位于
MTFormer/raw_data/下,CHIBike 使用.grid网格格式,其余数据集使用.dyna点传感器格式。
各数据集原始数据量:
| 数据集 | 格式 | 节点数 | 采样间隔 | 数据量 |
|---|---|---|---|---|
| PeMS04 | .dyna(点传感器) | 307 | 5 分钟 | 约 521 万条 |
| PeMS07 | .dyna(点传感器) | 883 | 5 分钟 | 约 1500 万条 |
| PeMS08 | .dyna(点传感器) | 170 | 5 分钟 | 约 290 万条 |
| CHIBike | .grid(网格) | 270(15×18) | 30 分钟 | 约 119 万条 |
第五步:启动服务
在 web_app/ 目录下执行:
bash
uvicorn backend.main:app --host 0.0.0.0 --port 8000 --reload
启动成功后访问:http://localhost:8000
默认账号
| 用户名 | 密码 | 角色 |
|---|---|---|
| admin | Admin@2026 | 管理员 |
功能说明
登录 / 注册
- 支持新用户自主注册,填写用户名、邮箱、密码即可
- 登录后系统签发 JWT Token,存储于浏览器 localStorage,后续所有请求自动携带
- Token 有效期 24 小时,过期后自动跳转回登录页
- 管理员账号由系统启动时自动创建,普通用户注册后默认角色为"用户"

首页 Dashboard
- 顶部展示四项核心统计指标:注册用户数、已接入数据集数、历史流量记录总条数、累计预测次数
- 展示当前激活模型的名称、训练数据集、MAE / RMSE / MAPE 等关键性能指标
- 流量趋势折线图:展示近 7 天的交通流量走势
- 交通流量等级分布饼图:按"畅通 / 一般 / 拥堵"三级分类统计历史数据占比

历史交通数据查询
用户可按以下条件筛选历史交通记录:
- 数据集:选择 PeMS04 / CHIBike 等已接入的数据集
- 传感器节点:选择具体的道路传感器或网格节点
- 时间范围:设置查询的开始时间与结束时间,支持精确到分钟
查询结果以表格形式呈现(记录时间、流量、车速、占有率、星期等),支持省略号分页浏览。点击"绘制流量曲线"可将结果渲染为 ECharts 折线图。

交通流量预测
| 参数 | 说明 |
|---|---|
| 道路(传感器节点) | 选择需要预测的具体路段 |
| 预测起始时间 | 预测从哪个时间点开始 |
| 预测步数 | 每步 5 分钟,最多 12 步(60 分钟) |
| 星期 | 影响交通规律(工作日 vs 周末) |
| 天气 | 晴天 / 阴天 / 雨天 / 雪天 |
| 是否节假日 | 节假日与工作日车流规律不同 |
点击"开始预测"后,后端调用当前激活的 PDFormer 模型进行推理(或自动回退模拟模式),返回每步预测流量值,以数据表格 + 折线图双视图展示,本次预测记录自动入库。

道路未来车流量统计
在预测基础上进一步提供综合统计分析:
- KPI 指标卡:平均流量、最大流量、车流总量、预计高峰时段、车流趋势
- 未来交通流量折线图:各时间节点的预测车流量曲线
- 历史与未来对比图:预测数据与近期历史数据叠加对比
- 交通等级分析饼图:畅通(< 100辆)/ 一般(100~250辆)/ 拥堵(> 250辆)

用户管理(管理员)
- 查看所有注册用户,支持按用户名、邮箱关键词搜索
- 创建新用户、编辑用户信息(姓名、邮箱、角色)
- 禁用 / 启用账号、永久删除用户

数据管理(管理员)
- 展示已接入的所有交通数据集(名称、来源、节点数、采样间隔、记录总数)
- 选择数据集后可查看传感器节点列表
- 选择传感器后可预览该节点的近期历史流量数据(省略号分页)
若数据未导入,记录总数显示"未导入",页面提示通过
import_dyna.py导入数据。

模型管理(管理员)
- 展示所有已录入的预测模型,含模型类型、训练数据集、实验编号、训练轮次、耗时等信息
- 每个模型展示完整评估指标:Masked MAE / MAPE / RMSE
- 模型性能对比图:柱状图+折线图同时对比各模型表现,无指标数据的模型以灰色占位
- 激活操作:将指定模型设为系统当前预测模型

预测记录管理(管理员)
- 查看所有用户发起的历史预测记录(发起用户、路段、时间、步数、使用模型、平均流量)
- 点击"查看详情":弹窗展示该次预测的逐步结果(时间点 + 流量值 + 折线图)
- 支持删除预测记录(同步删除关联的结果详情)

预测模型说明
系统集成两个已训练的 PDFormer 模型:
| 模型 | 训练数据集 | 节点数 | Masked MAE | Masked RMSE |
|---|---|---|---|---|
| PDFormer-PeMS04 | 加州 PeMS04(307个传感器) | 307 | 16.51 | 26.82 |
| PDFormer-CHIBike | 芝加哥共享单车(270个网格) | 270 | 2.15 | 3.87 |
模型加载机制:
- 系统启动时自动尝试加载
MTFormer/libcity/cache/9056/model_cache/PDFormer_PeMS04.m - 若文件存在且环境完整,使用真实 PDFormer 推理
- 若加载失败,自动切换为模拟预测模式(基于早晚高峰规律、节假日系数生成预测,功能完全正常)
数据库表结构
| 表名 | 说明 |
|---|---|
| users | 用户账号信息 |
| traffic_datasets | 交通数据集元信息(含记录总数、时间范围) |
| sensors | 传感器/网格节点信息(含经纬度) |
| traffic_records | 历史交通流量数据 |
| ml_models | 机器学习模型信息及评估指标 |
| prediction_records | 用户发起的预测记录 |
| prediction_results | 每次预测的逐步结果详情 |
API 接口概览
| 路径 | 说明 |
|---|---|
POST /api/auth/register |
用户注册 |
POST /api/auth/login |
用户登录,返回 JWT Token |
GET /api/traffic/dashboard |
获取首页统计数据 |
GET /api/traffic/datasets |
获取数据集列表 |
GET /api/traffic/sensors |
获取传感器节点列表 |
GET /api/traffic/history |
查询历史流量数据(分页) |
GET /api/traffic/chart |
获取图表数据 |
GET /api/models/ |
获取模型列表 |
POST /api/models/{id}/activate |
激活指定模型(管理员) |
POST /api/predictions/ |
发起流量预测 |
GET /api/predictions/ |
获取预测记录列表 |
GET /api/users/ |
获取用户列表(管理员) |
完整接口文档访问:http://localhost:8000/docs
注意事项
.env文件包含数据库密码等敏感信息,请勿提交到版本仓库。- 数据库编码必须为
utf8mb4,否则中文字段可能出现乱码。 - 模型权重文件较大,需确保
MTFormer/libcity/cache/目录完整存在。 - CHIBike 数据集字段映射:
traffic_flow对应inflow(流入量),traffic_occupancy借用字段存储outflow(流出量),traffic_speed为 NULL。 - 路径中含有中文,部分旧版 Python 环境需确保系统编码为 UTF-8。
本项目为个人原创,结构清晰,功能完整,适合数据分析与智能应用方向课程设计、毕业设计和项目演示使用。有定制化需求可以评论或私信作者。
作者原创项目地址:michael-jay.pages.dev/projects.ht...