【python】全国空气质量分析系统

用户需求

【python】全国空气质量分析系统

需求分析

想要实现这个系统的话,大致分为三步:(不得不说,这个期末大作业真的太狠了)

  • 数据入库:下载历史数据,用python把它导入到数据库中
  • 数据分析:针对数据库数据,实现数据的可视化
  • GUI设计:最后的结果需要做一个界面出来供用户使用

成果展示

先来看看最后做出来的效果

【python】全国空气质量分析系统

【python】全国空气质量分析系统

【python】全国空气质量分析系统

【python】全国空气质量分析系统

【python】全国空气质量分析系统【python】全国空气质量分析系统

【python】全国空气质量分析系统

【python】全国空气质量分析系统

【python】全国空气质量分析系统


数据入库

在网址全国空气质量历史数据下载数据。全国城市空气质量数据主要统计了2014年5月13日年至今各个城市各个站点的空气质量数据,包括对PM2.5,PM10,SO2,NO2,O3,CO,AQI数据的统计。未经处理前的数据按日期存放,每一个数据文件(.csv)以当天的日期命名。该数据文件统计了当天全国各个站点检测到的PM2.5,PM10,SO2,NO2,O3,CO,AQI数据。

在进行数据分析之前,我们需要将数据导入到数据库中并作一些简单的处理。在python的基础上导入sqlite3(用pip install sqlite3安装)并用它将数据导入数据库中。原始的数据每个文件的第一列是具体的某一日,第二列是具体的某一小时,第三列是统计的空气质量类型,第四列至最后一列是每个站点的编号。如图:

【python】全国空气质量分析系统

为了将多个这样的数据文件整合到一起,我们保留日期和小时,利用站点列表文件(站点列表-2020.05.08起.csv)将站点编码换成具体的中文名称放到第3列,同时将当前站点所在的城市放在第5列,后面的5至19列换成14个空气质量数据类型。所以,最后的数据库每一行就代表某一站点某一天某一时刻14个空气数据的具体数值。如此建表对后面的数据分析也有帮助。

数据入库代码

数据库的实现主要包括3个部分:初始化数据库,站点编号与名称的提取,数据入库。主函数如下:
【python】全国空气质量分析系统

首先初始化一个数据库,如果数据库中没有一个叫sites的表的话,就建一个:
【python】全国空气质量分析系统

站点编号替换(函数city_sites):站点编号和对应的名称都在“站点列表-2020.05.08起.csv”中,所以读取该文件中每一行的文字,新建空的列表用来存放站点编码(code)和名称及该站点所在城市(name_city),最后将这两个列表封装成一个字典(city),即可得到站点编号(code)所对应的中文名称和所在的城市(name_city)。
【python】全国空气质量分析系统

数据入库:在数据入库时,先写一个遍历函数(import_city_aqi)用来遍历目录文件,找到文件后才开始处理(函数process):

【python】全国空气质量分析系统

在函数process中,先利用for循环将站点编号全部换成站点的名称,再把站点名称和所在城市封装成一个字典。然后将数据文件的每一行根据日期(day)、时间(hour)、和站点名称(site)来存放fields里的数据。

【python】全国空气质量分析系统

最后,将数据插入到新建的表中:

【python】全国空气质量分析系统

如此,我们便完成了数据入库的操作。最后得到的数据库如下所示(数据库文件.db用SQliteSpy打开):

【python】全国空气质量分析系统


GUI设计

在这里用PySimpleGUI库设计GUI界面。设计思路:

  1. 用户可以自由地选择城市,在选择了城市后,可以查询该城市某一个具体站点的数据,也可以查询该城市所有站点的数据,因此需要两个联动的下拉选项框一个选择城市的按钮

  2. 对于用户想要查询的内容,也有一个下拉选项框,内容包括:日平均AQI, 月平均AQI, 年平均AQI, 全国城市空气质量日排行榜, 全国城市空气质量月排行榜, 全国城市空气质量年排行榜。其中日平均AQI,月平均AQI和年平均AQI是针对选择的城市或站点而言,一旦确定查询后,有一个数据输出框 显示数据内容,同时也有图表的展示。因此需要一个查询的按钮和一个数据输出框。全国城市空气质量日/月/年排行榜是针对具体的某一日/月/年而言,所以选定该选项后,设计一个可以跳出的文本输入框用来输入具体的日/月/年。之后,在数据输出框输出该日/月/年的排行,并在中国地图上显示。

  3. 对于GUI的界面主题,选择低调而又显眼,简单又不失优雅的紫色和蓝色

GUI界面的代码如下:

【python】全国空气质量分析系统

效果:

【python】全国空气质量分析系统

“选择城市”按钮相关模块的实现

如果选择城市按钮被触发,返回用户当前所选择的城市(current_city),并更新观测站点选项框(Win[‘SITE’]),使得该框只出现当前城市的站点,而不是显示所有的站点。如此便实现了两个下拉框之间的联动。

【python】全国空气质量分析系统
效果:
【python】全国空气质量分析系统

“查询”按钮相关模块的实现

当日/月/年平均AQI被选择时,在show_aqi函数中根据当前选择的城市和站点从数据库中获取数据,显示在数据输出窗口并绘制相对应的图表:

【python】全国空气质量分析系统
在show_aqi中要完成的是数据库中相关数据的索引提取以及将提取的数据用图表显示(函数draw_charts)。如果选择的是城市全部站点,则选择数据库中的city列,如果是某一站点,则选择该站点下的数据:
【python】全国空气质量分析系统

如果是日/月/年的排行榜查询,那么就让用户输入一个具体的日期/月份/年份然后在show_order函数中选择数据并输出以及绘制中国地图上的数据。
【python】全国空气质量分析系统
效果如下:

【python】全国空气质量分析系统

输入一个具体的日/月/年后,点击ok之后,就会运行show_order函数,提取相关的排行榜数据,在draw_map

中绘制数据的地图显示。绘制地图需要用到pyecharts库,但是pyecharts绘制的图像是html文件,画图的结果不会像matplotlib一样直接显示,而是生成一个html文件,需要在网页打开。所以,为了让客户点击ok后可以直接打开图像,不需要手动打开,在这里利用webbrowser打开最后的html文件:

【python】全国空气质量分析系统

综上,一个勉勉强强的全国空气质量系统就完成了。

相关文章: