写在前面
选题:大数据技术-智慧交通预测系统
项目github地址(如果有用麻烦点个star与follow):https://github.com/wolfvoid/HNU-ITPS
(全部代码以及如何部署参见README)
项目报告:如下(代码在github上,故本文有关代码处全部省略)
项目分数:94
小组成员
-
@甘晴void
-
@Earnshawn
-
@一只快活小散仙
-
@想开一点
-
@Y++
技术栈
-
前端:java+vue框架
-
后端:python
-
数据库:PostgreSQL
感悟
做这个小学期项目时全程都在忙推免,小组成员也主要都在忙推免(最后去向都是C9,且2个去了清华),故有的地方有点划水,没有呈现出最好的效果,致歉。感谢老师的指导与宽容,但与推免相比这个确实需要稍稍往后放一些(后来才知道这个成绩没有计入国奖排名,也算是有备无患了)。大家都有自己的事情,但在备考外都抽出了宝贵的时间投入项目,我感觉真的很难得。当然最后的结果也是非常好的,项目结果很好,大家也都有自己的满意去处,人生幸事莫过于此了吧。
2023年9月4日
信息科学与工程学院
目录
▲实训任务与目标
(一)引言 (Introduction)
▲总体设计
(二)需求分析 (Requirements Analysis)
(三)系统架构 (System Architecture)
▲详细设计及实现
(四) 前端设计 (Frontend Design)
(五)后端设计 (Backend Design)
(六)数据库设计 (Database Design)
(七)接口API设计(API interface design)
(八)模型设计 (Model Design)
(九) 可视化分析(Visual analysis)
(十)系统安全 (System Security)
(十一)系统性能 (System Performance)
(十二)测试计划 (Testing Plan)
(十三)部署与运维 (Deployment and Maintenance)
(十四)未来扩展 (Future Enhancements)
(十五)结论 (Conclusion)
▲小组分工与心得体会
(十六) 小组分工 (Team Contributions)
(十七)心得体会 (Reflections)
(一)引言 (Introduction)
随着移动互联网的快速发展,交通信息的获取和传播变得更加便捷,海量的交通数据为城市交通的智能管理提供了前所未有的机遇。现代城市中,交通流量的管理和预测对于缓解交通拥堵、提高运输效率、优化资源配置具有重要意义。然而,随着城市化进程的加快和车辆数量的增加,交通流量的波动性和复杂性也在不断加剧,传统的交通管理手段已难以满足日益增长的需求。
本项目旨在基于互联网交通信息,开发一个先进的交通流量预测系统,通过建立精准的交通预测模型,预测城市中各关键路段的通行时间。系统的核心目标是实现对城市交通状态波动的提前预判,为城市出行者提供更加高效、便捷的出行方案。同时,系统将为交通管理部门提供科学的决策支持,帮助其在高峰时段和异常情况下更好地进行交通引导和管理,优化城市的交通资源配置和智能化管控水平。
通过该系统,城市交通管理可以更加智能化、精准化,出行者的体验将得到显著提升,不仅可以有效降低出行时间和成本,还能减少交通拥堵带来的环境污染和社会成本。这不仅对城市交通管理有重要意义,也符合当前智能城市建设的发展趋势。
(二)需求分析 (Requirements Analysis)
2.1 功能需求 (Functional Requirements)
2.1.1 数据采集与处理
(1)数据采集
系统需要能够持续、稳定地获取城市中各关键路段的交通数据,这包括交通流量、车辆速度、道路占用率等指标。数据源可能包括交通摄像头、传感器、GPS数据、交通管理系统等。为了确保数据的实时性,系统需支持高频数据采集,保证数据的及时性和准确性。
- 数据清洗与预处理
由于数据源的多样性和复杂性,采集到的原始数据可能包含噪声、缺失值或异常值。系统需要具备数据清洗功能,以去除或修正错误数据,同时进行格式转换、时间对齐、异常检测等预处理操作,以确保数据的质量和一致性。
- 数据存储
清洗后的数据将存储在系统的数据库中。考虑到数据量大、更新频繁,数据库需具备高效的存储和检索能力,并支持历史数据的归档与压缩,确保数据的持久性和可追溯性。
2.1.2 预测模型构建
(1)特征提取
在模型构建过程中,系统需对原始交通数据进行特征提取,以提炼出对交通流量预测有显著影响的关键特征。特征可能包括时间特征(如时段、节假日效应)、空间特征(如路段位置、周边道路状况)、历史流量数据等。
- 模型选择与训练
系统需构建适合城市交通特点的预测模型,以实现对未来交通状况的精确预测。模型选择可以包括时间序列模型、机器学习模型或深度学习模型等,并需进行充分的训练和调优,确保模型在不同情境下的预测精度。
(3)预测时段与范围
系统需针对特定时段(早高峰、日平峰、晚高峰)进行流量预测,覆盖城市内各关键路段,预测未来半个月内每日不同时段的通行时间。模型的预测结果需准确、可解释,为后续的可视化分析和决策支持提供可靠的数据基础。
2.1.3 可视化分析平台
(1)实时路况展示
系统需要通过前端界面实时展示当前的交通状况,用户可以查看城市中各关键路段的通行时间、拥堵情况、流量变化趋势等信息。前端界面需具备良好的用户体验,信息展示需直观、易于理解。
(2)预测结果展示
系统需将预测模型的结果可视化,用户可以查看未来一段时间内各时段的交通流量预测信息,并提供相应的出行建议。对于交通管理者,系统可展示交通流量的时空分布趋势,辅助其进行决策。
(3)用户交互功能
可视化平台应具备交互性,用户可以选择不同的时间、路段进行查询,并通过地图、图表等方式查看详细信息。同时,系统需支持用户的个性化设置,如定制特定路段的预测提醒、导出预测数据等功能。
2.2 非功能需求 (Non-functional Requirements)
2.2.1 系统响应时间
系统需要具备高效的响应能力,特别是在高峰时段和大数据量情况下,仍需保证数据处理和预测结果的及时性。数据采集、处理、预测和可视化展示的全过程需在合理的时间内完成,确保用户能够实时获得交通信息。
2.2.2 系统稳定性
由于系统需持续处理大量的实时数据,稳定性至关重要。系统需具备高可用性,能够应对大规模数据采集、高并发请求和突发流量。同时,系统需具备良好的故障恢复能力,能够在出现异常时迅速恢复,减少对用户的影响。
2.2.3 系统安全性
系统需保证交通数据的安全性和隐私性,防止数据在传输和存储过程中被未授权访问或篡改。需采用加密技术对敏感数据进行保护,同时实施严格的用户认证与授权机制,确保只有合法用户才能访问和操作系统。
2.2.4 系统可扩展性
随着城市范围的扩大和数据量的增加,系统需具备良好的可扩展性,以适应未来更多城市或路段的数据接入和处理需求。系统架构设计需考虑横向扩展能力,支持增加计算资源和存储容量,同时保持性能和稳定性。
2.2.5 用户体验
可视化分析平台需注重用户体验,提供直观、易于操作的界面。界面的响应速度、交互设计、信息展示的清晰度都需符合用户的使用习惯,保证用户能够轻松获取所需信息,提高用户满意度。
(三)系统架构 (System Architecture)
本交通流量预测系统的架构设计包含多个组件,涵盖数据采集、数据处理、预测模型、数据库、后端服务、前端展示等功能模块。系统架构设计注重模块之间的松耦合性和系统的可扩展性,以满足复杂的城市交通管理需求。
3.1 整体架构概述
系统整体架构由以下几个主要部分组成:
- 前端 (Frontend): 提供用户交互界面,主要用于展示实时交通信息、预测结果和可视化分析。前端与后端通过API进行通信,获取数据并展示给用户。
- 后端 (Backend): 负责数据的处理和管理,包括数据采集、数据清洗、预测模型调用、API服务等功能。后端是整个系统的核心逻辑层,负责协调各个模块的运作。
- 数据库 (Database): 用于存储和管理系统中的所有交通数据、模型数据、用户数据等。数据库是系统的数据中心,支持高效的数据查询和存取操作。
- 预测模型 (Prediction Model): 通过特征提取和机器学习算法,对采集的数据进行分析和预测,生成未来交通流量的预测结果。模型是系统实现智能预测的关键部分。
- 数据采集模块 (Data Collection Module): 负责从各种数据源(如传感器、摄像头、GPS等)获取实时交通数据,并将数据传送至后端进行处理。
3.2 详细架构设计
3.2.1 前端架构设计
- 用户界面 (UI) 层: 提供与用户的交互接口,包含拓扑图展示、图表展示、查询输入等功能。采用响应式设计,确保在不同设备上都有良好的显示效果。
- 数据可视化层: 通过图表、地图等方式展示交通数据和预测结果,支持实时更新和用户交互。使用现代前端框架(如Vue.js或React)构建,结合D3.js或ECharts等可视化库实现复杂的图形展示。
- API通信层: 通过HTTP请求与后端通信,获取所需数据。前端需能够处理异步数据请求,确保界面的流畅性和数据展示的及时性。
3.2.2 后端架构设计
- 业务逻辑层: 包含数据处理、模型调用、API服务等核心功能。业务逻辑层负责将采集到的原始数据进行清洗和预处理,调用预测模型生成预测结果,并通过API接口将处理后的数据传递给前端。
- 数据处理模块: 包含数据清洗、特征提取、数据聚合等功能,确保输入到模型中的数据是准确、规范的。处理流程可采用批处理(Batch Processing)或流处理(Stream Processing)模式,视具体需求而定。
- API服务模块: 提供API接口,供前端调用。API服务负责将数据按需返回给前端,同时支持多种查询条件(如时间、地点等)的组合,满足不同用户的查询需求。
- 预测模型调用模块: 负责与模型服务进行交互,将清洗后的数据输入到预测模型中,获取预测结果。该模块需确保模型调用的效率和稳定性,并处理模型的异常情况(如训练失败、预测错误等)。
3.2.3 数据库架构设计
- 数据库类型: 采用关系型数据库(PostgreSQL)。关系型数据库用于存储结构化数据,如历史交通数据、用户信息等。
- 数据模型设计: 包括交通数据表、预测结果表、用户数据表等。数据表之间通过外键关联,保证数据的完整性和一致性。交通数据表需要设计合理的索引,以提升查询效率。
- 数据存储策略: 对于实时数据,采用高频写入和高效查询的策略;对于历史数据,定期归档并压缩,以节省存储空间。还需设计备份和恢复机制,保障数据的安全性和可靠性。
3.2.4 预测模型架构设计
- 模型管理模块: 负责模型的训练、验证、更新和部署。模型管理模块需要支持多种模型类型(如时间序列模型、机器学习模型等)的灵活管理,并能根据需要进行动态切换或集成。
- 模型训练与验证: 使用分布式计算或云计算资源进行模型训练,确保处理海量数据时的效率。验证过程需使用交叉验证等技术,保证模型的泛化能力和预测精度。
- 模型部署与集成: 模型通过微服务的形式进行部署,支持API调用。部署时需考虑模型的容器化(如使用Docker),以便于版本控制和环境隔离。
3.2.5 数据采集模块设计
- 数据源接入层: 通过API或直接接入交通摄像头、传感器等设备,获取实时交通数据。接入层需考虑数据源的多样性和数据格式的统一性。
- 数据传输层: 负责将采集到的数据传输到后端进行处理。传输层需支持高吞吐量和低延迟的通信协议(如MQTT、WebSocket),确保数据的及时性。
- 数据预处理层: 在数据传输过程中,进行初步的格式转换、过滤和简单的异常检测,减少后端的处理负担。
3.2.6 系统交互设计
- 前端与后端交互: 前端通过API接口向后端请求数据,后端返回经过处理的实时交通数据和预测结果。交互过程中需考虑数据的传输效率和前端的响应速度。
- 后端与数据库交互: 后端通过ORM(对象关系映射)或SQL语句与数据库进行数据的读写操作,需优化查询性能,减少数据库的响应时间。
- 后端与模型交互: 后端通过调用模型服务接口,获取预测结果。需确保模型服务的高可用性,并支持并发调用,以应对高频次的预测请求。
4.1 整体界面设计
4.1.1 登录界面
登录界面分为两种,管理员和用户,使用者可输入自己的账号密码,数据会传入后端,调用数据库判断是否登录成功。
部分script代码如下:【略】
调用了postLoginApi来判断用户/密码是否正确
4.1.2 首页
此处主要是前端显示,与后端无交互
4.1.3 用户管理
此处实现了用户的查找、添加、修改、删除等功能
部分script代码如下:【略】
此处基本完成了对数据库的增删改查,并返回到前端正确显示
4.1.4 交通预测一览
此处调用了数据库的xgbr1表,显示了所有预测结果,同时可以精确搜索ID、日期和开始时间。
部分script代码如下:【略】
4.1.5 实时交通预测
通过提交一个对应格式的txt文件可以生成对应的预测数据
提交step_data.txt文件如下:【略】
可以得到预测数据
4.1.6 可视化界面
整体界面如下,共有八个可视图在后端处理后返回到前端显示,点击不同的组件可以切换到不同的vue界面,具体图表的分析将在“(九)可视化分析”中进行介绍。
部分script代码如下:【略】
4.1.6.1 交通拓扑图
4.1.6.2 路段通行时间排名
可利用下拉列表查看通行时间的前k位,例如,k=10时,则会查看前10位的排名
4.1.6.3 单日通行时段排名
可以计算得到不同时间段的通行时间。
4.1.6.4 一周通行时间排名
此处可以计算得到一周的通行时间排名,可以看出,星期五的的通行时间最长,星期天的通行时间最短。
4.1.6.5 月份通行时段变化
此处可以自行增删需要分析的道路。
通过分析可得相应的折线图:
4.1.6.6 月内通行时段变化
此处可以自行增删需要分析的道路:
4.1.6.7 天内通行时段变化
此处可以自行增删需要分析的道路:
4.1.6.8 周内通行时段变化
此处可以自行增删需要分析的道路:
4.2 技术选型
4.2.1 Vue.js 框架
特点:Vue.js 是一款渐进式 JavaScript 框架,适合构建用户界面。它以组件化开发为核心理念,便于维护和扩展。通过声明式渲染和双向数据绑定,Vue.js 大大简化了前端开发流程。
用途:用于构建整个智慧交通预测系统的前端界面。你使用了 Vue 组件(如 <template>, <script setup>, 和 <style scoped>)来创建动态的、响应式的用户界面。
4.2.2 TypeScript
特点:TypeScript 是 JavaScript 的超集,增加了静态类型检查功能,使代码更加健壮和易于维护,特别是大型项目。它支持类型推断、接口、枚举等特性,可以提高代码的可读性和可维护性。
用途:使用 TypeScript 可以确保在构建复杂应用时,减少因类型错误导致的潜在问题。例如,在你的代码中,editFormRef、editDialogVisible 和 user 都通过 TypeScript 类型系统得到更好的类型提示。
4.2.3 Element Plus
特点:Element Plus 是一个基于 Vue 3 的组件库,提供了丰富的 UI 组件,如按钮、对话框、表单等。它的设计简洁美观,能够快速构建出响应式的、具有交互性的用户界面。
用途:在代码中,你使用了 el-container, el-header, el-button, el-menu, el-dialog, el-form 等 Element Plus 提供的组件来构建用户界面,简化了复杂的 UI 实现。
4.2.4 Axios
特点:Axios 是一个基于 Promise 的 HTTP 客户端,支持在浏览器和 Node.js 中发送 HTTP 请求。它的 API 简洁易用,并且支持拦截请求、响应、取消请求和错误处理。
用途:你可能使用 Axios 进行 API 调用来与后端通信,比如修改密码功能中的 updateAdminPasswordApi。
4.2.5 Lodash
特点:Lodash 是一个常用的 JavaScript 实用工具库,提供了大量便捷的函数来操作数组、对象和其他数据结构。cloneDeep, pick, keys 等函数能够简化复杂的数据处理。
用途:在代码中,cloneDeep 用于深度复制对象,pick 用于从对象中提取特定属性,使代码更简洁和高效。
4.2.6 Local Storage
特点:Local Storage 是浏览器提供的一种本地存储机制,允许保存较大容量的键值对数据,生命周期与页面会话无关。它适合保存一些用户偏好、会话信息等非敏感数据。
用途:代码中你使用了 localStorage 来存储和获取用户的登录信息,通过 localStorage.getItem 和 localStorage.removeItem 操作实现用户信息的持久化和登出功能。
4.2.7 路由(Vue Router)
特点:Vue Router 是 Vue.js 的官方路由库,支持创建单页面应用。它通过定义路由规则,允许在不刷新页面的情况下,加载不同组件,实现页面切换。
用途:在代码中,通过 <router-view /> 实现页面组件的动态加载,<el-menu> 的 :router="true" 则配合 Vue Router 进行导航。
4.3 架构设计
4.3.1 页面结构
系统采用单页面应用(SPA)的架构设计,通过 Vue Router 管理页面导航。主要页面包括:
- 登录页面 /login
- 用户首页 /u/userhome
- 交通预测一览 /u/pre
- 实时交通预测 /u/realtime
- 数据可视化页面 /u/vision
- 管理员首页 /
4.3.2 路由配置
路由配置定义了不同页面的跳转规则。根据用户类型的不同,用户和管理员将被重定向到不同的页面。通过 router.beforeEach 路由守卫实现权限管理,用户类型通过本地存储(localStorage)进行校验。
部分代码如下:【略】
4.3.3 UI设计
系统的界面设计基于 Element Plus 组件库,主要使用了 el-container、el-menu、el-header、el-aside 等布局组件,实现了响应式布局和一致的用户界面。
- 顶部导航栏固定,包含系统标题和用户操作等(修改密码、退出登录……)。
- 侧边栏通过 el-menu 实现,支持页面导航和当前激活项的样式高亮。
(五)后端设计 (Backend Design)
- API设计:包括流量数据的获取、预测模型的调用、结果的返回等API
- 数据处理流程:如数据预处理、模型调用、结果处理等
- 技术选型:后端框架(如Django, Flask, Node.js等)
5.1 API设计
5.1.1 实时预测API
1. /realtime 接口
功能:该接口用于从数据库中查询实时数据并返回结果。支持分页和按条件筛选。
方法:GET
请求参数
- ID(可选):数据的 ID。
- Date(可选):数据的日期。
- Start_time(可选):数据的开始时间。
- page(可选,默认值为 1):用于分页的页码。
实现步骤
- 参数获取: 从请求中获取 ID、Date、Start_time 和 page 参数。如果 page 参数未提供,则默认值为1。
- 构建 SQL 查询:初始化 SQL 查询语句和计数查询语句。根据提供的参数构建筛选条件并附加到 SQL 查询中。计算总记录数的查询也会根据条件进行相应的调整。
- 执行 SQL 查询:执行计数查询以获取符合条件的总记录数。执行实际的数据查询,使用分页处理(LIMIT 和 OFFSET)来限制返回的记录数量。
- 处理查询结果:将查询结果转换为字典格式,并将 Decimal 类型的数据转换为 float 类型,以便 JSON 编码。构建响应数据,包括数据行和总记录数。返回 JSON 响应: 返回包含数据和总记录数的 JSON 响应。
2. /upload 接口
功能:该接口用于上传文件(仅支持 .txt 格式),并调用 My_predict 类的预测方法处理文件内容,然后返回预测结果。
方法:POST
请求参数:file(必需):上传的文件。
实现步骤
- 文件验证:检查请求中是否包含文件部分。验证文件名是否为空。确保文件是 .txt 格式。
- 文件保存:将上传的文件保存到指定路径(RealtimePredict/data/data.txt)。
- 调用预测方法:创建 My_predict 类的实例,并调用其 run_predict 方法进行预测。如果发生异常,捕获并返回错误信息。返回 JSON 响应: 返回预测结果或错误信息的 JSON 响应。
5.1.2 历史预测API
/pre 接口
功能:该接口用于从数据库中查询数据并返回结果,支持分页和条件筛选。
方法:GET
请求参数
- ID(可选):数据的 ID。
- Date(可选):数据的日期。
- Start_time(可选):数据的开始时间。
- page(可选,默认值为 1):用于分页的页码。
实现步骤
- 参数获取: 从请求中获取 ID、Date、Start_time 和 page 参数。如果 page 参数未提供,则默认值为 1。
- 构建 SQL 查询:初始化 SQL 查询语句和计数查询语句。根据提供的参数构建筛选条件并附加到 SQL 查询中。计算总记录数的查询也会根据条件进行相应的调整。
- 执行 SQL 查询:执行计数查询以获取符合条件的总记录数。执行实际的数据查询,使用分页处理(LIMIT 和 OFFSET)来限制返回的记录数量。
- 处理查询结果:将查询结果转换为字典格式,并将 Decimal 类型的数据转换为 float 类型,以便 JSON 编码。使用 cur.description 获取列名,并将每行数据转换为字典形式,其中每列名作为键,列值作为值。
- 构建响应数据:构建包含数据行和总记录数的 JSON 响应。
响应数据格式:【略】
返回 JSON 响应:
使用 jsonify 函数返回构建好的 JSON 响应。
5.1.3 用户管理API
1. 获取用户信息接口 (/user - GET)
功能:该接口用于从数据库中查询用户信息,支持分页和条件筛选。
请求参数
- page(可选):分页的页码,默认值为 1。
- username(可选):用户名。
- userid(可选):用户 ID。
- phonenumber(可选):电话号码。
- password(可选):密码。
实现步骤
- 参数获取:从请求中获取分页参数 page 和其他筛选条件。
- 构建 SQL 查询:初始化 SQL 查询语句。根据提供的筛选条件拼接查询语句。获取符合条件的总记录数。
- 分页处理:计算数据的 LIMIT 和 OFFSET。执行最终的分页查询。
- 处理查询结果:将查询结果转换为字典格式。
- 返回 JSON 响应:返回包含数据行和总记录数的 JSON 响应。
- 注意事项
- SQL 注入风险:在拼接 SQL 查询时直接将用户输入嵌入到查询中,容易受到 SQL 注入攻击。建议使用参数化查询来防止 SQL 注入。
- 分页和总记录数:在获取总记录数时使用 rowcount,在分页查询中使用 rownumber 来计算记录数可能不准确。应该在执行分页查询后使用 cursor.rowcount 来获取总记录数。
2. 添加用户接口 (/user - POST)
功能:该接口用于向数据库中添加新的用户。
请求数据
- username:用户名。
- userid:用户 ID。
- phonenumber:电话号码。
- password:密码,默认为 "123"。
实现步骤
- 数据获取:从请求的 JSON 数据中获取用户信息。
- 插入数据:使用 SQL INSERT 语句将用户数据插入数据库。
- 提交事务:提交数据库事务以保存更改。
- 返回 JSON 响应:返回操作结果,成功时返回 200 状态码,失败时返回 500 状态码和错误信息。
- 注意事项:硬编码的密码:密码被硬编码为 "123",这在实际应用中是不安全的。建议从请求中获取密码,或使用更安全的密码管理方式。
3. 删除用户接口 (/user - DELETE)
功能:该接口用于从数据库中删除用户。
请求参数
- username:用户名。
- userid:用户 ID。
实现步骤
- 数据获取:从请求中获取删除条件(用户名和用户 ID)。
- 删除数据:使用 SQL DELETE 语句删除符合条件的用户。
- 提交事务:提交数据库事务以保存更改。
- 返回 JSON 响应:返回操作结果,成功时返回 200 状态码,失败时返回 500 状态码和错误信息。
- 注意事项:SQL 注入风险:同样存在 SQL 注入风险,建议使用参数化查询。
4. 修改用户信息接口 (/user - PUT)
功能:该接口用于修改数据库中的用户信息。
请求数据
- oldData:包含修改前的用户信息(username、userid、phonenumber)。
- newData:包含修改后的用户信息(username、userid、phonenumber)。
实现步骤
- 数据获取:从请求的 JSON 数据中获取旧的数据和新数据。
- 更新数据:使用 SQL UPDATE 语句更新符合条件的用户记录。
- 提交事务:提交数据库事务以保存更改。
- 返回 JSON 响应:返回操作结果,成功时返回 200 状态码,失败时返回 500 状态码和错误信息。
5.1.4 登陆系统API
/login 接口
功能:该接口用于验证用户的登录信息,并根据提供的用户名、用户ID和密码来确认用户的身份。
支持两种类型的用户:管理员和普通用户。
请求方法:POST
请求数据
- type(int):用户类型,0 表示管理员,其他值表示普通用户。
- username(string):用户名。
- userid(string):用户 ID。
- password(string):密码。
实现步骤
- 数据获取:从请求的 JSON 数据中获取 type、username、userid 和 password。
- 数据库查询:根据 type 的值来选择查询的表格:如果 type 为 0,查询 administrator 表。否则,查询 users 表。使用 SQL 查询语句来匹配 userid 和 password。
- 处理查询结果:如果查询结果不为空,则表示登录成功:从结果中提取用户名和用户ID。返回成功的 JSON 响应,包含用户类型、用户名和用户ID。如果查询结果为空,则表示登录失败:返回错误的 JSON 响应,包含 401 状态码和错误信息。
- 关闭数据库连接:关闭游标以释放资源。返回 JSON 响应
成功响应:
失败响应:
1. /vision/v1/top
- 功能:重新计算并生成图表。
- 请求:无需请求体,直接触发计算。
- 处理:创建 Visualize 对象并调用 graph_plot 方法。返回成功或失败消息,并适当设置 HTTP 状态码。
- 错误处理:FileNotFoundError:文件未找到。ValueError:值错误。捕获所有其他异常。
2. /vision/v2/roadrank
- 功能:处理道路排名请求。
- 请求数据:JSON 请求体,包含 rank 字段(道路排名)。
- 处理:从请求体中获取 rank 参数。创建 Visualize 对象并调用 road_rank 方法。返回成功或失败消息,并适当设置 HTTP 状态码。
- 错误处理:捕获所有异常,返回错误信息。
3. /vision/v3/dayrank
- 功能:处理每日排名请求。
- 请求:无需请求体,直接触发计算。
- 处理:创建 Visualize 对象并调用 timeinterval_rank 方法。返回成功或失败消息,并适当设置 HTTP 状态码。
- 错误处理:捕获所有异常,返回错误信息。
4. /vision/v4/weekrank
- 功能:处理每周排名请求。
- 请求:无需请求体,直接触发计算。
- 处理:创建 Visualize 对象并调用 week_rank 方法。返回成功或失败消息,并适当设置 HTTP 状态码。
- 错误处理:捕获所有异常,返回错误信息。
5. /vision/traveltime
- 功能:生成旅行时间图。
- 请求数据:JSON 请求体,包含 status 和 roads 字段。status 决定图表的方法(例如月份、日期等)。ids 是要绘制的道路 ID。
- 处理:根据 status 设置方法(如 Month, Date_no, Hour, Day)。调用 traveltime_plot 方法生成图表。返回成功或失败消息,并适当设置 HTTP 状态码。
- 错误处理:捕获所有异常,返回错误信息。
5.2 数据处理
5.2.1 数据预处理
数据预处理部分主要通过 Flask 的 request.get_json() 获取传入的 JSON 数据,并根据具体需求提取相关字段。在数据预处理时,代码确保请求的有效性,如检测缺失参数,并返回相应的错误信息。
- vision_1 (/vision/v1/top):
- 该接口没有显式处理传入的数据。直接调用 Visualize 类中的 graph_plot() 方法来生成可视化图形。异常处理涵盖了文件缺失(FileNotFoundError)、数据格式错误(ValueError)等问题。
- vision_2 (/vision/v2/roadrank):
- 数据预处理:通过 request.get_json() 获取 JSON 数据。
- 检查 rank 字段是否存在,若缺失则返回 400 错误。
- 提取 rank 数据供后续使用。
- 业务逻辑:调用 Visualize 类中的 road_rank() 方法处理传入的 rank 数据。
- 数据预处理:通过 request.get_json() 获取 JSON 数据。
- vision_3 (/vision/v3/dayrank):
- 没有进行数据预处理,直接调用 timeinterval_rank() 方法执行操作。
- vision_4 (/vision/v4/weekrank):
- 与 vision_3 类似,直接调用 week_rank() 方法,没有复杂的数据预处理逻辑。
- vision_5_8 (/vision/traveltime):
- 数据预处理:获取请求中的 JSON 数据,并提取 status 和 roads 字段。
- 根据 status 的不同值(如 "months", "amonth", "aday", "aweek")决定使用不同的处理方法。如果 status 值不符合预期,返回错误响应。
- 提取的 roads 数据用于后续的可视化操作。
- 数据预处理:获取请求中的 JSON 数据,并提取 status 和 roads 字段。
5.2.2 模型调用
模型调用主要通过 Visualize 类来执行不同的可视化任务。根据不同的 API 端点,代码调用了相应的可视化函数。以下是每个端点中调用的模型方法:
- vision_1 调用 graph_plot():该方法执行图形绘制操作。
- vision_2 调用 road_rank(rank):基于传入的 rank 值执行道路排名的可视化。
- vision_3 调用 timeinterval_rank():按时间区间进行排名的可视化处理。
- vision_4 调用 week_rank():按周进行排名的可视化处理。
- vision_5_8 调用 traveltime_plot(method, ids):基于 status 参数确定的方法以及 roads 的 ID 列表,执行旅行时间的可视化操作。
5.2.3 结果处理
结果处理部分使用 Flask 的 jsonify() 方法返回处理结果,确保响应格式为标准的 JSON 格式。根据不同的情况,返回成功或失败的消息以及 HTTP 状态码。
- 成功时返回:
- 错误处理时,捕获异常并返回错误消息和状态码:
5.3 技术选型
1. 后端框架:Flask
Flask 是一个轻量级的 Python Web 框架,设计简单且易于扩展,适合小型和中型的应用程序。
优点:
- 轻量级:Flask 不像 Django 那样是一个全栈框架,允许开发者根据需要选择其他组件。
- 灵活:它提供了最小化的内置功能,允许开发者自由选择所需的库和工具。
- 社区支持:Flask 有一个强大的社区支持,开发者可以快速找到帮助。
- REST API 开发方便:Flask 特别适合用来构建 REST API,结合 Flask-CORS 实现跨域资源共享。
应用场景:Flask 适合用于开发中小型应用程序、API 或微服务架构。
2. 数据库管理:PostgreSQL
在代码中通过 admin 连接到 PostgreSQL 数据库,执行 SQL 查询以验证用户信息和处理请求。
PostgreSQL 是一个开源的对象关系型数据库,以其强大的 SQL 语言支持和数据完整性著称。
优点:
- ACID 支持:PostgreSQL 提供了可靠的事务处理,保证数据的完整性和一致性。
- 复杂查询:支持复杂查询、索引、多版本并发控制 (MVCC) 和丰富的数据类型。
- 扩展性:允许自定义函数、存储过程和数据类型,便于复杂数据处理和扩展。
应用场景:适合需要处理大量数据、并发事务处理的应用,尤其是在数据可靠性和扩展性要求较高的情况下。
3. API设计
RESTful API:所有接口均采用 POST 方法来实现,这符合 RESTful 架构风格中常见的数据处理模式。
REST API 通过 URL 定义不同的资源(如 /vision/v1/top、/vision/v2/roadrank 等)和请求方法(POST、GET 等)来定义服务。
优点:
- 简单:REST API 设计通常以标准的 HTTP 方法进行(GET、POST、PUT、DELETE)。
- 无状态:每个请求是独立的,服务器不需要存储客户端的状态。
- 广泛支持:REST API 是开发 Web 服务最常见的设计方式,易于与前端进行交互。
适合场景:这种设计适用于各种应用程序,尤其是需要与前端进行大量数据交互的系统。
4. 跨域资源共享:Flask-CORS
CORS(Cross-Origin Resource Sharing)是用于解决前端和后端跨域问题的机制。
Flask-CORS 使 Flask 应用程序能够处理来自不同域的请求。
优点:
- 简单解决跨域问题:在开发 REST API 时,前端和后端通常在不同的域中,使用 Flask-CORS 可以轻松解决跨域请求问题。
应用场景:常用于前后端分离的应用开发,尤其是前端与后端在不同服务器上的情况。
5. JSON 处理:自定义 JSON 编码器
由于 PostgreSQL 数据库可能返回 decimal.Decimal 类型的数据,代码通过自定义 JSON 编码器来将 Decimal 转换为 float,从而避免返回不兼容的 JSON 数据。
优点:
- 灵活性:通过自定义 JSON 编码器,可以对特殊的数据类型进行转换,使 API 响应的数据兼容 JSON 格式。
- 扩展性:可以根据需求进一步扩展自定义编码器,处理其他不兼容的类型。
应用场景:当 API 的响应数据中含有数据库中特殊的数据类型时(如 decimal.Decimal),可以使用自定义编码器来确保返回正确的 JSON 数据。
6. 可视化:Visualize 类
代码中使用 Visualize 类执行数据可视化任务。每个接口会调用该类的方法,生成图表或排名结果。
优点:
- 封装性:通过类的方式封装了具体的可视化逻辑,使 API 逻辑更加简洁清晰。
- 复用性:可视化相关的逻辑集中在一个类中,便于在不同接口中复用。
- 适合场景:当需要从后台执行复杂的图表生成或数据计算时,封装成类可以提高代码的组织性和可维护性。
7. 异常处理
代码中大量使用了 try-except 块来捕获可能的异常,特别是:
文件未找到 (FileNotFoundError),值错误 (ValueError),通用异常 (Exception)。
优点:
- 提高稳定性:即使发生异常,API 也能够返回适当的错误消息和状态码,而不是直接崩溃。
- 更好的用户体验:错误信息详细且易于理解,便于前端处理异常情况。
- 应用场景:在处理用户输入、文件操作或数据库查询时,异常处理尤为重要,确保系统在遇到异常情况时仍能正常运行。
(六)数据库设计 (Database Design)
6.1 数据库模型:ER图展示主要数据表及其关系
利用PowerDesigner设计数据库表,生成sql文件。
管理员可以管理用户,增删查改;管理员和用户都可以访问xgbr1表中的交通数据用于预测。
字段名 | 数据类型 | 描述 | 约束 |
adid | char(12) | 管理员ID | 主键 |
adname | text | 管理员姓名 | |
sex | text | 性别 | |
age | numeric(100,0) | 年龄 | |
password | varchar(20) | 密码 |
6.2 表结构设计:详细说明各个数据表的字段和索引
6.2.1 administrator 表
6.2.2 users 表
字段名 | 数据类型 | 描述 | 约束 |
username | text | 用户名 | |
userid | char(12) | 用户ID | 主键 |
phonenumber | char(11) | 电话号码 | |
password | varchar(12) | 密码 |
6.2.3 xgbr1 表(插入预测数据的表)
字段名 | 数据类型 | 描述 | 约束 |
ID | char(20) | 记录ID | 主键 |
Date | char(10) | 日期 | |
Start_Time | varchar(10) | 开始时间 | |
End_Time | varchar(10) | 结束时间 | |
Value | varchar(255) | 平均通行时间 |
导入数据的部分代码:CreateDatabase.py
6.3 数据存储策略:如实时数据存储、历史数据归档等
数据访问权限:
- 管理员(administrator):拥有对`xgbr1`表的完全访问权限,包括数据的增删查改操作。应设置细粒度权限以确保管理员只能操作其管理范围内的用户数据。
- 用户(users ):仅能访问`xgbr1`表中的数据进行查询,不能修改或删除记录。通过视图或特定查询权限限制用户的访问权限。
实时数据存储:
- `xgbr1`表存储交通预测的实时数据,包括每条道路的开始时间、结束时间及其对应的预计通行时间值。可优化以支持高效的插入和查询操作。
数据备份和恢复:
- 定期备份`xgbr1`表的实时数据和历史归档表。确保备份策略能够支持快速恢复,以应对数据丢失或损坏的情况。
进行数据备份的部分代码:DataBackup.py
6.4 文本转换
将txt文件转换为csv文件,部分代码:
(七)接口API设计(API interface design)
接口我们主要调用了axios实现,定义了后端接口为本地的5000端口,具体实现代码如下:
7.1 login
定义了登录接口
7.2 password
定义了管理用户和管理员密码的接口
7.3 pre
定义了预测数据的接口
7.4 realtime
定义了实时预测的接口
7.5 user
定义了管理数据的接口
7.6 vision
定义了可视化的接口
(八)模型设计 (Model Design)
8.1模型选择与架构
XGBoost(eXtreme Gradient Boosting)模型:
8.1.1 模型介绍
XGBoost(eXtreme Gradient Boosting)是一个基于梯度提升树(GBDT)的增强学习算法。它以其高效的计算速度、强大的性能和灵活性在机器学习领域非常流行。XGBoost能够自动处理缺失值,内置了正则化、树剪枝、早停等功能,适用于大规模数据集和各种问题场景,包括分类、回归等。
8.1.2 XGBoost模型的优势
- 处理非线性关系:时序数据往往具有复杂的非线性关系,XGBoost通过决策树的结构能够捕捉到这些复杂的模式。
- 自动特征选择:XGBoost通过递归树结构自动选择最有意义的特征,这对时序数据中特征提取是一个巨大优势。
- 处理缺失数据:时序数据中常会出现缺失值,XGBoost能够自动处理这些缺失数据。
- 时间序列分段:它可以结合滑动窗口或其他特征工程技术,将时序数据分段预测,适应时序的规律性波动。
- 灵活的正则化:XGBoost提供了对L1(Lasso)和L2(Ridge)正则化的支持,防止模型过拟合,这在时序数据特别容易发生。
- 支持早停机制:时序预测模型可能因为训练过长而过拟合,XGBoost的早停功能能够监控验证集上的误差,自动终止训练。
8.1.3 模型架构
8.1.3.1 XGBoost架构
- XGBoost回归模型 (xgb.XGBRegressor) 是核心组件,它基于梯度提升决策树(GBDT)。XGBoost作为GBDT的增强版本,主要提供更快的训练速度、正则化功能(L1、L2),并支持并行计算和自动剪枝。
- XGBoost模型通过构建多个决策树来逐步减少误差,并在训练过程中使用一些优化技术来提升效果,如:正则化:reg_alpha控制L1正则化,防止模型过拟合。
8.1.3.2 数据预处理与划分架构
- train_test_split():使用来自于Scikit-learn框架的函数,用于将数据集分割为训练集和测试集。通过控制测试集的大小(test_size=0.1)以及随机种子(random_state=0)确保数据划分的可重复性。
- 特征选择与预处理:代码中使用了train_feature和valid_feature来选取用于训练和验证的数据特征,体现了特征工程的重要性。
8.2 模型训练与验证
8.2.1 模型的训练流程
(1)预处理
a,剔除离群点
由于绝大多数数据非常集中,直接绘图不直观,进行取对数操作后数据基本符合正态分布,于是基于此去除离群点:
主要步骤:
- 获取5%和95%分位数:
- group.quantile(.05):计算数据集group中的第5%分位数,即数据中5%以下的值。
- group.quantile(.95):计算第95%分位数,即数据中95%以上的值。
- 将低于5%分位数的值替换为5%分位数值:
- group[group < group.quantile(.05)] = group.quantile(.05):对于数据集中低于第5%分位数的值,将其替换为5%分位数的值。
- 将高于95%分位数的值替换为95%分位数值:
- group[group > group.quantile(.95)] = group.quantile(.95):对于数据集中高于第95%分位数的值,将其替换为95%分位数的值。
- 返回处理后的数据:
- 最终,经过剪裁的group返回。
代码如下:
b,处理缺失值
首先补全时间区间,没有数值暂时用nan代替,接着将nan值转换为具体的一个数值,该数值可用回归得到。中心思想如下:travel_time与所在年、月、日、小时、分钟有关,将其分为年、月、日、小时、分钟影响分部与残差,分别回归得到各影响分部的值,最后将其相加即可得travel_time的预测值。
这里选择小时与分钟两个影响分部和残差进行预测:
代码:线性回归建模,并predict得预测值
代码:分钟影响分部
到此,date_trend和minute_trend均计算完毕,将travel_time减去小时和分钟影响分部可以得到残差。
从剩下的df_info 、df_top中提取相关特征,接着提取起始时间中的月份、天、小时、分钟:
将travel_time列除以std(travel_time)可将其标准化,代码如下:
采用XGBoost对缺失值进行预测,预测之后将其整合到原Dataframe中:
(2)提取特征
由于是时间序列预测,数据集中需要有与该点时间以前区段的相关数据信息,因此构件lagging1-lagging5特征,分别代表该时间段前2*i分钟的travel_time,i取1-5,也就是将Dataframe表格平移5格,代码如下:
重新提取df_info 、df_top中的特征。此外,特征time_interval_begin无法直接使用,将其转换为距离某起始时间的分钟数量,该数量可用来建模,以及如星期特征、时间段特征等等
通过交叉验证和参数搜索训练模型,特别是针对时序数据的回归任务,利用了XGBoost回归模型来预测数据中的目标变量(travel_time)。该代码的核心是利用不同的时间段进行模型训练和评估,并通过不断调整参数寻找最佳模型。
代码训练的步骤
1.数据按时间划分:
函数train()首先将数据df按照时间(time_interval_begin列)分成五个时间段(train1、train2、train3、train4、train5)。每个时间段对应不同的历史时间区间。
这是一种基于时序的交叉验证方法,确保模型的训练和测试数据按时间顺序分开,以避免信息泄漏。
2.调用fit_evaluate()进行模型训练和评估:
函数fit_evaluate()负责训练模型并评估它在验证集上的表现。每次调用时,选择不同的时间段作为测试集,其余时间段合并为训练集。
3.XGBoost模型的训练与验证:
在fit_evaluate()函数中,首先将训练集和测试集数据进行特征提取,接着调用XGBoost回归模型(xgb.XGBRegressor)进行训练。
XGBoost的参数由params提供,包括learning_rate、n_estimators、max_depth等。
使用早停机制(early_stopping_rounds=10)来防止模型过拟合。如果模型在验证集上的表现没有提升超过10轮迭代,训练将停止。
每次训练后,模型的最优迭代次数(best_iteration)和最优得分(best_score)会记录下来。
- 损失评估与参数更新:通过计算每次交叉验证的损失值,寻找参数组合,使得平均损失最小,并更新最佳参数。
5.网格搜索:通过遍历参数网格grid中的不同参数组合,最终找到表现最优的模型参数。
代码部分略。
在设定好超参数后使用如下代码训练一个 XGBoost 回归模型,保存训练好的模型,并生成预测结果保存到指定的文件中:
8.2.2 亮点
为了能够进一步快速实现真正的实时预测,我们将训练好的模型保存下来,在需要预测时可以将一段格式固定的连续数据输入预测接下来的时间片的通行时间,模块化代码部分如下:
8.3 数据集的选择
数据集获取:https://tianchi.aliyun.com/dataset/1079(智慧交通预测数据集-阿里云天池)
8.4 模型的评价指标
最终训练时我们得到在验证集上的均方根误差(RMSE)为 0.21344,平均绝对百分比误差(MAPE)为 0.15293,说明我们的模型训练的准确度很高:
9.1数据概述
本项目的数据包含了三类:各路段之间的上下游关系、路段属性以及各路段在不同时段的通行时间。通过对这些数据进行可视化分析,能够揭示各路段的交通流量特征及其随时间的变化趋势,并帮助识别异常情况或模式。
9.2 路段关系拓扑图
为更直观地展示各个路段之间的关系以及路段的通行时间对整体交通网络的影响,本实验基于networkx库构建了路段关系拓扑图。该拓扑图展示了路段之间的连接关系。
为了将各路段的通行时间直观地表现出来,我们为图中的每个节点赋予了颜色。节点的颜色取决于该路段的通行时间,使用了coolwarm颜色映射(cmap)来实现,颜色由蓝色到红色渐变,蓝色代表通行时间较短的路段,红色则代表通行时间较长的路段。
9.3 路段通行时间变化可视化
为了全面分析各个路段的通行时间随时间的变化趋势,本实验对多个时间维度进行了可视化分析,包括:一天之内、一个月之内、一周之内,以及不同月份之间的平均通行时间变化。通过这些维度的分析,可以更好地理解不同路段的拥堵情况和通行效率。
主要针对以下几个时间维度进行了分析和可视化:
- Month:不同路段在不同月份的平均通行时间变化
- Date_no:不同路段在一个月内不同日期的平均通行时间变化
- Hour:不同路段在一天内不同小时的平均通行时间变化
- Day:不同路段在一周内的平均通行时间变化。
9.3.1 不同月份的通行时间变化
下图展示了路段在不同月份的平均通行时间变化,可以看出,在某些月份,路段的通行时间较为平稳,且大多路段在6月份开始平均通行时间在增加。
9.3.1 一个月之内的通行时间变化
下图展示了各个路段在一个月内(按天)的平均通行时间变化趋势。可以看到,部分日期的通行时间波动较大,这可能是由于特定日期的交通流量骤增(如节假日或交通管制等)。
下图展示了各路段一周7天内的平均通行时间变化。观察下图可以发现周一、周五以及周六的通行时间整体要高于其他时间。
9.3.4 一天之内的通行时间变化
下图展示了不同路段在一天24小时内的通行时间变化情况。可以看到,两个路段的通行时间在早晚高峰时段(通常为7:00-9:00和17:00-19:00)显著增加,而在夜间时段则明显下降。这一结果与典型的城市交通高峰期规律一致,提示高峰时段的交通管理应更加严格。
为了更直观地展示哪些路段的通行时间较长,本实验通过对所有路段的平均通行时间进行排序,输出通行时间最长的前10条路段,并通过水平条形图进行可视化展示。
下图中展示了通行时间最长的前10条路段的平均通行时间情况。可以看到,这些路段的平均通行时间远高于其他路段,提示这些路段可能面临更为严重的交通拥堵问题。通过进一步分析这些路段的地理位置及其连接的交通枢纽,可以为交通管理部门提供优化建议,帮助缓解交通压力。
9.5 一天内按时间段划分的通行时间排序
为了更好地理解一天内不同时间段的交通流量与拥堵情况,我们对一天内各个时间段的通行时间进行了聚合,并对各时间段的平均通行时间进行排序和可视化展示。
将一天划分为8个时间段,分别为:
- 午夜:23:00-00:00 和 00:00-01:00
- 凌晨:01:00-05:00
- 早上:05:00-08:00
- 上午:08:00-11:00
- 中午:11:00-13:00
- 下午:13:00-17:00
- 傍晚:17:00-19:00
- 晚上:19:00-23:00
通过计算每个时间段内所有路段的平均通行时间,可以分析不同时段的交通拥堵情况。最终对这些时间段按通行时间进行排序,并使用水平条形图进行可视化。
- 凌晨时段(01:00-05:00)和早上时段(05:00-08:00)的通行时间最短,反映出在这两个时段内交通较为通畅;
- 下午时段(13:00-17:00)和傍晚时段(17:00-19:00)的通行时间相对较长,反映出晚高峰拥堵较为严重。
9.6 一周内通行时间排序
为研究一周内不同天的交通流量及通行时间变化,本实验对一周七天的平均通行时间进行了聚合计算,并对各天的平均通行时间进行排序,最后通过可视化展示。通过分析一周内不同天的交通状况,可以帮助预测某些特定日子的交通压力,为交通管理部门提供决策依据。
(十)系统安全 (System Security)
在交通流量预测系统中,系统安全是保障数据隐私、访问控制和系统稳定运行的关键部分。我们采取了一系列措施来确保系统的安全性,特别是在数据安全、访问控制和日志监控方面进行了专门设计,以防止未经授权的访问和潜在的安全威胁。
10.1 数据安全 (Data Security)
数据安全是系统的核心,尤其在处理涉及个人信息或敏感交通数据时。本系统的主要数据安全措施包括:
- 数据隐私保护:
在系统设计中,我们优先考虑了数据隐私的保护,确保用户的个人信息不会被未授权的人员访问。所有的用户数据和交通数据均储存在受保护的数据库中,仅限于有权限的用户进行访问。
- 传输过程中的加密:
虽然我们的系统目前主要依赖于密码登录方式,但在数据传输过程中采用了基本的加密方法,如HTTPS协议,确保数据在网络传输过程中不被窃听或篡改。
10.2 系统访问控制 (Access Control)
系统访问控制是防止未经授权用户访问系统的重要机制。我们在此部分重点加强了用户认证和权限管理:
- 用户认证与授权:
系统提供了管理员和普通用户两种登录方式,所有用户均需通过密码进行身份验证。密码登录系统采用安全的哈希算法存储用户密码,防止明文密码泄露。同时,管理员和普通用户的权限设置严格区分,管理员拥有系统管理权限,可以执行如用户管理、数据审核等高权限操作,而普通用户仅限于访问系统的基本功能。
- 权限管理:
为了确保系统的安全性,不同用户组具有不同的操作权限。管理员可以添加、修改和删除用户账户,设置系统参数等;而普通用户只能访问与自己相关的数据和功能,无法越权操作其他功能模块。通过这种严格的权限管理机制,我们有效地防止了用户越权操作,确保系统的整体安全。
10.3 日志与监控 (Logging and Monitoring)
日志记录和系统监控是及时发现和响应安全事件的有效手段。我们在系统中实现了详尽的日志记录和实时监控功能:
- 系统操作日志:
系统自动记录所有用户的操作日志,包括登录记录、数据访问记录、权限变更等重要操作。这些日志数据不仅有助于系统管理员进行日常维护,还可以在发生安全事件时追溯问题的根源,提供详细的操作记录。
- 安全事件监控:
系统实时监控所有用户的操作行为,特别是管理员操作和高权限操作。一旦发现异常行为(如多次登录失败、大量数据请求等),系统会立即通知管理员进行处理,防止潜在的安全威胁进一步扩大。
通过这些措施,我们的系统在数据安全、访问控制和日志监控方面都具备较高的安全性和可靠性。尽管系统目前未采用高级加密技术,但通过严格的登录管理和权限控制,结合全面的日志和监控功能,我们依然能够为用户提供一个安全、稳定的使用环境。
(十一)系统性能 (System Performance)
11.1 性能指标 (Performance Metrics)
- 响应时间 (Response Time): 系统的响应时间是用户体验的重要因素。我们设定的目标是确保用户在发起请求后的响应时间不超过2秒,以保证实时性和流畅性。这一目标通过优化后端API的性能和前端请求处理的效率得以实现。
- 预测准确率 (Prediction Accuracy): 本系统的预测模型经过精心设计和训练,具有较高的预测准确率。在实际测试中,系统对高峰时段的交通流量预测准确率达到85%以上,能够有效帮助用户和交通管理部门制定合理的出行计划和交通管理策略。
11.2 负载均衡 (Load Balancing)
在高并发情况下,确保系统的稳定性至关重要。我们采取了负载均衡策略,以提升系统的可用性和可靠性:
- 分布式架构: 系统采用分布式架构,将请求均匀分配到多个后端服务器上,减少单台服务器的负载压力。这种方式不仅提高了系统的处理能力,还能在某台服务器出现故障时迅速切换到其他服务器,确保系统的持续运行。目前还在实验阶段,暂未付诸实行。
- 负载均衡算法: 采用轮询和最少连接等负载均衡算法,根据当前服务器的负载情况动态调整请求的分配策略,以达到优化资源利用和响应时间的目的。目前还在实验阶段,暂未付诸实行。
11.3 缓存策略 (Caching Strategy)
为提高系统的响应速度和效率,我们在数据访问和图像展示中引入了缓存策略:
- 数据缓存: 系统在处理常用数据时,使用内存缓存(如Redis)来存储频繁访问的交通数据和预测结果,显著减少数据库的读取压力,提升数据访问速度。目前还在实验阶段,暂未付诸实行。
- 图像缓存: 对于前端展示的图像,采用浏览器缓存和CDN(内容分发网络)技术,减少用户每次访问时的加载时间。通过预加载和异步加载的方式,确保用户在访问过程中获得流畅的体验。目前还在实验阶段,暂未付诸实行。
11.4 可扩展性设计 (Scalability Design)
为了应对未来用户数量增加或数据量扩大带来的挑战,我们在系统架构中进行了可扩展性设计(可供之后改进):
- 模块化设计: 系统采用模块化设计,使得每个功能模块可以独立扩展。例如,后端服务可以根据需求增加更多的工作节点,而数据库可以通过分片或复制来应对更大的数据存储需求。
- 微服务架构: 采用微服务架构将系统功能划分为多个服务,允许根据需要独立扩展某个服务而不影响其他服务的运行。这种架构使得系统在面对高并发请求或数据处理时,可以灵活调整资源分配。
- 云服务支持: 系统设计时考虑了云服务的应用,允许根据实际流量动态调整云服务器的资源配置,确保系统在用户量激增时能够保持高性能运行。
通过以上措施,我们的交通流量预测系统在性能方面具备良好的响应速度和高预测准确率,同时能够在高负载情况下保持稳定运行,具备良好的扩展能力,以应对未来的需求变化。
(十二)测试计划 (Testing Plan)
在交通流量预测系统的开发过程中,测试计划是确保系统质量和性能的关键环节。我们将通过一系列全面的测试策略来验证系统的各个组件和功能,包括前端测试、后端测试、数据库测试、模型测试和性能测试等。
12.1 前端测试 (Frontend Testing)
- UI测试 (UI Testing):
- 目标: 确保用户界面的布局、样式和功能符合设计规范,且在不同设备和浏览器上都能正常显示。
- 方法: 使用自动化测试工具(如 Selenium 或 Cypress)进行界面测试,验证各个页面元素的可见性和交互性,包括按钮、输入框、图表和地图等。
- 验证: 确保各项UI元素的行为符合用户预期,如按钮点击、表单提交和数据展示等。
- 交互测试 (Interaction Testing):
- 目标: 确保用户与系统的交互过程流畅无误,所有功能都能正常使用。
- 方法: 进行手动测试和自动化测试相结合,验证用户操作的有效性,包括导航、数据输入和反馈信息等。
- 验证: 确保系统对用户操作的响应及时且正确,所有交互逻辑无误。
12.2 后端测试 (Backend Testing)
- API测试 (API Testing):
- 目标: 确保后端API能够正确处理请求并返回预期结果。
- 方法: 使用Postman或其他API测试工具进行接口测试,验证API的功能、性能和安全性。
- 验证: 确保API能够正确处理不同的请求参数,返回正确的状态码和数据格式。
- 集成测试 (Integration Testing):
- 目标: 验证各个组件之间的集成和交互是否正常。
- 方法: 进行多模块联合测试,确保前端与后端的交互、数据库操作和模型调用之间无缝连接。
- 验证: 确保整个系统在集成后能够正常工作,各个功能模块之间的通信正确无误。
12.3 数据库测试 (Database Testing)
- 数据一致性与完整性测试 (Data Consistency and Integrity Testing):目标: 确保数据库中存储的数据准确、一致且符合预期。
- 方法: 通过编写SQL查询来验证数据的完整性和一致性,检查数据表之间的关系和约束条件。
- 验证: 确保数据在增、删、改操作后的一致性,防止出现脏数据或孤立数据。
12.4 模型测试 (Model Testing)
- 模型的准确性测试 (Model Accuracy Testing):
- 目标: 验证交通流量预测模型的准确性。
- 方法: 使用留出法(Hold-Out)或交叉验证(Cross-Validation)对模型进行评估,计算预测结果与实际值之间的误差。
- 验证: 确保模型在高峰、平峰等不同时间段的预测准确率达到预期标准。
- 鲁棒性测试 (Robustness Testing):
- 目标: 验证模型在不同数据分布和异常情况下的表现。
- 方法: 通过引入噪声数据、缺失值或异常值来测试模型的稳定性和鲁棒性。
- 验证: 确保模型在不理想情况下仍能提供可靠的预测结果。
12.5 性能测试 (Performance Testing)
- 系统在高负载下的表现 (System Performance under High Load):目标: 验证系统在高并发请求和大数据量情况下的稳定性和响应时间。
- 方法: 使用压力测试工具(如 JMeter 或 LoadRunner)模拟大量用户同时访问系统,监测系统的响应时间、处理能力和资源消耗。尚在实验阶段。
- 验证: 确保系统在高负载下仍能保持合理的响应时间,且不会出现崩溃或严重性能下降的情况。
通过以上全面的测试计划,我们将确保交通流量预测系统在功能、性能和安全性等方面达到高标准,满足用户的需求,并为系统的长期稳定运行提供保障。
(十三)部署与运维 (Deployment and Maintenance)
在交通流量预测系统的开发完成后,合理的部署与运维策略是确保系统稳定、高效运行的关键。本部分将详细介绍系统的部署策略、持续集成与部署流程、系统监控以及备份与恢复策略。
13.1 部署策略 (Deployment Strategy)
- 前后端部署:
- 前端部署: 前端部分采用现代化的前端框架(如Vue.js)进行构建,生成静态文件后,通过CDN(内容分发网络)进行部署,以确保高效的资源加载和全球范围内的访问速度。前端静态资源将部署在云服务平台(如AWS S3或Azure Blob Storage),并通过CloudFront等CDN服务进行分发,减少用户的访问延迟。
- 后端部署: 后端服务采用Docker容器化部署,使得各个服务能够在隔离的环境中独立运行。通过Kubernetes或Docker Swarm进行容器编排,实现自动扩缩容和故障恢复。后端API服务部署在云服务器上,确保可扩展性与高可用性。
- 数据库部署: 数据库选择适合的关系型数据库(如PostgreSQL)和NoSQL数据库(如MongoDB),采用主从复制架构实现数据的高可用性和读写分离。同时,为了保证数据的安全性与稳定性,数据库将部署在独立的虚拟私有云(VPC)中,并限制外部访问。
- 模型部署: 预测模型通过Flask或FastAPI服务化,提供API接口供后端调用。模型可以独立于后端服务进行版本管理与更新,确保模型的快速迭代与优化。
13.2 CI/CD(持续集成与部署流程)
- 持续集成 (Continuous Integration):
- 使用Git作为版本控制工具,所有代码提交将自动触发CI流程。采用Jenkins或GitHub Actions等CI工具,在每次代码更新后自动进行构建、单元测试和集成测试,确保代码质量。
- 持续部署 (Continuous Deployment):
- 经过CI测试通过的代码将在预生产环境进行部署,经过验证后再自动推送到生产环境。采用蓝绿部署策略,确保新版本发布过程中的零停机时间,并在发布后进行回滚。
- 自动化测试: 在CI/CD流程中集成自动化测试,确保每次代码变更都不会引入新的bug,保持系统的稳定性。
13.3 系统监控 (System Monitoring)
- 流量监控: 通过监控工具(如Prometheus和Grafana)实时监测系统的流量情况,包括用户访问量、API请求数等,以便及时识别流量高峰和潜在的性能瓶颈。
- 性能监控: 监测系统的响应时间、CPU和内存使用率等性能指标,及时发现并解决性能问题。设置警报机制,当性能指标超过阈值时,自动通知运维人员进行处理。
- 模型预测精度监控: 定期对模型的预测结果进行评估,监测模型的准确性和鲁棒性。如果发现模型的预测精度下降,将自动触发模型重训练或调整流程。
13.4 备份与恢复 (Backup and Recovery)
- 数据库备份策略:
- 定期进行数据库的全量备份与增量备份,确保数据的持久性与安全性。备份文件将存储在云存储(如AWS S3)中,确保在数据丢失或损坏时能够迅速恢复。
- 系统故障恢复计划:
- 制定系统故障应急响应计划,明确各类故障情况下的处理流程和责任人。定期进行故障演练,确保所有团队成员了解恢复流程,能够在发生故障时快速响应,降低系统停机时间。
通过以上部署与运维策略,我们的交通流量预测系统能够在生产环境中稳定、高效地运行,及时响应用户需求,并为交通管理部门提供持续的决策支持。同时,完善的监控和备份机制确保了系统的安全性和数据的完整性。
(十四)未来扩展 (Future Enhancements)
在交通流量预测系统的基础功能实现后,未来的扩展方向和系统的迭代更新将是进一步提升系统性能、适应更多场景的关键。本节将从未来可能增加的功能、系统扩展性评估以及用户反馈与迭代计划三方面展开探讨。
14.1 未来可能增加的功能 (Potential Future Features)
- 多城市支持:
- 随着系统的推广,支持多个城市的交通流量预测将成为未来的扩展目标。为了适应不同城市的道路结构、交通模式和数据特点,系统需要具备灵活的数据处理和模型调优能力。未来系统可能需要引入城市级别的配置文件,以便快速适应不同城市的需求。
- 预测算法改进:
- 目前系统采用的预测模型已能提供较高的预测准确率,但随着数据规模和计算资源的增加,未来可以考虑引入更为复杂的深度学习模型(如图神经网络、注意力机制模型等)以进一步提升预测精度。此外,还可以通过集成学习(Ensemble Learning)方法,结合多个模型的优点,提高预测的稳健性。
- 实时交通预测:
- 在未来版本中,系统可以进一步优化预测频率,提供更加实时的交通流量预测功能。这可以通过提升数据采集和处理效率,结合实时数据流技术(如Apache Kafka)来实现。
- 交通优化建议:
- 除了提供交通流量预测外,系统还可以引入交通优化建议功能。基于预测结果和交通模型分析,向用户提供最优的出行路线建议,或向交通管理部门提供信号灯优化、车道规划等管理建议。
14.2 系统扩展性评估 (System Scalability Evaluation)
- 架构设计的扩展性:
- 目前系统的微服务架构为未来的功能扩展提供了良好的支持。每个模块(前端、后端、数据库、模型)都是独立的,便于灵活扩展和替换。例如,数据库可以从单一节点扩展为分布式集群,以应对更大规模的数据存储需求;后端服务可以通过水平扩展支持更多并发请求。
- 多城市数据处理的扩展性:
- 为支持多城市交通流量预测,系统的数据处理模块需具备处理不同城市交通数据的能力。通过城市级别的数据分片和独立模型训练,系统将能够在不影响整体性能的前提下,支持多个城市的数据处理与预测。
- 模型扩展性:
- 当前系统中的模型部署采用了服务化的方式,这种设计便于快速更新和扩展模型。在未来,我们可以通过增加新的模型或改进现有模型,在不影响系统整体结构的情况下实现模型升级。同时,采用多模型集成策略,能够提升系统的预测灵活性和精度。
14.3. 用户反馈与迭代计划 (User Feedback and Iteration Plan)
- 用户反馈收集:
- 为了不断提升系统的用户体验和功能,未来将建立用户反馈机制。通过在前端系统中集成反馈按钮,用户可以提交关于系统性能、预测准确度以及使用便捷性的意见。此外,交通管理部门的反馈将为系统优化提供宝贵的指导,例如根据他们的建议进一步调整预测模型或数据处理流程。
- 功能迭代计划:
- 根据用户反馈和实际运营数据,系统将每季度进行一次功能迭代,修复Bug、优化性能,并根据需求引入新功能。优先级较高的功能(如实时预测、城市扩展)将作为短期迭代目标,较为复杂的功能(如多模型融合)则规划在中长期的更新中逐步实现。
- 模型迭代计划:
- 随着更多的交通数据积累,系统将定期对模型进行重新训练和优化。结合用户反馈的预测效果和系统自带的性能监控数据,我们将定期评估并优化现有的预测模型,确保系统能够跟上交通模式的变化并提供持续准确的预测。
通过这些未来的功能扩展、系统的可扩展性设计和用户反馈驱动的迭代计划,交通流量预测系统将具备长期的可持续发展能力,并在未来为更多用户和城市提供精准的交通流量预测和管理支持。
(十五)结论 (Conclusion)
本实验报告围绕交通流量预测系统的设计与实现展开,详细探讨了系统的各个核心模块,包括前端、后端、数据库、模型以及可视化分析平台的实现和功能设计。系统通过集成先进的数据处理技术和预测算法,提供了精准的交通流量预测,并将预测结果可视化,以便为用户和交通管理部门提供有效的决策支持。
在项目背景和需求分析中,我们明确了交通流量预测系统的核心目标,即通过对关键路段的实时数据采集和清洗,构建高精度的交通预测模型,预测未来一段时间内的交通状况。系统的设计不仅考虑了实时性和准确性,还融入了对扩展性、安全性和性能的全面思考。
在系统架构设计方面,采用微服务架构,实现了各个模块的解耦与独立部署。前端通过现代化的框架设计友好的用户界面,后端服务通过高效的API设计支持数据的流动与模型的调用,数据库采用高效的存储方案以应对大规模交通数据的存储与管理,模型部分则通过先进的机器学习算法实现高效的流量预测。
系统在安全性方面,虽然只采用了密码登录作为认证方式,但通过对管理员和用户的不同权限管理,提升了系统的可控性和管理灵活性。在性能上,系统针对高并发请求和数据缓存的策略,使得在高负载下仍能保持良好的响应速度和预测精度,确保系统在实际应用中的表现稳定。
通过部署与运维部分的设计,系统能够实现自动化的持续集成与部署,保障了新功能的快速迭代和版本更新。此外,系统的监控和备份策略为后期的运行维护提供了有效支持,确保系统的高可用性。
在未来扩展计划中,系统具备支持多城市、多模型扩展的潜力,预计在未来的迭代中,能够为更多用户提供更广泛的功能支持,同时通过用户反馈的机制不断优化系统性能和用户体验。
总的来说,本次实验成功实现了高效的交通流量预测系统的设计与开发,达到了系统预期的目标。尽管目前系统的安全性和实时性上仍有提升空间,但整体设计在功能性、性能优化和扩展性方面展现了较强的优势。未来的迭代更新将基于用户反馈和技术进步,进一步提升系统的功能广度和深度,持续为智能交通管理提供有力支持。
- 前端&接口层:刘pl,梅by
- 后端(模型实现):彭j
- 后端(可视化实现):郑yj
- 数据库实现:杨zh
(十七)心得体会 (Reflections)
郑yj:
在实验过程中,我体会到了数据可视化在理解复杂交通网络中的重要性。通过图表和拓扑图等可视化手段,能够快速、直观地揭示海量数据背后的规律。在分析过程中,我也切实体会到交通问题的复杂性和多样性,不仅数据量庞大,数据之间的关联性也极为复杂。
从实现的角度来看,难点主要集中在两个方面:一是处理数据的缺失值、异常值及格式问题,以确保数据质量;二是选择合适的可视化图表。对于缺失值,不同程度的数据缺失需要采用不同的处理方式,简单地删除缺失值可能会导致大量有效数据的浪费。此外,选择合适的可视化图表至关重要。不同的数据可以传达不同的信息,同一组数据也可以通过多种可视化方式呈现。因此,在可视化实现中,需要仔细权衡数据特征与图表形式的匹配,以及图表的易读性与信息量的平衡。
在改进方面,目前可视化的交互性仍有待提升。随着数据量的不断增加以及用户需求的多样化,设计具有交互性的可视化工具将变得尤为重要。这样的工具能够帮助用户从不同的层次和角度深入探索数据,使得数据分析更加灵活和高效。
梅by:
在实验过程中,我主要负责部分前端开发、前后端接口设计及部分后端实现工作。前端开发主要基于Vue框架,我根据预定的功能需求和已定义的API接口进行页面逻辑和数据绑定,并对UI样式进行优化和调整。
前后端接口的设计是整个系统开发中的关键环节,它明确划分了前后端的职责。为确保前后端数据通信的顺畅,我们在定义接口时投入了大量时间和精力,反复讨论和确认最终的接口设计。
在后端方面,我负责实现与前端交互的可视化响应模块。该模块的主要功能是接收前端请求,实例化可视化模型(可视化模型的具体实现由郑同学负责)。通过这项工作,我深入学习了组件嵌套的技术,特别是在可视化页面中,通过按钮切换不同页面的功能实现。这部分工作涉及了较为复杂的逻辑设计,为了实现不同可视化页面的动态切换,我们编写了框架逻辑,这也成为开发过程中耗时较多的部分。一旦框架完成,具体页面的实现相对简单。
整个系统中,前端基于Vue框架,后端则使用Python进行开发与处理。这次实验不仅加深了我对前后端协作的理解,也让我对组件化开发有了更深入的掌握。
彭j:
本次实验中我主要负责模型预测部分的代码编写,我们的预测模型主要使用了XGBoost模型,基于此模型我们经过训练得到了效果不错的结果,并将训练出的模型保存下来实现实时预测。
在这次项目中我最宝贵的经验是学习到了团队合作中应该如何提升团队合作的效率。由于小组同学都没有相应的经验,我们对于代码的交流都是直接在群里发代码文件让组员下载查看,事实上这很容易导致我们的代码更新不同步以及群内消息的混乱,使我们浪费了更多时间以及精力。助教在验收我们的项目时告诉我们可以使用git等仓库来记录更新我们的代码,我觉得这是一个很好的建议。同时,在完成预测代码的编写后,我直接将代码文件发给了组内同学,但是在其他同学的建议下我意识到其他同学其实并没有精力来检查或者看懂别人的代码,我应该将代码做得更加模块化,这样其他同学只需要调用函数就可以实现相应的功能。因此最后我将自己实现的代码编写成一个函数,其他组内同学只需要知道传入的参数以及结果就可以直接使用这段代码进行预测。
经过这个项目,我了解到大型项目的编写应该灵活使用仓库等工具,更深刻地理解并培养了模块化编写代码的意识,提高了自己的团队合作能力。
刘pl:
在本次实验过程中,我负责了前端网页的开发、前后端交互、将数据库数据呈现到前端等工作。在实现过程中,前端基于Vue和Typescript实现,为使界面更加美观,我们采用了css对整体界面进行了美化。从网站搭建过程中,看似是比较难以下手的,其实如果从一个页面出发,设计好后续每一个页面的路由,甚至每个页面的功能也有可借鉴之处,如此就可以搭建起一个完整的网站。
在前后端交互过程中,我们在上传文件上的接口出现了一些问题,后端数据无法正常传回前端,最终我们采取了axios直接寻找后端接口的路由解决了问题。除此之外,在交互过程中还需要注意前端传给后端的数据格式、大小等,保证后端程序能够正确处理数据,同样地,也要保证后端传给前端的格式一致,要设计好对应格式的queryform。
此外,对于预测数据的查询功能,我们目前只实现了精确搜索,对于模糊搜索我的看法是可以利用sql语句中的“%,_”等实现模糊搜索,这是可以进一步改进的地方。
完成这个项目离不开小组每个人的努力,在整个过程中,我们出现了不少问题,也从中学到了很多,为了能将任务分工并更好地完成,我们应在项目开始前,就规定好前后端交互的接口,让前端对后端数据的调用更加方便,后端的数据也能以正确的格式传回前端,每个人也可以分块地并行完成这个项目。
杨zh:
本次实验中,我主要负责数据库设计与实现部分,另写有脚本供后端调用。
利用PowerDesigner进行数据库模型设计,设计合适的数据模型,使得交通数据表和用户数据表通过外键关联,确保了数据的完整性与一致性,这在后续数据分析和可视化中显得尤为重要。通过E-R图直观体现出表与表之间的关系,并能自动生成SQL语句。部分数据集数据则采用脚本插入等方式避免冗长插入语句。本项目采用关系型数据库 PostgreSQL,能够有效地存储和管理结构化数据,为系统的各个可视化模块提供强有力的数据支撑。为避免数据不同文件格式对系统效率产生影响,供文件转换脚本进行调用。
在处理历史交通数据时,设计了高频写入的策略以应对实时数据流,同时考虑到历史数据的存储,定期的归档与压缩策略有效地节省了存储空间。此外,利用脚本进行数据备份与恢复,让我明白了保障数据安全性和可靠性的必要性。
通过这一次的实践,我不仅提升了数据库设计的能力,也对如何在实际应用中优化数据存储与访问有了更深刻的理解。团队中每个人在自己负责的模块上精益求精,使得整个系统在数据处理上更加高效与稳定,并能通过前端可视化进行直观展现。未来,我希望能够继续探索更复杂的数据库设计,同时结合前后端以及数据可视化技术,为各种业务需求提供稳健的解决方案。