🍊作者:计算机毕设匠心工作室
🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。
擅长:按照需求定制化开发项目、 源码、对代码进行完整讲解、文档撰写、ppt制作。
🍊心愿:点赞 👍 收藏 ⭐评论 📝
👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~
🍅 ↓↓文末获取源码联系↓↓🍅
基于大数据的新疆特产销售数据可视化分析系统-功能介绍
本系统是一套基于Python大数据技术栈开发的新疆特产销售数据可视化分析平台,采用Hadoop+Spark分布式计算框架处理海量电商销售数据,实现14种维度的深度数据挖掘与可视化展示。系统以Django作为后端服务框架,前端采用Vue+ElementUI+Echarts技术构建交互界面,通过HDFS分布式文件系统存储原始CSV数据集,利用Spark SQL和Pandas进行数据清洗与预处理,对新疆特产商品的标题、价格、销量、发货地、店铺等12个核心字段进行ETL转换。系统实现了热销品类TOP10统计、金牌店铺排行、价格区间销量分布、价格与销量关联分析、全国省市发货地贡献度分析、商品标题营销词云生成、包装规格受欢迎度评估、品类性价比计算、交叉热力图展示、店铺产品多样性评估以及销售能力等级划分等功能模块。所有分析结果均通过Echarts图表库以柱状图、折线图、饼图、散点图、热力图、词云图等多种形式进行可视化呈现,并将处理后的结构化数据存储至MySQL数据库供前端调用,为电商运营决策、市场趋势研判、供应链优化提供数据支撑。
基于大数据的新疆特产销售数据可视化分析系统-选题背景意义
选题背景 近年来新疆特色农产品在电商平台的销售规模持续扩大,红枣、核桃、葡萄干、牛羊肉制品等特产通过网络销售渠道进入全国市场,形成了规模可观的线上交易生态。然而现有的电商数据分析多依赖传统数据库查询和单机处理方式,面对包含数万条商品记录、涉及标题文本、价格数值、销量文本、地理信息等多类型字段的复杂数据集时,处理效率和分析深度都存在明显瓶颈。特别是在进行跨品类、跨地域、跨价格区间的关联分析时,传统SQL查询往往需要编写复杂的嵌套语句,执行速度缓慢且难以扩展。与此同时,商家和平台运营者迫切需要从海量交易数据中提炼出品类趋势、定价策略、区域分布、店铺竞争力等关键商业洞察,但市面上针对新疆特产这一垂直领域的专业分析工具较为匮乏,大多只能依靠人工整理Excel表格或使用通用BI工具进行浅层统计。 选题意义 本课题将大数据技术应用于新疆特产电商数据分析场景,能够验证Hadoop+Spark分布式计算框架在实际业务中的处理能力。通过构建基于HDFS的数据存储层和Spark SQL的计算层,可以高效完成对包含文本清洗(销量格式转换、标题分词)、地理信息解析(省市字段拆分)、数值统计(销量聚合、价格分组)等复杂ETL流程的数据预处理工作,相比传统方案能显著缩短数据准备时间。从实用角度看,系统输出的14种分析维度能为新疆特产商家提供选品参考、定价依据和营销策略建议,比如通过热销品类榜单发现市场需求热点,根据价格区间销量分布确定合理定价范围,依据发货地分析结果优化仓储布局。对于平台运营方而言,店铺排行、销售等级划分等功能可以辅助识别优质商家和潜力店铺,词云分析能揭示消费者关注的产品卖点。从技术实践意义来说,本项目整合了大数据存储(HDFS)、分布式计算(Spark)、Web开发(Django)、前端可视化(Echarts)等多个技术栈,形成完整的数据工程解决方案,对于学习大数据应用开发具有一定的参考价值,虽然作为毕业设计在数据规模和算法复杂度上相对有限,但基本流程和架构设计思路可以迁移到其他电商数据分析或可视化项目中。
基于大数据的新疆特产销售数据可视化分析系统-技术选型
大数据框架: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
基于大数据的新疆特产销售数据可视化分析系统-视频展示
基于大数据的新疆特产销售数据可视化分析系统-图片展示
基于大数据的新疆特产销售数据可视化分析系统-代码展示
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, regexp_replace, when, split, sum as spark_sum, desc, count, avg, concat_ws, udf
from pyspark.sql.types import FloatType, IntegerType
import pandas as pd
from collections import Counter
import jieba
import re
spark = SparkSession.builder.appName("XinjiangSpecialtyAnalysis").config("spark.sql.shuffle.partitions", "10").getOrCreate()
df = spark.read.csv("hdfs://localhost:9000/data/4r5z8j23_xinjiangtechan.csv", header=True, inferSchema=True)
def clean_sales_text(sales_text):
if sales_text is None or sales_text == "\\N":
return 0
match = re.search(r'(\d+\.?\d*)万?\+?人付款', sales_text)
if match:
num = float(match.group(1))
if '万' in sales_text:
return int(num * 10000)
return int(num)
return 0
clean_sales_udf = udf(clean_sales_text, IntegerType())
df_cleaned = df.withColumn("sales_num", clean_sales_udf(col("salestext")))
df_cleaned = df_cleaned.withColumn("price_float", regexp_replace(col("jiage"), "[^0-9.]", "").cast(FloatType()))
df_cleaned = df_cleaned.withColumn("province", split(col("procity"), " ").getItem(0))
df_cleaned = df_cleaned.withColumn("city", split(col("procity"), " ").getItem(1))
df_cleaned = df_cleaned.fillna({"shipingy": "未知", "baozhuanggg": "未知"})
def extract_category(title):
keywords = ['红枣', '核桃', '葡萄干', '巴旦木', '牛肉干', '羊肉', '馕', '奶制品', '蜂蜜', '枸杞', '杏干', '无花果', '薰衣草', '哈密瓜', '石榴']
if title is None:
return "其他"
for kw in keywords:
if kw in title:
return kw
return "其他"
extract_category_udf = udf(extract_category)
df_cleaned = df_cleaned.withColumn("category", extract_category_udf(col("title")))
df_cleaned.write.mode("overwrite").parquet("hdfs://localhost:9000/output/cleaned_data")
df_analysis = spark.read.parquet("hdfs://localhost:9000/output/cleaned_data")
category_sales = df_analysis.groupBy("category").agg(spark_sum("sales_num").alias("total_sales")).orderBy(desc("total_sales")).limit(10)
category_sales_pd = category_sales.toPandas()
category_sales_pd.to_csv("category_top10_analysis.csv", index=False, encoding='utf-8-sig')
shop_sales = df_analysis.groupBy("shopname").agg(spark_sum("sales_num").alias("total_sales")).orderBy(desc("total_sales")).limit(10)
shop_sales_pd = shop_sales.toPandas()
shop_sales_pd.to_csv("shop_top10_analysis.csv", index=False, encoding='utf-8-sig')
df_price_range = df_analysis.withColumn("price_range",
when(col("price_float") < 50, "0-50元")
.when((col("price_float") >= 50) & (col("price_float") < 100), "50-100元")
.when((col("price_float") >= 100) & (col("price_float") < 200), "100-200元")
.otherwise("200元以上"))
price_range_sales = df_price_range.groupBy("price_range").agg(spark_sum("sales_num").alias("total_sales")).orderBy("price_range")
price_range_sales_pd = price_range_sales.toPandas()
price_range_sales_pd.to_csv("price_range_distribution_analysis.csv", index=False, encoding='utf-8-sig')
price_sales_corr = df_analysis.select("price_float", "sales_num").filter((col("price_float").isNotNull()) & (col("sales_num") > 0))
price_sales_corr_pd = price_sales_corr.toPandas()
price_sales_corr_pd.to_csv("price_sales_correlation_analysis.csv", index=False, encoding='utf-8-sig')
province_sales = df_analysis.groupBy("province").agg(spark_sum("sales_num").alias("total_sales")).orderBy(desc("total_sales"))
province_sales_pd = province_sales.toPandas()
province_sales_pd.to_csv("province_sales_contribution_analysis.csv", index=False, encoding='utf-8-sig')
xinjiang_city_sales = df_analysis.filter(col("province") == "新疆").groupBy("city").agg(spark_sum("sales_num").alias("total_sales")).orderBy(desc("total_sales"))
xinjiang_city_sales_pd = xinjiang_city_sales.toPandas()
xinjiang_city_sales_pd.to_csv("xinjiang_city_sales_analysis.csv", index=False, encoding='utf-8-sig')
province_avg_price = df_analysis.groupBy("province").agg(avg("price_float").alias("avg_price")).orderBy(desc("avg_price"))
province_avg_price_pd = province_avg_price.toPandas()
province_avg_price_pd.to_csv("province_avg_price_analysis.csv", index=False, encoding='utf-8-sig')
category_price_dist = df_analysis.groupBy("category").agg(
avg("price_float").alias("avg_price"),
spark_sum("price_float").alias("max_price"),
count("price_float").alias("min_price")
).orderBy(desc("avg_price"))
category_price_dist_pd = category_price_dist.toPandas()
category_price_dist_pd.to_csv("category_price_distribution_analysis.csv", index=False, encoding='utf-8-sig')
titles_list = df_analysis.select("title").rdd.flatMap(lambda x: x).collect()
all_words = []
for title in titles_list:
if title:
words = jieba.lcut(title)
all_words.extend([w for w in words if len(w) > 1])
word_counts = Counter(all_words)
word_freq_df = pd.DataFrame(word_counts.most_common(100), columns=['word', 'frequency'])
word_freq_df.to_csv("title_wordcloud_analysis.csv", index=False, encoding='utf-8-sig')
package_sales = df_analysis.filter(col("baozhuanggg") != "未知").groupBy("baozhuanggg").agg(spark_sum("sales_num").alias("total_sales")).orderBy(desc("total_sales"))
package_sales_pd = package_sales.toPandas()
package_sales_pd.to_csv("package_popularity_analysis.csv", index=False, encoding='utf-8-sig')
category_performance = df_analysis.groupBy("category").agg(
avg("sales_num").alias("avg_sales"),
avg("price_float").alias("avg_price")
).withColumn("cost_performance", col("avg_sales") / col("avg_price")).orderBy(desc("cost_performance"))
category_performance_pd = category_performance.toPandas()
category_performance_pd.to_csv("category_cost_performance_analysis.csv", index=False, encoding='utf-8-sig')
heatmap_data = df_price_range.groupBy("category", "price_range").agg(spark_sum("sales_num").alias("total_sales"))
heatmap_pivot = heatmap_data.toPandas().pivot(index='category', columns='price_range', values='total_sales').fillna(0)
heatmap_pivot.to_csv("category_price_heatmap_analysis.csv", encoding='utf-8-sig')
shop_diversity = df_analysis.groupBy("shopname").agg(count("category").alias("category_count")).orderBy(desc("category_count"))
shop_diversity_pd = shop_diversity.toPandas()
shop_diversity_pd.to_csv("shop_diversity_analysis.csv", index=False, encoding='utf-8-sig')
shop_total_sales = df_analysis.groupBy("shopname").agg(spark_sum("sales_num").alias("total_sales"))
shop_level = shop_total_sales.withColumn("shop_level",
when(col("total_sales") >= 100000, "头部店铺")
.when((col("total_sales") >= 10000) & (col("total_sales") < 100000), "腰部店铺")
.when((col("total_sales") >= 1000) & (col("total_sales") < 10000), "潜力店铺")
.otherwise("新手店铺"))
shop_level_stats = shop_level.groupBy("shop_level").agg(count("shopname").alias("shop_count"), spark_sum("total_sales").alias("level_total_sales")).orderBy(desc("level_total_sales"))
shop_level_stats_pd = shop_level_stats.toPandas()
shop_level_stats_pd.to_csv("shop_level_classification_analysis.csv", index=False, encoding='utf-8-sig')
spark.stop()
基于大数据的新疆特产销售数据可视化分析系统-结语
👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~
🍅 主页获取源码联系🍅