本项目已部署到Aliyun,网址:shtravel-bd.cn
本项目是基于flask开发的大数据分析项目,以web为载体展示。 主体数据分为上海市内景点数据和绝大多数景点的客流量数据。
景点:携程;客流量:上海市政府数据平台- 景点名
- 经纬度
- 评分
- 综合评分(计算得到)
- 景点图片
- 距市中心距离
- 评论数
- 类别
- 旅游星级
我们选择了三个月内的,93天中每天各小时的客流量数据。
- 时间
- 景点名
- 客流量人数
- 舒适度
def convert_sight_level(level):
mapping = {'5A': 100, '4A': 80, '3A': 60, '2A': 40, '1A': 20}
return mapping.get(level, 0)
df['sightLevelScore'] = df['sightLevelStr'].apply(convert_sight_level)
df['userScore'] = df['commentScore'] / 5.0 * 100 # 用户评分最大5.0标准化到100
df['historicalVisitorFlowScore'] = df['heatScore']
df['capacityScore'] = (df['maxCapacity'] / df['maxCapacity'].max()) * 100
df['trafficScore'] = (df['trafficAccessibility'] / df['trafficAccessibility'].max()) * 100
df['comprehensiveHeatScore'] = (
df['sightLevelScore'] * 0.30 +
df['userScore'] * 0.25 +
df['historicalVisitorFlowScore'] * 0.20 +
df['capacityScore'] * 0.15 +
df['trafficScore'] * 0.10
)使用加权评分法,为每个指标分配权重:
- 景区等级:30%
- 用户评分:25%
- 历史客流量:20%
- 最大承载量:15%
- 交通通达度:10%(主要由距市中心距离反映)
页面内容及功能涵盖:
- 大数据主页大屏、
- 用户主页及登录注册、
- 景点搜索、
- 景点推荐(基于由搜索记录、用户偏好、景点自身数据构建的知识图谱)、
- deepseek对话推荐(生成的文本可自动跳转查询)、
- DashBoard(查看所有数据分析维度)、
- 客流量预测。
numpy>=1.21.0
pandas>=1.3.0
scipy>=1.7.0
matplotlib>=3.4.0
statsmodels>=0.12.2登录
注册

在注册页面,我们提供了用户自行选择&添加偏好景点类别的选项
选择完成

个人主页
用户主页分三个区域:
左上角展示用户基本信息
左下角展示用户探访过的景点
右侧展示用户动态操作和由用户偏好和搜索记录构成的知识图谱
初次进入
初次进入页面,没有任何记录,页面只有搜索栏容器居中显示
搜索内容
输入搜索内容后,页面丝滑变为上下结构,跳出基于搜索词的所有模糊搜索结果
我们基于先前注册时预填的用户偏好和每次搜索时后台同步更新的用户搜索记录构建了知识图谱
- 景点(含有景点评分)
- 景点类别
- 用户
- 景点相似性
- 用户偏好类别
- 用户搜索景点记录
初次进入
初始的AI对话界面UI
产生回答
我们调用了deepseek的API以实现对话推荐功能,以达到为用户分析更多景点细节的目的
- 生成json列表,内容为本轮对话AI推荐的所有景点名称
- 基于json列表,在文本中进行正则匹配,找到回答中所有含景点名称的字段
- 将这些名称的字段改为超链接,点击后自动跳转至项目的搜索页面
- 后端代码将自动填充搜索栏,并执行搜索操作,用户直接可以看到基于点击文本的所有景点查询结果
DashBoard
这个页面是大数据主页大屏的补充,包含所有的原始客流量数据和数据处理维度图表及分析结果
支持不同景点的各自分析与查询
使用ARIMA时间序列预测模型,以更好捕捉三个月时间内的周期性和序列性客流量变化,最终给出后一天的预测客流量数据。
页面还没做好

部署数据库后,运行pachong.py
analysis.py【针对客流量数据的图表展示】 process_data
程序入口:app.py 子程序(blueprint):analysis.py
以下是用于创建数据库及相关数据表的 MySQL 配置语句:
CREATE DATABASE IF NOT EXISTS ctrip_data DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE ctrip_data;
CREATE TABLE IF NOT EXISTS attractions (
id INT AUTO_INCREMENT PRIMARY KEY,
city VARCHAR(100),
poiName VARCHAR(255),
displayField VARCHAR(255),
distanceStr VARCHAR(50),
latitude DECIMAL(10,6),
longitude DECIMAL(10,6),
commentCount INT,
commentScore FLOAT,
heatScore FLOAT,
coverImageUrl TEXT,
isFree BOOLEAN,
price DECIMAL(10,2),
marketPrice DECIMAL(10,2),
sightCategoryInfo VARCHAR(255),
tagNameList TEXT,
sightLevelStr VARCHAR(50),
description TEXT,
UNIQUE KEY unique_spot (city, poiName) -- 避免插入重复数据
);
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY, -- 用户编号(自动递增)
username VARCHAR(50) NOT NULL UNIQUE, -- 用户名(唯一)
password VARCHAR(255) NOT NULL -- 加密后的密码
);
CREATE TABLE user_preferences (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
category VARCHAR(50) NOT NULL,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
CREATE TABLE IF NOT EXISTS user_visits (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id VARCHAR(50) NOT NULL,
poiName VARCHAR(255) NOT NULL,
UNIQUE KEY (user_id, poiName) -- 避免重复搜索记录
);

