一、个人简介
💖💖作者:计算机编程果茶熊 💙💙个人简介:曾长期从事计算机专业培训教学,担任过编程老师,同时本人也热爱上课教学,擅长Java、微信小程序、Python、Golang、安卓Android等多个IT方向。会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 计算机毕业设计选题 💕💕文末获取源码联系计算机编程果茶熊
二、系统介绍
大数据框架:Hadoop+Spark(Hive需要定制修改) 开发语言:Java+Python(两个版本都支持) 数据库:MySQL 后端框架:SpringBoot(Spring+SpringMVC+Mybatis)+Django(两个版本都支持) 前端:Vue+Echarts+HTML+CSS+JavaScript+jQuery
《上海二手房数据可视化分析系统》是一个集数据处理、分析与可视化于一体的综合性平台,旨在为关注上海房地产市场的用户提供直观、多维度的数据洞察。本系统在技术架构上,后端采用稳健的Django框架,负责处理业务逻辑与API服务;前端则基于Vue全家桶,并结合ElementUI和Echarts图表库,构建了现代化、响应式的用户交互界面与数据可视化大屏。系统的核心数据处理能力由大数据技术栈驱动,我们利用HDFS作为分布式文件系统,存储海量的二手房源原始数据,并通过引入Spark计算框架,特别是其内置的Spark SQL模块,对这些TB级数据进行高效的分布式查询与聚合分析,充分发挥了其内存计算的性能优势。在分析过程中,我们还结合了Python生态中的Pandas与NumPy库,对Spark处理后的结果集进行精细化的数据清洗、结构转换和科学计算,以满足复杂分析场景的需求。同时,系统采用MySQL数据库存储用户信息、权限配置、房源基础信息索引等结构化数据,确保了系统管理的稳定与高效。整个系统通过前后端分离的模式,实现了从数据采集、存储、批量处理、深度分析到最终可视化呈现的全链路解决方案,用户可以通过系统内置的购房性价比分析、市场价格结构分析、房产属性特征分析及区域热点分析等功能模块,轻松洞察上海二手房市场的动态与趋势,为决策提供坚实的数据支持。
三、视频解说
四、部分功能展示
五、部分代码展示
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, round as spark_round, avg, count
from django.http import JsonResponse
import pandas as pd
# ① 初始化SparkSession,这是与大数据框架交互的入口
# 在实际的Django项目中,这个SparkSession实例通常是全局初始化一次,而不是在每个请求中都创建
spark = SparkSession.builder \
.appName("ShanghaiHousingAnalysis") \
.master("local[*]") # 本地测试模式,生产环境会连接到YARN或Spark Master
.config("spark.sql.warehouse.dir", "/user/hive/warehouse") \
.getOrCreate()
# 假设数据已存储在HDFS中
HDFS_DATA_PATH = "hdfs://namenode:9000/shanghai_housing/clean_data.parquet"
df = spark.read.parquet(HDFS_DATA_PATH)
df.createOrReplaceTempView("housing")
def analyze_cost_effectiveness(request):
"""
核心功能一:购房性价比分析
业务逻辑:计算一个综合性价比得分。这里我们定义一个简单的模型:
得分 = (卧室数 + 客厅数) / (每平方米单价)。
这个得分越高,意味着在同等单价下能获得更多的居住空间(房间数)。
然后查询出全市性价比最高的Top 50房源。
"""
try:
# 使用Spark SQL执行复杂的分析查询
# total_price单位为万,area单位为平方米
query = """
SELECT
district,
address,
area,
total_price,
bedrooms,
living_rooms,
ROUND((bedrooms + living_rooms) / (total_price * 10000 / area), 4) AS cost_score
FROM
housing
WHERE
area > 0 AND total_price > 0 AND bedrooms > 0
ORDER BY
cost_score DESC
LIMIT 50
"""
results_df = spark.sql(query)
# 将Spark DataFrame转换为Pandas DataFrame,方便后续处理和序列化
pandas_df = results_df.toPandas()
# 将结果转换为JSON格式,返回给前端
response_data = pandas_df.to_dict(orient='records')
return JsonResponse({'code': 200, 'data': response_data, 'message': '性价比数据分析成功'})
except Exception as e:
return JsonResponse({'code': 500, 'message': f'服务器处理异常: {str(e)}'})
def analyze_price_structure(request):
"""
核心功能二:市场价格结构分析
业务逻辑:从两个维度分析市场价格结构。
1. 各行政区的平均单价:计算每个区的房屋平均每平方米的价格,用于展示区域间的价格差异。
2. 全市总价分布:将房屋按总价划分为不同的区间(如200万以下, 200-400万等),
统计每个区间的房源数量,用于展示市场主流的购房总价范围。
"""
try:
# 1. 计算各区平均单价
avg_price_query = """
SELECT
district,
ROUND(AVG(total_price * 10000 / area), 2) AS avg_price_per_sqm
FROM
housing
WHERE
area > 0 AND total_price > 0
GROUP BY
district
ORDER BY
avg_price_per_sqm DESC
"""
avg_price_df = spark.sql(avg_price_query).toPandas()
# 2. 计算全市总价分布
price_distribution_query = """
SELECT
CASE
WHEN total_price <= 200 THEN '200万以下'
WHEN total_price > 200 AND total_price <= 400 THEN '200-400万'
WHEN total_price > 400 AND total_price <= 600 THEN '400-600万'
WHEN total_price > 600 AND total_price <= 800 THEN '600-800万'
WHEN total_price > 800 AND total_price <= 1000 THEN '800-1000万'
ELSE '1000万以上'
END AS price_range,
COUNT(*) AS house_count
FROM
housing
GROUP BY
price_range
ORDER BY
MIN(total_price)
"""
price_dist_df = spark.sql(price_distribution_query).toPandas()
response_data = {
'avg_price_by_district': avg_price_df.to_dict(orient='records'),
'total_price_distribution': price_dist_df.to_dict(orient='records')
}
return JsonResponse({'code': 200, 'data': response_data, 'message': '市场价格结构分析成功'})
except Exception as e:
return JsonResponse({'code': 500, 'message': f'服务器处理异常: {str(e)}'})
def analyze_regional_hotspots(request):
"""
核心功能三:区域热点分析
业务逻辑:分析不同区域的房源供给热度。
1. 统计每个行政区的房源数量,看哪个区是二手房供应大区。
2. 进一步下钻,在前端选择一个区后(比如'浦东'),统计该区内各个板块(sub_district)的房源数量,
找出该区内的热门交易板块。
"""
try:
# 1. 统计各行政区的房源总数
district_hotspot_query = """
SELECT
district,
COUNT(*) AS house_count
FROM
housing
GROUP BY
district
ORDER BY
house_count DESC
"""
district_hotspot_df = spark.sql(district_hotspot_query).toPandas()
# 2. 假设前端通过GET参数传递了要查询的区,例如 ?district=浦东
target_district = request.GET.get('district', '浦东') # 默认为浦东
# 使用带参数的查询来防止SQL注入(虽然这里是内部拼接,但好习惯很重要)
sub_district_hotspot_df = df.filter(col("district") == target_district) \
.groupBy("sub_district") \
.agg(count("*").alias("house_count")) \
.orderBy(col("house_count").desc()) \
.limit(20) \
.toPandas()
response_data = {
'district_hotspots': district_hotspot_df.to_dict(orient='records'),
'sub_district_hotspots': {
'district': target_district,
'data': sub_district_hotspot_df.to_dict(orient='records')
}
}
return JsonResponse({'code': 200, 'data': response_data, 'message': '区域热点分析成功'})
except Exception as e:
return JsonResponse({'code': 500, 'message': f'服务器处理异常: {str(e)}'})
六、部分文档展示
七、END
💕💕文末获取源码联系计算机编程果茶熊