【数据分析】基于大数据的猫眼电影票房数据可视化分析系统 | 大数据实战项目 毕业设计选题推荐 调试运行 hadoop SPark
💖💖作者:计算机毕业设计江挽
💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我!
💛💛想说的话:感谢大家的关注与支持!
💜💜
网站实战项目
安卓/小程序实战项目
大数据实战项目
深度学习实战项目
目录
基于大数据的猫眼电影票房数据可视化分析系统系统介绍
本系统是一套基于Hadoop+Spark大数据技术架构的猫眼电影票房数据可视化分析平台,专门针对海量电影票房数据进行深度挖掘与直观展示。系统采用HDFS作为分布式存储底层,利用Spark强大的内存计算能力对猫眼平台的票房数据进行实时分析处理,通过Spark SQL完成复杂的数据查询与统计运算,结合Pandas和NumPy进行数据清洗与科学计算。后端基于Django框架构建RESTful接口服务,前端采用Vue+ElementUI搭建交互界面,通过Echarts图表库将分析结果以多维度可视化图表形式呈现,包括票房趋势折线图、地域分布热力图、类型占比饼图等多种展现方式。系统功能涵盖用户信息管理、系统基础配置、多维度数据分析模块,能够帮助用户从时间维度、地域维度、影片类型等多个角度洞察票房数据规律,为电影市场分析提供科学的数据支撑,同时也为计算机专业学生提供了一个完整的大数据技术实践案例。
基于大数据的猫眼电影票房数据可视化分析系统系统演示视频
基于大数据的猫眼电影票房数据可视化分析系统系统演示图片








