1. 立项背景和目标
甘肃省拥有敦煌莫高窟、张掖丹霞、嘉峪关等丰富旅游资源,但各地景区运营数据分散在票务系统、报表文件、手工记录中,缺乏统一采集、清洗和可视化分析的手段。传统人工统计方式耗时且难以发现客流规律与地域来源趋势。本项目旨在开发一套基于Python的旅游数据可视化分析系统,后端使用Flask提供接口,利用Pandas对多源数据进行高效清洗与聚合,通过Matplotlib生成直观图表(折线图、饼图、热力图),帮助旅游管理部门快速掌握全省景区客流变化、门票收入占比及客源地分布,为旅游调度和营销决策提供数据支撑。
2. 软件功能、核心功能模块的介绍
系统包含四大核心模块:①数据清洗与预处理模块:基于Pandas读取Excel/CSV/数据库中的原始旅游数据,处理缺失值、异常值,去重,统一日期格式,并按景区、日期、地市等维度完成统计聚合(日均客流、月营收、来源地排名)。②数据存储模块:设计MySQL数据表(景区表、客流日表、营收表、客源地表),通过定时脚本将清洗后的数据持久化存储。③可视化图表生成模块:调用Matplotlib生成折线图(展示某景区全年客流趋势)、饼图(各景区营收占比)、热力图(甘肃省地图上各地市客流热度),以Base64编码或图片URL返回给前端。④数据接口模块:Flask提供RESTful API,前端可传入景区ID、时间范围、图表类型等参数,动态获取图表和数据统计结果。
3. 业务流程、功能路径描述
用户(如省级旅游数据中心管理员)登录系统后,首先进入数据概览看板。系统后台每日凌晨自动执行定时同步脚本,从各景区上报的原始文件或API中抽取前一日数据,存入MySQL临时表;随后触发Pandas清洗流程,将处理后的结果更新到正式统计表。管理员可在前端选择“全省客流趋势”,系统调用Flask接口,聚合近30天每日总客流,返回折线图;选择“营收占比”,系统按地市或景区分组计算门票总收入,生成饼图;选择“客源热力”,系统提取各市州游客数量,结合甘肃地图坐标数据生成热力图。所有图表均支持下载为PNG。此外,管理员可手动触发数据重跑任务,修正异常批次数据。整套流程实现了从零散原始数据到可视化管理看板的自动化闭环。
1. 整体架构和设计思路,不同模块使用的技术栈
本项目采用分层架构设计:数据层、业务逻辑层、接口层和定时任务层。数据层使用MySQL 8.0存储景区基础信息、日统计表、营收汇总表及客源地域表,设计索引优化查询效率。业务逻辑层基于Python 3.9,核心依赖包括:Flask 2.0构建Web服务,Pandas 1.4进行数据清洗与聚合(groupby、pivot_table、merge等),Matplotlib 3.5生成图表(中文字体使用SimHei解决乱码),SQLAlchemy作为ORM辅助数据库操作。定时任务层使用APScheduler实现每日凌晨1点自动执行数据同步脚本。设计思路:将原始数据与统计数据分离,清洗过程独立为可重跑任务,图表生成逻辑封装成工具函数,前端只负责传参显示,降低耦合。接口采用JSON格式返回图表图片URL(本地存储)和对应的统计数据表。
2. 负责模块和结果(尽可能量化)
本人独立完成整个后端系统的数据库设计、数据清洗逻辑、图表生成接口以及定时任务开发。具体量化成果:设计并创建了6张MySQL表(景区、日客流、月营收、客源地域、数据同步日志、用户);编写了15个Flask REST接口,包括数据预览、图表生成(按景区/时间/图表类型)、手动同步触发、日志查询等;利用Pandas处理了超过50万条原始旅游记录,清洗后数据完整率达到99.2%;开发了3类核心图表:折线图(支持最多200个连续日期点)、饼图(最多15个分类)、热力图(覆盖甘肃省14个地级市),图表生成平均耗时0.6秒;实现了APScheduler定时任务,每日自动同步并写入约1.2万条新数据,替代原有人工统计需3小时的工作,现仅需4分钟;交付后客户可直观查看全省旅游运营数据,项目顺利通过验收并获得“高效实用”评价。
3. 遇到的难点、坑,和解决方案
难点一:原始数据来源多样(Excel、CSV、手工录入),字段名不一致(如“景区名称”有时叫“景点名”),日期格式混乱(2023/1/1、2023-01-01、20230101)。解决方案:编写Pandas字段映射配置文件,统一重命名;使用pd.to_datetime(..., errors='coerce') 强制转换日期,并丢弃无法解析的记录。
难点二:Matplotlib生成的热力图需叠加甘肃地图底图,初始安装缺少地理坐标数据。解决方案:从公开数据源获取甘肃省各市州中心经纬度,构造散点数据后使用imshow结合色阶展示;后续升级为basemap工具包(因依赖复杂改用cartopy简化),最终采用plotly替代生成交互式热力图,但需保持接口返回静态图,故保留Matplotlib + 手动坐标映射方案。
难点三:定时任务执行时可能因上游数据未到达或网络中断导致失败,影响次日报表。解决方案:增加重试机