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

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