一、个人简介
💖💖作者:计算机编程果茶熊 💙💙个人简介:曾长期从事计算机专业培训教学,担任过编程老师,同时本人也热爱上课教学,擅长Java、微信小程序、Python、Golang、安卓Android等多个IT方向。会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 计算机毕业设计选题 💕💕文末获取源码联系计算机编程果茶熊
二、系统介绍
大数据框架:Hadoop+Spark(Hive需要定制修改) 开发语言:Java+Python(两个版本都支持) 数据库:MySQL 后端框架:SpringBoot(Spring+SpringMVC+Mybatis)+Django(两个版本都支持) 前端:Vue+Echarts+HTML+CSS+JavaScript+jQuery
电影评分人气数据可视化分析系统是一个基于大数据技术的智能化电影市场分析平台,采用Hadoop+Spark分布式计算框架处理海量电影数据,通过Python语言结合Django后端框架构建稳定的服务层,前端采用Vue+ElementUI+Echarts技术栈实现友好的交互界面和丰富的数据可视化效果。系统集成了用户管理、电影评分人气数据管理、发行趋势分析、特征关联分析、评分人气分析、市场深度分析等核心功能模块,利用Spark SQL进行高效的数据查询和计算,结合Pandas、NumPy进行数据处理和统计分析,MySQL数据库保障数据存储的可靠性,最终通过可视化大屏直观展示分析结果,为电影行业从业者、投资方、研究机构等提供科学的数据支撑和决策参考,帮助用户深入了解电影市场动态、观众偏好趋势和票房表现规律。
三、视频解说
四、部分功能展示
五、部分代码展示
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, avg, count, sum, when, desc, asc, year, month, dayofmonth
from pyspark.sql.types import StructType, StructField, StringType, IntegerType, FloatType, DateType
import pandas as pd
import numpy as np
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt
import json
from datetime import datetime, timedelta
from collections import defaultdict
import mysql.connector
from django.conf import settings
def movie_rating_popularity_analysis(request):
spark = SparkSession.builder.appName("MovieRatingAnalysis").config("spark.sql.adaptive.enabled", "true").config("spark.sql.adaptive.coalescePartitions.enabled", "true").getOrCreate()
movie_schema = StructType([StructField("movie_id", IntegerType(), True), StructField("title", StringType(), True), StructField("genre", StringType(), True), StructField("release_date", DateType(), True), StructField("rating", FloatType(), True), StructField("vote_count", IntegerType(), True), StructField("popularity", FloatType(), True), StructField("budget", IntegerType(), True), StructField("revenue", IntegerType(), True)])
movie_df = spark.read.option("header", "true").schema(movie_schema).csv("hdfs://localhost:9000/movie_data/movies.csv")
rating_df = spark.read.option("header", "true").csv("hdfs://localhost:9000/movie_data/ratings.csv")
movie_df.createOrReplaceTempView("movies")
rating_df.createOrReplaceTempView("ratings")
popularity_analysis = spark.sql("""SELECT genre, AVG(rating) as avg_rating, AVG(popularity) as avg_popularity, COUNT(*) as movie_count, SUM(vote_count) as total_votes FROM movies WHERE rating IS NOT NULL AND popularity IS NOT NULL GROUP BY genre ORDER BY avg_popularity DESC""")
rating_distribution = spark.sql("""SELECT CASE WHEN rating >= 8.0 THEN 'Excellent' WHEN rating >= 7.0 THEN 'Good' WHEN rating >= 6.0 THEN 'Average' WHEN rating >= 5.0 THEN 'Below Average' ELSE 'Poor' END as rating_category, COUNT(*) as count, AVG(popularity) as avg_popularity FROM movies WHERE rating IS NOT NULL GROUP BY rating_category ORDER BY avg_popularity DESC""")
monthly_trends = spark.sql("""SELECT YEAR(release_date) as year, MONTH(release_date) as month, AVG(rating) as avg_rating, AVG(popularity) as avg_popularity, COUNT(*) as release_count FROM movies WHERE release_date IS NOT NULL GROUP BY YEAR(release_date), MONTH(release_date) ORDER BY year DESC, month DESC LIMIT 24""")
vote_popularity_correlation = movie_df.select("vote_count", "popularity", "rating").filter((col("vote_count") > 0) & (col("popularity") > 0) & (col("rating") > 0))
correlation_data = vote_popularity_correlation.toPandas()
correlation_matrix = np.corrcoef(correlation_data['vote_count'], correlation_data['popularity'])[0, 1]
rating_correlation = np.corrcoef(correlation_data['rating'], correlation_data['popularity'])[0, 1]
top_movies = spark.sql("""SELECT title, rating, popularity, vote_count, genre FROM movies WHERE rating IS NOT NULL AND popularity IS NOT NULL ORDER BY (rating * 0.4 + popularity * 0.6) DESC LIMIT 20""")
genre_performance = spark.sql("""SELECT genre, AVG(rating) as avg_rating, AVG(popularity) as avg_popularity, AVG(revenue) as avg_revenue, COUNT(*) as movie_count FROM movies WHERE genre IS NOT NULL AND revenue > 0 GROUP BY genre HAVING COUNT(*) >= 5 ORDER BY avg_revenue DESC""")
result_data = {"popularity_by_genre": [row.asDict() for row in popularity_analysis.collect()], "rating_distribution": [row.asDict() for row in rating_distribution.collect()], "monthly_trends": [row.asDict() for row in monthly_trends.collect()], "correlations": {"vote_popularity": float(correlation_matrix), "rating_popularity": float(rating_correlation)}, "top_movies": [row.asDict() for row in top_movies.collect()], "genre_performance": [row.asDict() for row in genre_performance.collect()]}
spark.stop()
return JsonResponse(result_data, safe=False)
def movie_release_trend_analysis(request):
spark = SparkSession.builder.appName("ReleaseTrendAnalysis").config("spark.sql.adaptive.enabled", "true").config("spark.sql.adaptive.coalescePartitions.enabled", "true").getOrCreate()
movie_df = spark.read.option("header", "true").option("inferSchema", "true").csv("hdfs://localhost:9000/movie_data/movies.csv")
box_office_df = spark.read.option("header", "true").option("inferSchema", "true").csv("hdfs://localhost:9000/movie_data/box_office.csv")
movie_df.createOrReplaceTempView("movies")
box_office_df.createOrReplaceTempView("box_office")
yearly_trends = spark.sql("""SELECT YEAR(release_date) as year, COUNT(*) as movie_count, AVG(rating) as avg_rating, AVG(budget) as avg_budget, AVG(revenue) as avg_revenue, SUM(revenue) as total_revenue FROM movies WHERE release_date IS NOT NULL AND YEAR(release_date) >= 2010 GROUP BY YEAR(release_date) ORDER BY year""")
seasonal_analysis = spark.sql("""SELECT CASE WHEN MONTH(release_date) IN (3,4,5) THEN 'Spring' WHEN MONTH(release_date) IN (6,7,8) THEN 'Summer' WHEN MONTH(release_date) IN (9,10,11) THEN 'Fall' ELSE 'Winter' END as season, COUNT(*) as movie_count, AVG(revenue) as avg_revenue, AVG(rating) as avg_rating FROM movies WHERE release_date IS NOT NULL GROUP BY season ORDER BY avg_revenue DESC""")
genre_yearly_trends = spark.sql("""SELECT genre, YEAR(release_date) as year, COUNT(*) as count, AVG(revenue) as avg_revenue FROM movies WHERE release_date IS NOT NULL AND genre IS NOT NULL AND YEAR(release_date) >= 2015 GROUP BY genre, YEAR(release_date) ORDER BY genre, year""")
monthly_release_pattern = spark.sql("""SELECT MONTH(release_date) as month, COUNT(*) as movie_count, AVG(revenue) as avg_revenue, AVG(rating) as avg_rating FROM movies WHERE release_date IS NOT NULL GROUP BY MONTH(release_date) ORDER BY month""")
budget_trend_analysis = spark.sql("""SELECT YEAR(release_date) as year, AVG(budget) as avg_budget, AVG(revenue) as avg_revenue, AVG(revenue/budget) as avg_roi FROM movies WHERE release_date IS NOT NULL AND budget > 0 AND revenue > 0 GROUP BY YEAR(release_date) ORDER BY year""")
top_grossing_by_year = spark.sql("""SELECT YEAR(release_date) as year, title, revenue, rating, genre FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY YEAR(release_date) ORDER BY revenue DESC) as rank FROM movies WHERE release_date IS NOT NULL AND revenue > 0) WHERE rank <= 3 ORDER BY year DESC, revenue DESC""")
competition_analysis = spark.sql("""SELECT DATE_FORMAT(release_date, 'yyyy-MM') as month_year, COUNT(*) as competing_movies, AVG(revenue) as avg_revenue, MAX(revenue) as max_revenue FROM movies WHERE release_date IS NOT NULL AND revenue > 0 GROUP BY DATE_FORMAT(release_date, 'yyyy-MM') HAVING COUNT(*) >= 3 ORDER BY month_year DESC LIMIT 24""")
franchise_trends = spark.sql("""SELECT CASE WHEN title LIKE '%2%' OR title LIKE '%II%' OR title LIKE '%Part%' THEN 'Sequel' ELSE 'Original' END as movie_type, YEAR(release_date) as year, COUNT(*) as count, AVG(revenue) as avg_revenue FROM movies WHERE release_date IS NOT NULL GROUP BY movie_type, YEAR(release_date) ORDER BY year, movie_type""")
result_data = {"yearly_trends": [row.asDict() for row in yearly_trends.collect()], "seasonal_analysis": [row.asDict() for row in seasonal_analysis.collect()], "genre_yearly_trends": [row.asDict() for row in genre_yearly_trends.collect()], "monthly_patterns": [row.asDict() for row in monthly_release_pattern.collect()], "budget_trends": [row.asDict() for row in budget_trend_analysis.collect()], "top_grossing": [row.asDict() for row in top_grossing_by_year.collect()], "competition_analysis": [row.asDict() for row in competition_analysis.collect()], "franchise_trends": [row.asDict() for row in franchise_trends.collect()]}
spark.stop()
return JsonResponse(result_data, safe=False)
def movie_feature_correlation_analysis(request):
spark = SparkSession.builder.appName("FeatureCorrelationAnalysis").config("spark.sql.adaptive.enabled", "true").config("spark.sql.adaptive.coalescePartitions.enabled", "true").getOrCreate()
movie_df = spark.read.option("header", "true").option("inferSchema", "true").csv("hdfs://localhost:9000/movie_data/movies_detailed.csv")
cast_df = spark.read.option("header", "true").option("inferSchema", "true").csv("hdfs://localhost:9000/movie_data/cast_data.csv")
movie_df.createOrReplaceTempView("movies")
cast_df.createOrReplaceTempView("cast_data")
budget_revenue_analysis = spark.sql("""SELECT CASE WHEN budget < 1000000 THEN 'Low Budget' WHEN budget < 10000000 THEN 'Medium Budget' WHEN budget < 50000000 THEN 'High Budget' ELSE 'Blockbuster' END as budget_category, COUNT(*) as movie_count, AVG(revenue) as avg_revenue, AVG(rating) as avg_rating, AVG(popularity) as avg_popularity FROM movies WHERE budget > 0 AND revenue > 0 GROUP BY budget_category ORDER BY avg_revenue DESC""")
runtime_performance = spark.sql("""SELECT CASE WHEN runtime < 90 THEN 'Short' WHEN runtime < 120 THEN 'Standard' WHEN runtime < 150 THEN 'Long' ELSE 'Very Long' END as runtime_category, COUNT(*) as count, AVG(rating) as avg_rating, AVG(revenue) as avg_revenue FROM movies WHERE runtime > 0 GROUP BY runtime_category ORDER BY avg_rating DESC""")
genre_director_analysis = spark.sql("""SELECT m.genre, c.director, COUNT(*) as collaboration_count, AVG(m.rating) as avg_rating, AVG(m.revenue) as avg_revenue FROM movies m JOIN cast_data c ON m.movie_id = c.movie_id WHERE m.genre IS NOT NULL AND c.director IS NOT NULL GROUP BY m.genre, c.director HAVING COUNT(*) >= 2 ORDER BY avg_rating DESC LIMIT 30""")
actor_success_correlation = spark.sql("""SELECT c.lead_actor, COUNT(*) as movie_count, AVG(m.rating) as avg_rating, AVG(m.revenue) as avg_revenue, SUM(m.revenue) as total_revenue FROM movies m JOIN cast_data c ON m.movie_id = c.movie_id WHERE c.lead_actor IS NOT NULL AND m.revenue > 0 GROUP BY c.lead_actor HAVING COUNT(*) >= 3 ORDER BY avg_revenue DESC LIMIT 20""")
release_month_genre_correlation = spark.sql("""SELECT MONTH(release_date) as month, genre, COUNT(*) as count, AVG(revenue) as avg_revenue, AVG(rating) as avg_rating FROM movies WHERE release_date IS NOT NULL AND genre IS NOT NULL GROUP BY MONTH(release_date), genre ORDER BY month, avg_revenue DESC""")
rating_vote_analysis = spark.sql("""SELECT CASE WHEN vote_count < 100 THEN 'Few Votes' WHEN vote_count < 1000 THEN 'Moderate Votes' WHEN vote_count < 5000 THEN 'Many Votes' ELSE 'Viral' END as vote_category, AVG(rating) as avg_rating, COUNT(*) as movie_count, AVG(popularity) as avg_popularity FROM movies WHERE vote_count > 0 GROUP BY vote_category ORDER BY avg_rating DESC""")
numerical_features = movie_df.select("budget", "revenue", "runtime", "rating", "vote_count", "popularity").filter((col("budget") > 0) & (col("revenue") > 0) & (col("runtime") > 0) & (col("rating") > 0) & (col("vote_count") > 0) & (col("popularity") > 0))
correlation_df = numerical_features.toPandas()
correlation_matrix = correlation_df.corr().round(3)
correlation_dict = correlation_matrix.to_dict()
language_success = spark.sql("""SELECT original_language, COUNT(*) as movie_count, AVG(rating) as avg_rating, AVG(revenue) as avg_revenue, SUM(revenue) as total_revenue FROM movies WHERE original_language IS NOT NULL AND revenue > 0 GROUP BY original_language HAVING COUNT(*) >= 5 ORDER BY avg_revenue DESC LIMIT 15""")
production_company_analysis = spark.sql("""SELECT production_companies, COUNT(*) as movie_count, AVG(rating) as avg_rating, AVG(revenue) as avg_revenue FROM movies WHERE production_companies IS NOT NULL AND revenue > 0 GROUP BY production_companies HAVING COUNT(*) >= 3 ORDER BY avg_revenue DESC LIMIT 20""")
result_data = {"budget_revenue_correlation": [row.asDict() for row in budget_revenue_analysis.collect()], "runtime_performance": [row.asDict() for row in runtime_performance.collect()], "genre_director_analysis": [row.asDict() for row in genre_director_analysis.collect()], "actor_success": [row.asDict() for row in actor_success_correlation.collect()], "monthly_genre_trends": [row.asDict() for row in release_month_genre_correlation.collect()], "vote_rating_analysis": [row.asDict() for row in rating_vote_analysis.collect()], "correlation_matrix": correlation_dict, "language_success": [row.asDict() for row in language_success.collect()], "production_analysis": [row.asDict() for row in production_company_analysis.collect()]}
spark.stop()
return JsonResponse(result_data, safe=False)
六、部分文档展示
七、END
💕💕文末获取源码联系计算机编程果茶熊