Spark空气质量数据分析与预测系统 Hadoop 爬虫 机器学习 线性回归预测算法 Python语言 Hive数据仓库 AQI分析 大数据毕业设计(源码+文档)✅

博主介绍:✌全网粉丝10W+,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌
> 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与我联系了。🍅

点击查看作者主页,了解更多项目!

🍅感兴趣的可以先收藏起来,点赞、关注不迷路,大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助同学们顺利毕业 。🍅

1、毕业设计:2025年计算机专业毕业设计选题汇总(建议收藏)✅

2、最全计算机专业毕业设计选题大全(建议收藏)✅

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 数据库。
    • 前端:提供数据采集状态的展示界面。
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、源码获取方式

🍅由于篇幅限制,获取完整文章或源码、代做项目的,拉到文章底部即可看到个人联系方式。🍅

点赞、收藏、关注,不迷路,下方查看👇🏻获取联系方式👇🏻

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值