💖💖作者:计算机毕业设计杰瑞 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学校实战项目 计算机毕业设计选题推荐
旅游推荐系统设计与实现介绍
旅游推荐系统是一款基于大数据技术构建的智能化旅游服务平台,采用Hadoop分布式存储框架和Spark大数据处理引擎作为核心技术支撑,通过Python编程语言结合Django后端框架实现业务逻辑处理,前端采用Vue.js配合ElementUI组件库构建用户交互界面。系统整合了江西省丰富的旅游资源数据,通过HDFS分布式文件系统存储海量景点信息、用户行为数据和旅游路线数据,利用Spark SQL进行高效的数据查询和分析处理。平台提供系统首页展示、用户注册登录管理、江西景点信息浏览、江西旅游资源检索、智能旅游路线规划、轮播图内容管理以及个人中心设置等七大核心功能模块。系统运用Pandas和NumPy数据处理库对用户偏好进行深度挖掘,结合Echarts数据可视化技术为用户呈现直观的旅游数据分析结果,通过MySQL数据库存储结构化数据,实现了传统关系型数据库与大数据技术的有机融合,为用户提供个性化的江西旅游推荐服务和智能化的出行规划方案。
旅游推荐系统设计与实现演示视频
旅游推荐系统设计与实现演示图片
旅游推荐系统设计与实现代码展示
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, desc, count, avg, collect_list
import pandas as pd
import numpy as np
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
import json
import mysql.connector
from datetime import datetime
spark = SparkSession.builder.appName("TourismRecommendationSystem").config("spark.sql.adaptive.enabled", "true").config("spark.sql.adaptive.coalescePartitions.enabled", "true").getOrCreate()
@csrf_exempt
def intelligent_scenic_recommendation(request):
if request.method == 'POST':
user_data = json.loads(request.body)
user_id = user_data.get('user_id')
preference_tags = user_data.get('preference_tags', [])
budget_range = user_data.get('budget_range', {'min': 0, 'max': 1000})
travel_days = user_data.get('travel_days', 3)
scenic_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/tourism_db").option("dbtable", "jiangxi_scenic_spots").option("user", "root").option("password", "password").load()
user_behavior_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/tourism_db").option("dbtable", "user_behavior_logs").option("user", "root").option("password", "password").load()
filtered_scenic = scenic_df.filter(col("average_cost").between(budget_range['min'], budget_range['max']))
if preference_tags:
tag_condition = col("tags").rlike("|".join(preference_tags))
filtered_scenic = filtered_scenic.filter(tag_condition)
popularity_scores = user_behavior_df.filter(col("action_type") == "visit").groupBy("scenic_spot_id").agg(count("user_id").alias("visit_count"), avg("rating").alias("avg_rating"))
scenic_with_scores = filtered_scenic.join(popularity_scores, filtered_scenic.scenic_spot_id == popularity_scores.scenic_spot_id, "left_outer").fillna({"visit_count": 0, "avg_rating": 3.0})
similar_users = user_behavior_df.filter(col("user_id") != user_id).filter(col("scenic_spot_id").isin([spot['scenic_spot_id'] for spot in user_behavior_df.filter(col("user_id") == user_id).collect()]))
collaborative_scores = similar_users.groupBy("scenic_spot_id").agg(avg("rating").alias("collaborative_score"))
final_recommendations = scenic_with_scores.join(collaborative_scores, "scenic_spot_id", "left_outer").fillna({"collaborative_score": 3.0})
recommendation_formula = (col("avg_rating") * 0.4 + col("collaborative_score") * 0.3 + (col("visit_count") / 100.0) * 0.3)
final_recommendations = final_recommendations.withColumn("recommendation_score", recommendation_formula)
top_recommendations = final_recommendations.orderBy(desc("recommendation_score")).limit(travel_days * 2).select("scenic_spot_id", "spot_name", "description", "average_cost", "recommendation_score", "location_coordinates").collect()
recommendations_list = []
for row in top_recommendations:
recommendations_list.append({
'scenic_spot_id': row.scenic_spot_id,
'spot_name': row.spot_name,
'description': row.description,
'average_cost': row.average_cost,
'recommendation_score': float(row.recommendation_score),
'coordinates': row.location_coordinates
})
return JsonResponse({'status': 'success', 'recommendations': recommendations_list, 'total_count': len(recommendations_list)})
@csrf_exempt
def smart_route_planning(request):
if request.method == 'POST':
route_data = json.loads(request.body)
selected_spots = route_data.get('selected_spots', [])
start_location = route_data.get('start_location')
travel_days = route_data.get('travel_days', 3)
transportation_mode = route_data.get('transportation_mode', 'car')
spots_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/tourism_db").option("dbtable", "jiangxi_scenic_spots").option("user", "root").option("password", "password").load()
selected_spots_df = spots_df.filter(col("scenic_spot_id").isin(selected_spots))
spots_with_coords = selected_spots_df.select("scenic_spot_id", "spot_name", "location_coordinates", "recommended_visit_hours", "opening_time", "closing_time").collect()
distance_matrix = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/tourism_db").option("dbtable", "distance_matrix").option("user", "root").option("password", "password").load()
spots_coordinates = {}
spots_info = {}
for spot in spots_with_coords:
coords = spot.location_coordinates.split(',')
spots_coordinates[spot.scenic_spot_id] = {'lat': float(coords[0]), 'lng': float(coords[1])}
spots_info[spot.scenic_spot_id] = {
'name': spot.spot_name,
'visit_hours': spot.recommended_visit_hours,
'opening_time': spot.opening_time,
'closing_time': spot.closing_time
}
route_days = []
spots_per_day = len(selected_spots) // travel_days
remaining_spots = len(selected_spots) % travel_days
current_spot_index = 0
for day in range(travel_days):
daily_spots_count = spots_per_day + (1 if day < remaining_spots else 0)
daily_spots = selected_spots[current_spot_index:current_spot_index + daily_spots_count]
if not daily_spots:
continue
optimized_daily_route = []
current_location = start_location if day == 0 else optimized_daily_route[-1]['spot_id'] if optimized_daily_route else daily_spots[0]
unvisited_spots = daily_spots.copy()
while unvisited_spots:
nearest_spot = None
min_distance = float('inf')
for spot_id in unvisited_spots:
distance_row = distance_matrix.filter((col("origin_id") == current_location) & (col("destination_id") == spot_id)).first()
if distance_row:
distance = distance_row.distance_km
if distance < min_distance:
min_distance = distance
nearest_spot = spot_id
if nearest_spot:
optimized_daily_route.append({
'spot_id': nearest_spot,
'spot_name': spots_info[nearest_spot]['name'],
'visit_hours': spots_info[nearest_spot]['visit_hours'],
'distance_from_previous': min_distance,
'coordinates': spots_coordinates[nearest_spot]
})
unvisited_spots.remove(nearest_spot)
current_location = nearest_spot
else:
break
route_days.append({'day': day + 1, 'spots': optimized_daily_route, 'total_distance': sum([spot['distance_from_previous'] for spot in optimized_daily_route])})
current_spot_index += daily_spots_count
total_route_distance = sum([day['total_distance'] for day in route_days])
estimated_travel_time = total_route_distance * (1.2 if transportation_mode == 'car' else 1.8)
return JsonResponse({
'status': 'success',
'route_plan': route_days,
'total_distance': total_route_distance,
'estimated_travel_time': estimated_travel_time,
'transportation_mode': transportation_mode
})
@csrf_exempt
def tourism_data_analysis(request):
if request.method == 'GET':
analysis_type = request.GET.get('analysis_type', 'popularity')
time_range = request.GET.get('time_range', '30')
scenic_spots_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/tourism_db").option("dbtable", "jiangxi_scenic_spots").option("user", "root").option("password", "password").load()
user_behavior_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/tourism_db").option("dbtable", "user_behavior_logs").option("user", "root").option("password", "password").load()
user_visits_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/tourism_db").option("dbtable", "user_visits").option("user", "root").option("password", "password").load()
recent_data = user_behavior_df.filter(col("action_date") >= f"DATE_SUB(CURRENT_DATE(), {time_range})")
if analysis_type == 'popularity':
popularity_analysis = recent_data.filter(col("action_type") == "visit").groupBy("scenic_spot_id").agg(count("user_id").alias("visit_count"), avg("rating").alias("avg_rating")).join(scenic_spots_df.select("scenic_spot_id", "spot_name"), "scenic_spot_id").orderBy(desc("visit_count"))
popularity_data = []
for row in popularity_analysis.limit(20).collect():
popularity_data.append({
'spot_name': row.spot_name,
'visit_count': row.visit_count,
'avg_rating': float(row.avg_rating) if row.avg_rating else 0.0,
'popularity_score': row.visit_count * (row.avg_rating if row.avg_rating else 3.0)
})
return JsonResponse({'status': 'success', 'analysis_type': 'popularity', 'data': popularity_data})
elif analysis_type == 'seasonal':
seasonal_analysis = user_visits_df.withColumn("month", col("visit_date").substr(6, 2)).groupBy("month", "scenic_spot_id").agg(count("user_id").alias("monthly_visits")).join(scenic_spots_df.select("scenic_spot_id", "spot_name"), "scenic_spot_id")
seasonal_trends = seasonal_analysis.groupBy("month").agg(avg("monthly_visits").alias("avg_monthly_visits")).orderBy("month")
seasonal_data = []
for row in seasonal_trends.collect():
seasonal_data.append({
'month': int(row.month),
'avg_visits': float(row.avg_monthly_visits),
'season': 'Spring' if row.month in ['03', '04', '05'] else 'Summer' if row.month in ['06', '07', '08'] else 'Autumn' if row.month in ['09', '10', '11'] else 'Winter'
})
return JsonResponse({'status': 'success', 'analysis_type': 'seasonal', 'data': seasonal_data})
elif analysis_type == 'user_preference':
preference_analysis = recent_data.filter(col("rating").isNotNull()).groupBy("user_age_group", "scenic_category").agg(avg("rating").alias("avg_preference_score"), count("user_id").alias("interaction_count"))
preference_data = []
for row in preference_analysis.collect():
preference_data.append({
'age_group': row.user_age_group,
'scenic_category': row.scenic_category,
'preference_score': float(row.avg_preference_score),
'interaction_count': row.interaction_count
})
clustered_preferences = {}
for item in preference_data:
age_group = item['age_group']
if age_group not in clustered_preferences:
clustered_preferences[age_group] = []
clustered_preferences[age_group].append({
'category': item['scenic_category'],
'score': item['preference_score'],
'count': item['interaction_count']
})
return JsonResponse({'status': 'success', 'analysis_type': 'user_preference', 'clustered_data': clustered_preferences})
return JsonResponse({'status': 'error', 'message': 'Invalid analysis type'})
旅游推荐系统设计与实现文档展示
💖💖作者:计算机毕业设计杰瑞 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学校实战项目 计算机毕业设计选题推荐