博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅
1、毕业设计:2025年计算机专业毕业设计选题汇总(建议收藏)✅
1、项目介绍
技术栈:
Python语言、Django框架、MySQL数据库、Echarts可视化
requests爬虫技术、HTML、天气后报网站数据
机器学习—线性回归模型
大数据技术(Hadoop、Hive、Spark)
机器学习—线性回归模型,用于根据空气质量的四个指标(PM2.5、SO₂、NO₂、O₃)预测空气质量指数(AQI)
功能模块:
1、首页-各城市+日期查看AQl均值分析、气体分析 (PM2.5 、PM10、 SO2、 NO2、 CO、 O3)
2、数据列表
3、空气质量年度分析 (各城市AQI月份分析、PM颗粒物分析)
4、AQI月度分析 (月份AQI值分析、AQI为优秀天数分析)
5、气体分析 (SO2 NO2 CO分析)
6、城市分析 (年度月份选择AQI均值各城市分布)
7、词云图 (空气质量词云图分析)
8、AQI预测 (输入特征值 PM值、 SO2、 NO2、 O3 )
9、注册登录
10、spark分析
11、爬虫 (数据采集)
12、后台用户管理
2、项目界面
1 、首页-各城市日期筛选查看AQI、各气体分析
2、空气质量、颗粒物年度分析–年度城市筛选分析
3、AQI月度分析—月份城市筛选
4、城市分析----中国地图各城市分布、按月份筛选
5、气体分析-----SO2 NO2 CO O3
6、数据中心
7、词云图分析
8、AQI预测----输入特征值:PM值 SO2值 NO2值 O3值
9、注册登录
10、Spark大数据分析
11、数据采集
12、后台数据管理
3、项目说明
功能模块介绍
1. 首页 - 各城市日期筛选查看 AQI、各气体分析
- 功能:用户可以通过选择城市和日期,查看该地区在指定日期的空气质量指数(AQI)以及主要气体(PM2.5、PM10、SO₂、NO₂、CO、O₃)的浓度分析。
- 实现方式:
- 后端:使用 Django 框架从 MySQL 数据库中提取对应城市和日期的空气质量数据。
- 前端:通过 HTML 和 ECharts 可视化技术展示 AQI 和各气体浓度的柱状图或折线图。
2. 数据列表
- 功能:以表格形式展示空气质量数据,用户可以查看详细的监测数据,包括日期、城市、AQI、各气体浓度等。
- 实现方式:
- 后端:从数据库中查询数据并传递到前端。
- 前端:使用 HTML 表格展示数据,提供筛选和排序功能。
3. 空气质量年度分析
- 功能:分析各城市在过去一年中每个月的 AQI 变化趋势,以及 PM2.5 和 PM10 的颗粒物分析。
- 实现方式:
- 后端:从数据库中提取年度数据,进行统计分析。
- 前端:使用 ECharts 的折线图或柱状图展示年度 AQI 和颗粒物的变化趋势。
4. AQI 月度分析
- 功能:分析特定月份的 AQI 值变化,以及该月 AQI 达到优秀(AQI < 50)的天数。
- 实现方式:
- 后端:从数据库中提取月度数据,计算 AQI 优秀天数。
- 前端:通过 ECharts 展示月度 AQI 变化和优秀天数的柱状图。
5. 气体分析
- 功能:分析 SO₂、NO₂、CO 和 O₃ 的浓度变化趋势,展示不同气体的分布情况。
- 实现方式:
- 后端:从数据库中提取气体浓度数据。
- 前端:使用 ECharts 的折线图或柱状图展示气体浓度的变化。
6. 城市分析
- 功能:用户可以选择年度和月份,查看不同城市在该时间段内的 AQI 均值分布情况。
- 实现方式:
- 后端:根据用户选择的时间段,从数据库中提取城市 AQI 数据。
- 前端:使用 ECharts 的地图组件展示各城市的 AQI 均值分布。
7. 词云图
- 功能:通过词云图展示空气质量相关的高频词汇,突出显示用户关注的关键词(如“污染”“良好”“超标”等)。
- 实现方式:
- 后端:从用户评论或新闻报道中提取文本数据,进行词频统计。
- 前端:使用 ECharts 的词云图组件展示结果。
8. AQI 预测
- 功能:用户输入 PM2.5、SO₂、NO₂ 和 O₃ 的浓度值,系统利用线性回归模型预测 AQI。
- 实现方式:
- 后端:使用 Python 的机器学习库(如 scikit-learn)训练线性回归模型,接收用户输入的特征值并返回预测结果。
- 前端:提供输入表单,展示预测结果。
9. 注册登录
- 功能:用户可以通过注册账号并登录系统,使用系统提供的各种功能。
- 实现方式:
- 后端:使用 Django 的用户认证系统实现注册和登录功能。
- 前端:提供注册和登录表单,用户输入用户名和密码进行登录。
10. Spark 大数据分析
- 功能:使用 Spark 大数据处理框架对海量空气质量数据进行分析,支持快速数据处理和复杂查询。
- 实现方式:
- 后端:使用 Spark 读取 Hadoop 或 Hive 中存储的大数据,进行分布式计算。
- 前端:展示 Spark 分析的结果,如统计图表或数据报表。
11. 数据采集
- 功能:通过爬虫技术从外部网站(如天气后报网站)采集空气质量数据,并存储到数据库中。
- 实现方式:
- 后端:使用 Python 的
requests
库和爬虫框架(如 Scrapy)采集数据,存储到 MySQL 数据库。 - 前端:提供数据采集状态的展示界面。
- 后端:使用 Python 的
12. 后台数据管理
- 功能:系统管理员可以通过后台管理界面添加、删除、修改用户信息,管理数据采集任务,查看系统日志等。
- 实现方式:
- 后端:使用 Django Admin 或自定义后台管理界面实现数据管理功能。
- 前端:提供后台管理界面,方便管理员操作。
4、核心代码
from pyspark.sql import SparkSession
from pyspark.sql.functions import monotonically_increasing_id
from pyspark.sql.functions import count,mean,col,sum,when,year,month,max,min,avg
from pyspark.sql import functions as F
from pyspark.sql.types import StructType,StructField,IntegerType,StringType,FloatType
if __name__ == '__main__':
#构建
spark = SparkSession.builder.appName("sparkSQL").master("local[*]").\
config("spark.sql.shuffle.partitions", 2). \
config("spark.sql.warehouse.dir", "hdfs://node1:8020/user/hive/warehouse"). \
config("hive.metastore.uris", "thrift://node1:9083"). \
enableHiveSupport().\
getOrCreate()
sc = spark.sparkContext
#读取
airdata = spark.read.table("airdata")
#需求1 城市平均AQI
print("-------------------需求1 城市平均AQI--------------------")
result1 = airdata.groupby("city")\
.agg(mean("AQI").alias("avg_AQI"))\
.orderBy("avg_AQI",ascending=False)
#df
df = result1.toPandas()
# print(df)
# sql
result1.write.mode("overwrite"). \
format("jdbc"). \
option("url", "jdbc:mysql://node1:3306/bigdata?useSSL=false&useUnicode=true&charset=utf8"). \
option("dbtable", "avgCityAqi"). \
option("user", "root"). \
option("password", "root"). \
option("encoding", "utf-8"). \
save()
result1.write.mode("overwrite").saveAsTable("avgCityAqi", "parquet")
spark.sql("select * from avgCityAqi").show()
#需求2 各气体分析
print("-------------------需求2 各气体分析--------------------")
result2 = airdata.groupby("city") \
.agg(
mean("PM").alias("avg_PM"),
mean("PM10").alias("avg_PM10"),
mean("So2").alias("avg_So2"),
mean("No2").alias("avg_No2"),
mean("Co").alias("avg_Co"),
mean("O3").alias("avg_O3"),
)
# sql
result2.write.mode("overwrite"). \
format("jdbc"). \
option("url", "jdbc:mysql://node1:3306/bigdata?useSSL=false&useUnicode=true&charset=utf8"). \
option("dbtable", "avgCitySix"). \
option("user", "root"). \
option("password", "root"). \
option("encoding", "utf-8"). \
save()
result2.write.mode("overwrite").saveAsTable("avgCitySix", "parquet")
spark.sql("select * from avgCitySix").show()
#需求三 年度空气质量分析
print("-------------------需求3 年度空气质量分析--------------------")
airdata = airdata.withColumn("date",airdata["date"].cast("date"))
result3 = airdata.groupby("city",year("date").alias("year"),month("date").alias("month"))\
.agg(
max("AQI").alias("max_AQI"),
min("AQI").alias("min_AQI")
)
result3.write.mode("overwrite"). \
format("jdbc"). \
option("url", "jdbc:mysql://node1:3306/bigdata?useSSL=false&useUnicode=true&charset=utf8"). \
option("dbtable", "maxCityAqi"). \
option("user", "root"). \
option("password", "root"). \
option("encoding", "utf-8"). \
save()
result3.write.mode("overwrite").saveAsTable("maxCityAqi", "parquet")
spark.sql("select * from maxCityAqi").show()
#需求四
print("-------------------需求4 计算每个城市每年每月的 PM 和 PM10 的平均值--------------------")
result4 = airdata.groupby("city", year("date").alias("year"), month("date").alias("month")) \
.agg(
avg("PM").alias("max_PM"),
avg("PM10").alias("min_PM10")
)
result4.write.mode("overwrite"). \
format("jdbc"). \
option("url", "jdbc:mysql://node1:3306/bigdata?useSSL=false&useUnicode=true&charset=utf8"). \
option("dbtable", "avgCityPM"). \
option("user", "root"). \
option("password", "root"). \
option("encoding", "utf-8"). \
save()
result4.write.mode("overwrite").saveAsTable("avgCityPM", "parquet")
spark.sql("select * from avgCityPM").show()
#需求五
print("-------------------需求5 计算每个城市每年每月 AQI 小于 50 的天数。--------------------")
result5 = airdata.groupby("city",year("date").alias("year"),month("date").alias("month"))\
.agg(
count(when(airdata["AQI"] < 50, True)).alias("greatAirCount")
)
result5.write.mode("overwrite"). \
format("jdbc"). \
option("url", "jdbc:mysql://node1:3306/bigdata?useSSL=false&useUnicode=true&charset=utf8"). \
option("dbtable", "greatAir"). \
option("user", "root"). \
option("password", "root"). \
option("encoding", "utf-8"). \
save()
result5.write.mode("overwrite").saveAsTable("greatAir", "parquet")
spark.sql("select * from greatAir").show()
#需求6
print("-------------------需求6 计算每个城市的最大 So2 和 No2 值--------------------")
result6 = airdata.groupby("city")\
.agg(
max("So2").alias("max_So2"),
max("No2").alias("max_No2")
)
result6.write.mode("overwrite"). \
format("jdbc"). \
option("url", "jdbc:mysql://node1:3306/bigdata?useSSL=false&useUnicode=true&charset=utf8"). \
option("dbtable", "maxSN"). \
option("user", "root"). \
option("password", "root"). \
option("encoding", "utf-8"). \
save()
result6.write.mode("overwrite").saveAsTable("maxSN", "parquet")
spark.sql("select * from maxSN").show()
#需求7
print("-------------------需求7 将 Co 值分为不同的区间,并计算每个区间的记录数--------------------")
airdata = airdata.withColumn(
"Co_category",
when((col("Co") >= 0) & (col("Co") < 0.25),'0-0.25')
.when((col("Co") >= 0.25) & (col("Co") < 0.5),'0.25-0.5')
.when((col("Co") >= 0.5)& (col("Co") < 0.75), '0.5-0.75')
.when((col("Co") >= 0.75) & (col("Co") < 1.0), '0.75-1')
.otherwise("1以上")
)
result7 = airdata.groupby("Co_category").agg(count('*').alias('Co_count'))
result7.write.mode("overwrite"). \
format("jdbc"). \
option("url", "jdbc:mysql://node1:3306/bigdata?useSSL=false&useUnicode=true&charset=utf8"). \
option("dbtable", "CoCategory"). \
option("user", "root"). \
option("password", "root"). \
option("encoding", "utf-8"). \
save()
result7.write.mode("overwrite").saveAsTable("CoCategory", "parquet")
spark.sql("select * from CoCategory").show()
#需求8
print("-------------------需求8 O3 值分为不同的区间,并计算每个区间的记录数--------------------")
airdata = airdata.withColumn(
"O3_category",
when((col("O3") >= 0) & (col("O3") < 25), '0-25')
.when((col("O3") >= 0.25) & (col("O3") < 50), '25-50')
.when((col("O3") >= 50) & (col("O3") < 75), '50-75')
.when((col("O3") >= 75) & (col("O3") < 100), '75-100')
.otherwise("100以上")
)
result8 = airdata.groupby("O3_category").agg(count('*').alias('O3_count'))
result8.write.mode("overwrite"). \
format("jdbc"). \
option("url", "jdbc:mysql://node1:3306/bigdata?useSSL=false&useUnicode=true&charset=utf8"). \
option("dbtable", "O3Category"). \
option("user", "root"). \
option("password", "root"). \
option("encoding", "utf-8"). \
save()
result8.write.mode("overwrite").saveAsTable("O3Category", "parquet")
spark.sql("select * from O3Category").show()
#需求9
print("-------------------需求9 计算每个城市每年每月的平均 AQI--------------------")
reuslt9 = airdata.groupby("city",year("date").alias("year"), month("date").alias("month"))\
.agg(avg("AQI").alias("month_AQI"))
reuslt9.write.mode("overwrite"). \
format("jdbc"). \
option("url", "jdbc:mysql://node1:3306/bigdata?useSSL=false&useUnicode=true&charset=utf8"). \
option("dbtable", "monthAQI"). \
option("user", "root"). \
option("password", "root"). \
option("encoding", "utf-8"). \
save()
reuslt9.write.mode("overwrite").saveAsTable("monthAQI", "parquet")
spark.sql("select * from monthAQI").show()
🍅✌感兴趣的可以先收藏起来,点赞关注不迷路,想学习更多项目可以查看主页,大家在毕设选题,项目代码以及论文编写等相关问题都可以给我留言咨询,希望可以帮助同学们顺利毕业!🍅✌
5、源码获取方式
🍅由于篇幅限制,获取完整文章或源码、代做项目的,拉到文章底部即可看到个人联系方式。🍅
点赞、收藏、关注,不迷路,下方查看👇🏻获取联系方式👇🏻