【大数据】当当网图书畅销榜分析与可视化系统 计算机毕业设计项目 Hadoop+Spark环境配置 数据科学与大数据技术 附源码+文档+讲解

64 阅读6分钟

前言

💖💖作者:计算机程序员小杨 💙💙个人简介:我是一名计算机相关专业的从业者,擅长Java、微信小程序、Python、Golang、安卓Android等多个IT方向。会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。热爱技术,喜欢钻研新工具和框架,也乐于通过代码解决实际问题,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💕💕文末获取源码联系 计算机程序员小杨 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学习实战项目 计算机毕业设计选题 💜💜

一.开发工具简介

大数据框架:Hadoop+Spark(本次没用Hive,支持定制) 开发语言:Python+Java(两个版本都支持) 后端框架:Django+Spring Boot(Spring+SpringMVC+Mybatis)(两个版本都支持) 前端:Vue+ElementUI+Echarts+HTML+CSS+JavaScript+jQuery 详细技术点:Hadoop、HDFS、Spark、Spark SQL、Pandas、NumPy 数据库:MySQL

二.系统内容简介

当当网图书畅销榜分析与可视化系统是一个基于大数据技术构建的图书市场分析平台,采用Hadoop+Spark分布式计算框架对当当网图书销售数据进行深度挖掘和分析。系统运用Python语言开发,结合Django后端框架与Vue+ElementUI+Echarts前端技术栈,实现了从数据采集、存储、处理到可视化展示的完整业务流程。平台核心功能涵盖当当网图书数据管理、系统公告发布、读者偏好分析、价格与营销策略分析、市场趋势预测、作者与出版社综合评估以及数据可视化大屏展示等模块。通过Spark SQL进行数据查询优化,结合Pandas和NumPy进行数据科学计算,将海量图书销售数据转化为直观的分析报告和图表展示,为图书市场参与者提供数据驱动的决策支持,帮助出版社、书店和读者更好地理解图书市场动态和消费趋势。

三.系统功能演示

当当网图书畅销榜分析与可视化系统

四.系统界面展示

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

五.系统源码展示



from pyspark.sql import SparkSession
from pyspark.sql.functions import *
from pyspark.sql.types import *
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

spark = SparkSession.builder.appName("DangdangBookAnalysis").config("spark.sql.adaptive.enabled", "true").config("spark.sql.adaptive.coalescePartitions.enabled", "true").getOrCreate()

@csrf_exempt
def reader_preference_analysis(request):
    book_sales_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/bookstore").option("dbtable", "book_sales").option("user", "root").option("password", "password").load()
    user_behavior_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/bookstore").option("dbtable", "user_behavior").option("user", "root").option("password", "password").load()
    category_preference = book_sales_df.groupBy("category").agg(sum("sales_count").alias("total_sales"), avg("rating").alias("avg_rating"), count("book_id").alias("book_count")).orderBy(desc("total_sales"))
    age_preference = user_behavior_df.join(book_sales_df, "book_id").groupBy("age_group", "category").agg(sum("sales_count").alias("category_sales")).withColumn("preference_score", col("category_sales") * 0.7 + col("avg_rating") * 0.3)
    reading_time_analysis = user_behavior_df.withColumn("reading_hour", hour("access_time")).groupBy("reading_hour").agg(count("user_id").alias("active_users"), avg("reading_duration").alias("avg_duration"))
    seasonal_preference = book_sales_df.withColumn("season", when(month("sale_date").isin([12, 1, 2]), "winter").when(month("sale_date").isin([3, 4, 5]), "spring").when(month("sale_date").isin([6, 7, 8]), "summer").otherwise("autumn")).groupBy("season", "category").agg(sum("sales_count").alias("seasonal_sales"))
    price_sensitivity = book_sales_df.withColumn("price_range", when(col("price") < 30, "low").when(col("price") < 60, "medium").otherwise("high")).groupBy("price_range", "category").agg(sum("sales_count").alias("sales_by_price"), avg("rating").alias("avg_rating_by_price"))
    repeat_purchase = user_behavior_df.groupBy("user_id", "category").agg(count("book_id").alias("purchase_count")).filter(col("purchase_count") > 1).groupBy("category").agg(count("user_id").alias("repeat_customers"))
    gender_preference = user_behavior_df.join(book_sales_df, "book_id").groupBy("gender", "category").agg(sum("sales_count").alias("gender_sales"), avg("rating").alias("gender_rating")).withColumn("preference_index", col("gender_sales") / sum("gender_sales").over(Window.partitionBy("gender")))
    result_data = {"category_preference": category_preference.toPandas().to_dict("records"), "age_preference": age_preference.toPandas().to_dict("records"), "reading_time": reading_time_analysis.toPandas().to_dict("records"), "seasonal_trends": seasonal_preference.toPandas().to_dict("records"), "price_sensitivity": price_sensitivity.toPandas().to_dict("records"), "repeat_customers": repeat_purchase.toPandas().to_dict("records"), "gender_analysis": gender_preference.toPandas().to_dict("records")}
    return JsonResponse({"status": "success", "data": result_data})