基于大数据的猫眼电影票房数据可视化分析系统系统代码展示
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, sum, avg, count, desc, year, month, date_format, when, round
from pyspark.sql.types import StructType, StructField, StringType, DoubleType, IntegerType, DateType
from django.http import JsonResponse
from django.views import View
import pandas as pd
import numpy as np
import json
spark = SparkSession.builder.appName("MaoyanBoxOfficeAnalysis").config("spark.sql.warehouse.dir", "/user/hive/warehouse").config("spark.executor.memory", "2g").config("spark.driver.memory", "1g").getOrCreate()
class BoxOfficeTrendAnalysis(View):
def post(self, request):
params = json.loads(request.body)
start_date = params.get('startDate')
end_date = params.get('endDate')
movie_type = params.get('movieType', None)
df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/maoyan_db").option("dbtable", "box_office_data").option("user", "root").option("password", "123456").option("driver", "com.mysql.jdbc.Driver").load()
df_filtered = df.filter((col("release_date") >= start_date) & (col("release_date") <= end_date))
if movie_type and movie_type != 'all':
df_filtered = df_filtered.filter(col("movie_type") == movie_type)
df_with_date = df_filtered.withColumn("year_month", date_format(col("release_date"), "yyyy-MM"))
trend_df = df_with_date.groupBy("year_month").agg(sum("box_office").alias("total_box_office"),count("movie_id").alias("movie_count"),avg("box_office").alias("avg_box_office")).orderBy("year_month")
trend_pandas = trend_df.toPandas()
trend_pandas['total_box_office'] = trend_pandas['total_box_office'].apply(lambda x: round(x / 10000, 2))
trend_pandas['avg_box_office'] = trend_pandas['avg_box_office'].apply(lambda x: round(x / 10000, 2))
result_data = {
'xAxis': trend_pandas['year_month'].tolist(),
'totalBoxOffice': trend_pandas['total_box_office'].tolist(),
'movieCount': trend_pandas['movie_count'].tolist(),
'avgBoxOffice': trend_pandas['avg_box_office'].tolist()
}
growth_rates = []
for i in range(1, len(trend_pandas)):
prev_value = trend_pandas.iloc[i-1]['total_box_office']
curr_value = trend_pandas.iloc[i]['total_box_office']
if prev_value > 0:
growth_rate = round(((curr_value - prev_value) / prev_value) * 100, 2)
else:
growth_rate = 0
growth_rates.append(growth_rate)
result_data['growthRates'] = [0] + growth_rates
spark.catalog.clearCache()
return JsonResponse({'code': 200, 'message': '票房趋势分析成功', 'data': result_data})
class RegionalBoxOfficeDistribution(View):
def post(self, request):
params = json.loads(request.body)
date_range = params.get('dateRange')
top_n = params.get('topN', 10)
df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/maoyan_db").option("dbtable", "regional_box_office").option("user", "root").option("password", "123456").option("driver", "com.mysql.jdbc.Driver").load()
df_filtered = df.filter((col("stat_date") >= date_range[0]) & (col("stat_date") <= date_range[1]))
regional_agg = df_filtered.groupBy("province", "city").agg(sum("daily_box_office").alias("total_box_office"),avg("attendance_rate").alias("avg_attendance"),count("cinema_count").alias("total_cinemas")).orderBy(desc("total_box_office")).limit(top_n)
regional_pandas = regional_agg.toPandas()
regional_pandas['total_box_office'] = regional_pandas['total_box_office'] / 10000
regional_pandas['avg_attendance'] = regional_pandas['avg_attendance'] * 100
total_all = df_filtered.agg(sum("daily_box_office").alias("grand_total")).collect()[0]['grand_total']
regional_pandas['box_office_ratio'] = regional_pandas['total_box_office'].apply(lambda x: round((x * 10000 / total_all) * 100, 2) if total_all > 0 else 0)
city_data = regional_pandas[['city', 'total_box_office']].to_dict('records')
province_grouped = regional_pandas.groupby('province').agg({'total_box_office': 'sum','avg_attendance': 'mean','total_cinemas': 'sum'}).reset_index()
province_data = province_grouped.to_dict('records')
heatmap_data = []
for idx, row in regional_pandas.iterrows():
heatmap_data.append({'name': row['city'],'value': [row['province'], row['city'], round(row['total_box_office'], 2)]})
result_data = {'cityRanking': city_data,'provinceDistribution': province_data,'heatmapData': heatmap_data,'statisticSummary': {'totalRegions': len(regional_pandas),'topBoxOffice': round(regional_pandas.iloc[0]['total_box_office'], 2) if len(regional_pandas) > 0 else 0,'avgAttendance': round(regional_pandas['avg_attendance'].mean(), 2)}}
spark.catalog.clearCache()
return JsonResponse({'code': 200, 'message': '地域票房分布分析完成', 'data': result_data})
class MovieTypePerformanceAnalysis(View):
def post(self, request):
params = json.loads(request.body)
year_param = params.get('year')
min_box_office = params.get('minBoxOffice', 0)
df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/maoyan_db").option("dbtable", "movie_info").option("user", "root").option("password", "123456").option("driver", "com.mysql.jdbc.Driver").load()
df_with_year = df.withColumn("release_year", year(col("release_date")))
df_filtered = df_with_year.filter((col("release_year") == int(year_param)) & (col("box_office") >= min_box_office))
type_stats = df_filtered.groupBy("movie_type").agg(sum("box_office").alias("type_total_box_office"),count("movie_id").alias("movie_count"),avg("box_office").alias("avg_box_office"),avg("rating").alias("avg_rating")).orderBy(desc("type_total_box_office"))
type_pandas = type_stats.toPandas()
type_pandas['type_total_box_office'] = type_pandas['type_total_box_office'] / 10000
type_pandas['avg_box_office'] = type_pandas['avg_box_office'] / 10000
total_box_office_sum = type_pandas['type_total_box_office'].sum()
type_pandas['percentage'] = type_pandas['type_total_box_office'].apply(lambda x: round((x / total_box_office_sum) * 100, 2) if total_box_office_sum > 0 else 0)
pie_chart_data = []
for idx, row in type_pandas.iterrows():
pie_chart_data.append({'name': row['movie_type'],'value': round(row['type_total_box_office'], 2)})
bar_chart_data = {'categories': type_pandas['movie_type'].tolist(),'boxOfficeData': type_pandas['type_total_box_office'].round(2).tolist(),'movieCountData': type_pandas['movie_count'].tolist(),'avgRatingData': type_pandas['avg_rating'].round(1).tolist()}
type_pandas['roi_score'] = type_pandas.apply(lambda row: round((row['avg_box_office'] / row['movie_count']) * (row['avg_rating'] / 10), 2) if row['movie_count'] > 0 else 0, axis=1)
top_roi_type = type_pandas.nlargest(3, 'roi_score')[['movie_type', 'roi_score']].to_dict('records')
result_data = {'pieChartData': pie_chart_data,'barChartData': bar_chart_data,'typeRanking': type_pandas[['movie_type', 'type_total_box_office', 'movie_count', 'percentage']].to_dict('records'),'performanceAnalysis': {'topROITypes': top_roi_type,'totalTypes': len(type_pandas),'dominantType': type_pandas.iloc[0]['movie_type'] if len(type_pandas) > 0 else 'N/A'}}
spark.catalog.clearCache()
return JsonResponse({'code': 200, 'message': '影片类型表现分析完成', 'data': result_data})
基于大数据的猫眼电影票房数据可视化分析系统系统文档展示

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




所有评论(0)