前言
💖💖作者:计算机程序员小杨 💙💙个人简介:我是一名计算机相关专业的从业者,擅长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
二.系统内容简介
本《天猫订单交易数据可视化分析系统》是一个集数据管理、分布式处理、多维度分析与动态可视化于一体的综合性平台,旨在深度挖掘天猫订单数据背后隐藏的商业价值。系统采用主流的前后端分离架构进行开发,后端核心基于Python语言和高效稳健的Django框架,负责处理业务逻辑与数据接口;前端则运用Vue.js框架,并结合ElementUI组件库与Echarts图表库,为用户打造了交互友好且数据呈现直观的操作界面。在关键的数据处理层,系统充分利用了Hadoop与Spark大数据生态技术,通过HDFS实现海量订单数据的分布式存储,并借助Spark强大的内存计算能力和Spark SQL引擎,对数据进行高效的ETL(抽取、转换、加载)、聚合与统计分析,同时结合Pandas、NumPy等库进行灵活的数据预处理与科学计算。系统不仅提供了用户管理、订单数据增删改查等基础功能,更构建了四大核心分析模块:基于RFM模型的客户价值分析、展现地域销售差异的地理分布分析、追踪业绩表现的销售指标分析以及洞察消费模式的用户行为分析。所有分析结果最终都汇集于可视化大屏,以图表联动的形式,将复杂的数据转化为清晰易懂的商业洞察,为运营决策提供数据支持。
三.系统功能演示
四.系统界面展示
五.系统源码展示
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, count, sum as _sum, datediff, current_date, to_date, date_format
from django.http import JsonResponse
import json
# 假设这是在Django的views.py文件中
# 初始化SparkSession,这是与大数据框架交互的入口
# 在实际生产环境中,master地址应配置为Spark集群的地址
spark = SparkSession.builder \
.appName("TmallDataAnalysis") \
.master("local[*]") \
.getOrCreate()
# 假设HDFS上的原始数据路径
HDFS_DATA_PATH = "hdfs://namenode:9000/tmall/orders.csv"
def customer_value_analysis(request):
"""
核心功能一:客户价值分析 (RFM模型)
业务处理:
1. 从HDFS读取订单数据。
2. 将订单日期字符串转为日期类型,便于计算。
3. 以当前日期为基准,计算每个用户的最近一次消费时间(Recency)。
4. 统计每个用户的消费频率(Frequency)。
5. 计算每个用户的总消费金额(Monetary)。
6. 将R, F, M三个指标聚合到每个用户上。
7. 这里为了简化,直接返回原始R,F,M值,前端可根据阈值进行打分和分类。
8. 将Spark DataFrame结果转为Pandas再转为JSON格式返回给前端。
"""
df = spark.read.csv(HDFS_DATA_PATH, header=True, inferSchema=True)
# 转换日期格式,并处理可能的数据类型问题
df_with_date = df.withColumn("order_date", to_date(col("create_time")))
# 计算Recency: 最近一次下单距今天数
recency_df = df_with_date.groupBy("user_id").agg(
datediff(current_date(), to_date(col("create_time"), "yyyy-MM-dd HH:mm:ss")).alias("recency")
)
# 计算Frequency: 购买次数
frequency_df = df.groupBy("user_id").agg(count("order_id").alias("frequency"))
# 计算Monetary: 消费总金额
monetary_df = df.groupBy("user_id").agg(_sum("actual_payment").alias("monetary"))
# 将三个指标连接(Join)在一起
rfm_df = recency_df.join(frequency_df, "user_id").join(monetary_df, "user_id")
# 为了性能考虑,可以抽样或限制返回数量
result_data = rfm_df.limit(1000).toPandas().to_dict('records')
return JsonResponse({'code': 200, 'data': result_data, 'message': 'RFM分析成功'})
def geographical_distribution_analysis(request):
"""
核心功能二:地理分布分析
业务处理:
1. 从HDFS读取订单数据。
2. 按省份(buyer_province)进行分组。
3. 聚合计算每个省份的订单总量(作为销量)和总销售额。
4. 对结果按销售额降序排序。
5. 选取Top N(例如Top 10)的省份数据。
6. 格式化为Echarts地图或柱状图所需的格式,例如:[{name: '浙江', value: 120000}, ...]。
7. 返回JSON数据给前端进行渲染。
"""
df = spark.read.csv(HDFS_DATA_PATH, header=True, inferSchema=True)
# 使用Spark SQL进行分组聚合
df.createOrReplaceTempView("orders")
query = """
SELECT
buyer_province,
COUNT(order_id) as order_count,
SUM(actual_payment) as total_sales
FROM orders
WHERE buyer_province IS NOT NULL
GROUP BY buyer_province
ORDER BY total_sales DESC
LIMIT 15
"""
geo_df = spark.sql(query)
# 转换为前端Echarts地图所需格式
result_list = geo_df.rdd.map(lambda row: {"name": row['buyer_province'], "value": row['total_sales']}).collect()
return JsonResponse({'code': 200, 'data': result_list, 'message': '地理分布分析成功'})
def sales_indicator_analysis(request):
"""
核心功能三:销售指标分析 (按月销售趋势)
业务处理:
1. 从HDFS读取订单数据。
2. 从订单创建时间(create_time)中提取年月信息,创建一个新的'year_month'列。
3. 按'year_month'进行分组。
4. 聚合计算每个月的总销售额和总订单数。
5. 按月份升序排序,以保证时间序列的正确性。
6. 格式化数据,为Echarts的折线图准备两组数据:X轴的时间标签和Y轴的数值。
7. 返回包含月份列表和对应销售额/订单数列表的JSON数据。
"""
df = spark.read.csv(HDFS_DATA_PATH, header=True, inferSchema=True)
# 提取年月作为新的列用于分组
df_with_month = df.withColumn("year_month", date_format(to_date(col("create_time")), "yyyy-MM"))
# 分组聚合
monthly_sales_df = df_with_month.groupBy("year_month") \
.agg(
_sum("actual_payment").alias("monthly_sales"),
count("order_id").alias("monthly_orders")
) \
.orderBy("year_month")
# 收集结果并整理成前端需要的格式
pandas_df = monthly_sales_df.toPandas()
# 确保数据类型正确,避免JSON序列化问题
pandas_df['monthly_sales'] = pandas_df['monthly_sales'].astype(float)
pandas_df['monthly_orders'] = pandas_df['monthly_orders'].astype(int)
result = {
'months': pandas_df['year_month'].tolist(),
'sales': pandas_df['monthly_sales'].tolist(),
'orders': pandas_df['monthly_orders'].tolist()
}
return JsonResponse({'code': 200, 'data': result, 'message': '销售趋势分析成功'})
六.系统文档展示
结束
💕💕文末获取源码联系 计算机程序员小杨