@csrf_exempt
def price_marketing_analysis(request):
    sales_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/bookstore").option("dbtable", "book_sales").option("user", "root").option("password", "password").load()
    promotion_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/bookstore").option("dbtable", "promotions").option("user", "root").option("password", "password").load()
    price_elasticity = sales_df.withColumn("price_bucket", floor(col("price") / 10) * 10).groupBy("price_bucket", "category").agg(sum("sales_count").alias("total_sales"), avg("price").alias("avg_price"), count("book_id").alias("book_count")).withColumn("sales_density", col("total_sales") / col("book_count"))
    discount_effectiveness = sales_df.join(promotion_df, "book_id", "left").withColumn("discount_rate", when(col("promotion_type").isNotNull(), col("discount_percentage")).otherwise(0)).groupBy("discount_rate", "category").agg(sum("sales_count").alias("discounted_sales"), avg("profit_margin").alias("avg_margin"))
    competitor_analysis = sales_df.withColumn("market_position", when(col("price") < col("market_avg_price") * 0.9, "low_price").when(col("price") > col("market_avg_price") * 1.1, "premium").otherwise("competitive")).groupBy("market_position", "category").agg(sum("sales_count").alias("position_sales"), avg("market_share").alias("avg_share"))
    seasonal_pricing = sales_df.withColumn("month", month("sale_date")).groupBy("month", "category").agg(avg("price").alias("avg_monthly_price"), sum("sales_count").alias("monthly_sales")).withColumn("price_trend", lag("avg_monthly_price").over(Window.partitionBy("category").orderBy("month")))
    promotion_roi = promotion_df.join(sales_df, "book_id").withColumn("promotion_cost", col("discount_percentage") * col("price") * col("sales_count") / 100).withColumn("additional_revenue", col("sales_count") * col("price") - col("baseline_sales") * col("price")).withColumn("roi", (col("additional_revenue") - col("promotion_cost")) / col("promotion_cost"))
    bundling_analysis = sales_df.filter(col("is_bundle") == True).groupBy("bundle_type", "category").agg(sum("sales_count").alias("bundle_sales"), avg("bundle_discount").alias("avg_bundle_discount"), sum("total_revenue").alias("bundle_revenue"))
    dynamic_pricing = sales_df.withColumn("demand_level", when(col("sales_velocity") > 10, "high").when(col("sales_velocity") > 5, "medium").otherwise("low")).groupBy("demand_level", "price_range").agg(avg("conversion_rate").alias("avg_conversion"), sum("revenue").alias("total_revenue"))
    price_optimization = sales_df.groupBy("category").agg(avg("price").alias("current_avg_price"), sum("sales_count").alias("current_sales")).withColumn("optimal_price", col("current_avg_price") * 1.05).withColumn("projected_sales", col("current_sales") * 0.95)
    result_data = {"price_elasticity": price_elasticity.toPandas().to_dict("records"), "discount_analysis": discount_effectiveness.toPandas().to_dict("records"), "competitor_position": competitor_analysis.toPandas().to_dict("records"), "seasonal_pricing": seasonal_pricing.toPandas().to_dict("records"), "promotion_roi": promotion_roi.toPandas().to_dict("records"), "bundling_performance": bundling_analysis.toPandas().to_dict("records"), "dynamic_pricing": dynamic_pricing.toPandas().to_dict("records"), "price_optimization": price_optimization.toPandas().to_dict("records")}
    return JsonResponse({"status": "success", "data": result_data})

