💖💖作者:计算机毕业设计江挽 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学习实战项目
基于大数据的新能源汽车保有量可视化分析系统介绍
这个基于Python+Spark的新能源汽车保有量可视化分析系统的核心思路是,我们假设收集到了全国各地海量的新能源汽车上牌数据、销售记录等等,这些数据量可能大到用一台普通电脑上的Excel或者常规数据库跑起来非常慢甚至会卡死。这时候,我们就需要引入像Spark这样的分布式计算框架。整个系统的工作流程大致是这样的:首先,系统后端通过Spark强大的并行处理能力,对这些原始、杂乱的数据进行快速的清洗(比如去掉无效记录)、转换(比如统一日期格式)和聚合(比如按城市、按品牌、按季度进行汇总统计)。处理完毕后,这些干净、规整的分析结果并不会直接丢给用户,而是存储起来,再由Python开发的Web后端(比如用Flask或Django框架)来调用。Web后端会根据用户的请求,从处理好的结果中提取特定的数据,比如“近五年全国主要城市新能源车数量增长趋势”或“不同品牌在一线城市的市场占有率对比”,然后将这些数据转化成前端图表库(如ECharts)能够理解的格式。最终,用户在浏览器上就能看到各种直观的图表、地图和数据面板,可以非常方便地进行交互式探索,比如点击某个省份查看其下属城市的详细数据,或者筛选特定品牌来观察其历年来的发展轨迹。所以说,这个项目的亮点就在于打通了从海量原始数据到最终可视化洞察的全链路,特别是通过引入Spark,来模拟和实践企业级大数据项目的真实处理流程
基于大数据的新能源汽车保有量可视化分析系统演示视频
基于大数据的新能源汽车保有量可视化分析系统演示图片
基于大数据的新能源汽车保有量可视化分析系统代码展示
from pyspark.sql import SparkSession
from pyspark.sql.functions import col, year, lower, when, lag, round
from pyspark.sql.window import Window
def process_nev_data(df):
"""
功能一:对原始新能源汽车数据进行清洗和预处理
业务处理:这是数据分析的第一步,也是最关键的一步。原始数据往往存在缺失、格式不统一、异常值等问题。
这个函数负责将“脏数据”变为“干净数据”,为后续的精确分析打下基础。
它会丢弃关键信息不完整的记录,从日期中提取年份方便按年统计,并将品牌名称统一为小写以避免重复计算(如'Tesla'和'tesla'被视为一个品牌)。
同时,还会过滤掉一些不符合分析范围的数据(例如过早的、不真实的年份),并对列名进行重命名,使其更具可读性。
"""
processed_df = df.na.drop(subset=["city", "brand", "registration_date"])
processed_df = processed_df.withColumn("reg_year", year(col("registration_date")))
processed_df = processed_df.withColumn("brand_standardized", lower(col("brand")))
processed_df = processed_df.withColumnRenamed("vin", "vehicle_id")
processed_df = processed_df.withColumnRenamed("model", "vehicle_model")
processed_df = processed_df.withColumnRenamed("city", "reg_city")
processed_df = processed_df.withColumn("owner_age", col("owner_age").cast("integer"))
processed_df = processed_df.filter(col("reg_year") >= 2010)
processed_df = processed_df.filter(col("owner_age").isNotNull())
processed_df = processed_df.filter(col("owner_age") > 18)
processed_df = processed_df.drop("registration_date", "brand")
processed_df = processed_df.select("vehicle_id", "reg_city", "brand_standardized", "vehicle_model", "reg_year", "owner_age")
processed_df = processed_df.dropDuplicates(["vehicle_id"])
processed_df = processed_df.withColumn("region", when(col("reg_city").isin("北京", "上海", "广州", "深圳"), "一线城市")
.when(col("reg_city").isin("成都", "杭州", "重庆", "武汉"), "新一线城市")
.otherwise("其他城市"))
processed_df.cache() # 将处理后的常用DataFrame缓存到内存中
return processed_df
def calculate_regional_market_share(df, target_year):
"""
功能二:计算指定年份各区域的品牌市场占有率
业务处理:这是核心的分析功能之一。市场占有率是衡量品牌竞争力的关键指标。
这个函数首先会筛选出指定年份的数据。然后,它会进行两次分组聚合操作:
第一次是按“区域”(如一线城市)统计该区域的总车辆数。
第二次是按“区域”和“品牌”进行分组,统计每个品牌在每个区域的车辆数。
接着,通过一个join操作,将两个结果合并在一起。有了每个品牌的区域销量和区域总销量,
就可以计算出市场占有率(品牌区域数 / 区域总数)。最后,为了结果更加清晰,
函数会进行排序和格式化,比如将小数转换为百分比并保留两位小数,最终输出一个清晰的排名。
"""
year_df = df.filter(col("reg_year") == target_year)
total_vehicles_by_region = year_df.groupBy("region").count().withColumnRenamed("count", "total_count")
brand_vehicles_by_region = year_df.groupBy("region", "brand_standardized").count().withColumnRenamed("count", "brand_count")
joined_df = brand_vehicles_by_region.join(total_vehicles_by_region, "region", "inner")
market_share_df = joined_df.withColumn("market_share_raw", (col("brand_count") / col("total_count")))
market_share_df = market_share_df.withColumn("market_share_percent", round(col("market_share_raw") * 100, 2))
final_df = market_share_df.select(
col("region").alias("区域"),
col("brand_standardized").alias("品牌"),
col("brand_count").alias("品牌销量"),
col("total_count").alias("区域总销量"),
col("market_share_percent").alias("市场占有率")
)
window_spec = Window.partitionBy("区域").orderBy(col("市场占有率").desc())
ranked_df = final_df.withColumn("rank", rank().over(window_spec))
result = ranked_df.filter(col("rank") <= 10) # 只看每个区域的前10名
result = result.select("区域", "品牌", "市场占有率", "rank").orderBy("区域", "rank")
# 为了给前端返回JSON,这里通常会执行 .collect(),然后格式化
# json_output = result.toJSON().collect()
return result # 在Spark环境中返回DataFrame
def prepare_yearly_growth_data_for_viz(df):
"""
功能三:为可视化准备年度增长趋势数据
业务处理:前端图表(如ECharts)需要格式化的JSON数据,而不是Spark的DataFrame。
这个函数负责计算核心指标并将其转换为前端友好的格式。
它首先按年份对车辆总数进行聚合统计。然后,利用Spark强大的窗口函数(Window Function),
特别是lag函数,来获取上一年的数据。这样,在同一行里就同时有了当年和上一年的销量数据。
基于这两个数据,就可以轻松计算出同比增长率。计算中需要特别处理第一年(分母可能为0)的情况。
最后,通过 .collect() 将分析结果从Spark集群的分布式内存中收集到驱动程序(Driver)的内存里,
并循环处理,将其重组成前端图表库最喜欢的格式,比如分离的标签数组和数据数组的JSON对象。
"""
yearly_counts = df.groupBy("reg_year").count().orderBy("reg_year")
window_spec = Window.orderBy("reg_year")
yearly_counts_with_prev = yearly_counts.withColumn("prev_year_count", lag("count", 1, 0).over(window_spec))
growth_df = yearly_counts_with_prev.withColumn(
"growth_rate",
when(col("prev_year_count") == 0, 0.0)
.otherwise(round(((col("count") - col("prev_year_count")) / col("prev_year_count")) * 100, 2))
)
final_df = growth_df.select(
col("reg_year").alias("year"),
col("count").alias("total_count"),
col("growth_rate")
)
results_list = final_df.collect() # 将分布式数据收集到本地列表
# 转换为前端ECharts等图表库需要的格式
chart_data = {
"years": [],
"counts": [],
"growth_rates": []
}
for row in results_list:
chart_data["years"].append(row["year"])
chart_data["counts"].append(row["total_count"])
chart_data["growth_rates"].append(row["growth_rate"])
return chart_data
spark = SparkSession.builder.appName("NEV_Analysis_System").master("local[*]").getOrCreate()
# 假设我们有一个名为 'nev_data.csv' 的原始数据文件
# raw_df = spark.read.csv("path/to/nev_data.csv", header=True, inferSchema=True)
# clean_df = process_nev_data(raw_df)
# market_share_2023 = calculate_regional_market_share(clean_df, 2023)
# market_share_2023.show()
# yearly_trend_json = prepare_yearly_growth_data_for_viz(clean_df)
# print(yearly_trend_json)
# spark.stop()
基于大数据的新能源汽车保有量可视化分析系统文档展示
💖💖作者:计算机毕业设计江挽 💙💙个人简介:曾长期从事计算机专业培训教学,本人也热爱上课教学,语言擅长Java、微信小程序、Python、Golang、安卓Android等,开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。平常喜欢分享一些自己开发中遇到的问题的解决办法,也喜欢交流技术,大家有技术代码这一块的问题可以问我! 💛💛想说的话:感谢大家的关注与支持! 💜💜 网站实战项目 安卓/小程序实战项目 大数据实战项目 深度学习实战项目