旅游推荐系统设计与实现【大数据可视化分析】大数据可视化大屏 大数据项目 选题推荐 Hadoop+SPark 部署+文档指导+ppt+教学课程 java

61 阅读6分钟

💖💖作者:计算机毕业设计杰瑞 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长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等,开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学校实战项目 计算机毕业设计选题推荐