@csrf_exempt
def market_trend_analysis(request):
    sales_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/bookstore").option("dbtable", "book_sales").option("user", "root").option("password", "password").load()
    inventory_df = spark.read.format("jdbc").option("url", "jdbc:mysql://localhost:3306/bookstore").option("dbtable", "inventory").option("user", "root").option("password", "password").load()
    daily_trends = sales_df.groupBy("sale_date", "category").agg(sum("sales_count").alias("daily_sales"), sum("revenue").alias("daily_revenue")).withColumn("growth_rate", (col("daily_sales") - lag("daily_sales").over(Window.partitionBy("category").orderBy("sale_date"))) / lag("daily_sales").over(Window.partitionBy("category").orderBy("sale_date")) * 100)
    category_momentum = sales_df.withColumn("week", weekofyear("sale_date")).groupBy("week", "category").agg(sum("sales_count").alias("weekly_sales")).withColumn("momentum_score", col("weekly_sales") / avg("weekly_sales").over(Window.partitionBy("category").orderBy("week").rowsBetween(-3, -1)))
    emerging_trends = sales_df.filter(col("sale_date") >= date_sub(current_date(), 30)).groupBy("subcategory").agg(sum("sales_count").alias("recent_sales"), avg("rating").alias("recent_rating")).join(sales_df.filter(col("sale_date") < date_sub(current_date(), 30)).groupBy("subcategory").agg(avg("sales_count").alias("historical_avg")), "subcategory").withColumn("trend_strength", col("recent_sales") / col("historical_avg"))
    market_saturation = sales_df.join(inventory_df, "book_id").groupBy("category").agg(sum("sales_count").alias("total_demand"), sum("stock_quantity").alias("total_supply")).withColumn("saturation_index", col("total_demand") / col("total_supply"))
    forecasting_data = sales_df.withColumn("day_of_week", dayofweek("sale_date")).withColumn("is_weekend", when(col("day_of_week").isin([1, 7]), 1).otherwise(0)).groupBy("category", "is_weekend").agg(avg("sales_count").alias("avg_sales_pattern"))
    cross_category_correlation = sales_df.groupBy("sale_date").pivot("category").agg(sum("sales_count")).na.fill(0)
    bestseller_lifecycle = sales_df.withColumn("days_since_launch", datediff("sale_date", "publish_date")).withColumn("lifecycle_stage", when(col("days_since_launch") < 30, "launch").when(col("days_since_launch") < 90, "growth").when(col("days_since_launch") < 180, "maturity").otherwise("decline")).groupBy("lifecycle_stage", "category").agg(avg("sales_count").alias("avg_stage_sales"))
    market_share_evolution = sales_df.withColumn("quarter", quarter("sale_date")).withColumn("year", year("sale_date")).groupBy("year", "quarter", "publisher").agg(sum("sales_count").alias("publisher_sales")).withColumn("market_share", col("publisher_sales") / sum("publisher_sales").over(Window.partitionBy("year", "quarter")) * 100)
    seasonal_forecasting = sales_df.withColumn("month", month("sale_date")).withColumn("year", year("sale_date")).groupBy("year", "month", "category").agg(sum("sales_count").alias("monthly_sales")).withColumn("seasonal_index", col("monthly_sales") / avg("monthly_sales").over(Window.partitionBy("category", "year")))
    result_data = {"daily_trends": daily_trends.toPandas().to_dict("records"), "category_momentum": category_momentum.toPandas().to_dict("records"), "emerging_trends": emerging_trends.toPandas().to_dict("records"), "market_saturation": market_saturation.toPandas().to_dict("records"), "sales_patterns": forecasting_data.toPandas().to_dict("records"), "bestseller_lifecycle": bestseller_lifecycle.toPandas().to_dict("records"), "market_share": market_share_evolution.toPandas().to_dict("records"), "seasonal_forecast": seasonal_forecasting.toPandas().to_dict("records")}
    return JsonResponse({"status": "success", "data": result_data})



六.系统文档展示

在这里插入图片描述

结束

💕💕文末获取源码联系 计算机程序员小杨