Python爬虫爬取北京空气质量数据并做可视化分析
一.选题背景
空气质量(Air quality)是依据空气中污染物浓度的高低来判断的,其好坏反映了空气污染程度。空气污染是一个复杂的现象,在特定时间和地点空气污染物浓度受到许多因素影响。空气质量不达标的危害有很多,例如1、危害人体:当大气中污染物的浓度很高时,会造成人体急性污染中毒,或使病状恶化,甚至在几天内夺去几千人的生命。2、对植物的危害:当污染物浓度很高时,会对植物产生急性危害,使植物叶表面产生伤斑,导致枝叶枯萎脱落;3、影响气候:空气污染会减少阳光到达地面的太阳辐射量,增加大气降水量,同时也会增加下酸雨的机率,而酸雨能使大片森林和农作物毁坏,能使纸品、纺织品、皮革制品等腐蚀破碎,能使金属的防锈涂料变质而降低保护作用,还会腐蚀污染建筑物。
二.大数据分析设计方案
从网址中爬取完数据后,在python环境中导入pandas、plotly等库进行数据整理,经过数据清洗,检查数据等,然后进行可视化处理,找到空气质量的关系完成数据分析。
数据来源:'http://tianqihoubao.com/aqi/beijing-{year}0{month}.html'
思路:对数据集进行分析,进行数据清洗,根据所需内容对数据进行可视化最后得到图像并分析结果。
北京空气质量网近两年页面爬取主要爬取了页面中表格table中的td数据。
为页面中的日期、质量等级、AQI指数、当天AQI排量、PM2.5、、PM10、SO2、No2、Co、O3。
三.主题页面的结构特征分析
1.目标内容界面:
2.HTML界面分析
3.节点(标签)查找方法与遍历方法
打开网页的源码,然后用鼠标检查工具找打对应大概位置进行查找,然后在元素中分析,用beautifulsoup4方法对获取的页面进行处理
四.网络爬虫程序设计
1.爬取网站生成csv文件的过程
1 import csv 2 import random 3 import time 4 import pandas as pd 5 import requests 6 from bs4 import BeautifulSoup 7 import matplotlib.pyplot as plt 8 9 plt.rcParams["font.sans-serif"] = ["SimHei"] 10 plt.rcParams["axes.unicode_minus"] = False 11 12 13 class Spider(object): 14 def __init__(self): 15 pass 16 17 def get_data_and_save(self): 18 with open('data.csv', 'w', encoding='utf-8', newline='') as f: 19 csv_writer = csv.writer(f) 20 csv_writer.writerow(['日期', '质量等级', 'AQI指数', '当天AQI排名', 'PM2.5', 'PM10', 'So2', 'No2', 'Co', 'O3']) 21 years = [2020, 2021, 2022] 22 #2020年到2022年 23 months = range(1, 13) 24 #1月到12月 25 for year in years: 26 for month in months: 27 if month < 10: 28 url = f'http://tianqihoubao.com/aqi/beijing-{year}0{month}.html' 29 else: 30 url = f'http://tianqihoubao.com/aqi/beijing-{year}{month}.html' 31 res = requests.get(url).text 32 soup = BeautifulSoup(res, 'html.parser') 33 for attr in soup.find_all('tr')[1:]: 34 one_day_data = list() 35 for index in range(0, 10): 36 one_day_data.append(attr.find_all('td')[index].get_text().strip()) 37 csv_writer.writerow(one_day_data) 38 time.sleep(2 + random.random()) 39 print(year, month) 40 41 def drawing(self): 42 csv_df = pd.read_csv('data.csv', encoding='GBK') 43 csv_df['日期'] = pd.to_datetime(csv_df['日期']) 44 csv_df.index = csv_df['日期'] 45 del csv_df['日期'] 46 47 str_data = '2020-01-01' 48 end_data = '2020-01-31' 49 new_split_df = csv_df[str_data:end_data] 50 values_count = new_split_df['质量等级'].value_counts().items() 51 total = new_split_df['质量等级'].value_counts().tolist() 52 label = new_split_df['质量等级'].value_counts().index 53 explode = [0.01 for i in range(len(total))] 54 fig, axes = plt.subplots(3, 1, figsize=(10, 8)) 55 56 57 58 if __name__ == '__main__': 59 spider = Spider() 60 # 获取数据,保存数据 61 spider.get_data_and_save() 62 # 画分析图 63 spider.drawing()
将获得CSV表:
2.数据清洗:
①导入相应模块以及数据集
1 import pandas as pd 2 #导入pandas库进行数据清洗使用 3 4 import numpy as np 5 #导入numpu对后面使用随机函数使用 6 7 import seaborn as sns 8 import matplotlib.pyplot as plt 9 #导入numpu对后面使用随机函数使用 10 df=pd.read_csv('data.csv') 11 df
②处理缺失值
发现无缺失值
③重复值处理
并没有发现重复值
④清除空值
1 import pandas as pd 2 import numpy as np 3 import seaborn as sns 4 import matplotlib.pyplot as plt 5 df=pd.read_csv('data.csv') 6 #清除空值 7 datas = df.dropna() 8 display(datas)
⑤查看是否含有true
1 import pandas as pd 2 import numpy as np 3 import seaborn as sns 4 import matplotlib.pyplot as plt 5 df=pd.read_csv('data.csv') 6 df.isna().any() 7 #s是否有true值
无TRUE值
3.数据预处理结束无误开始做数据分析
字典统计法:
1 # Author:xueling 2 # 先打开一篇我们要统计的文章,并读取内容 3 f = open(r'data.csv', 'r', encoding='utf-8') 4 article = f.read() 5 # 建立一个空字典来存储统计结果 6 d = {} 7 # 遍历整篇文章 8 for i in article: 9 d[i] = d.get(i,0) + 1 # 字频统计 10 # 在此基础上我们还可以做一个排序: 11 ls = sorted(list(d.items()), key= lambda x:x[1], reverse=True) 12 print(d) 13 f.close()
哈希表统计法:
1 # Author:xueling 2 # 在colletions 导入哈希表的包 3 from collections import defaultdict 4 # 打开一个要统计的文件 5 f = open(r'data.csv', 'r', encoding='utf-8') 6 article = f.read() 7 # d是通过defaultdict生成的一个哈希表,其中value我们给int型的数据类型,来记录字符数 8 d = defaultdict(int) 9 # article里每一个字我们把它当做哈希表里的key,每有一个字就给value + 1,value默认值就是0 10 for key in article: 11 d[key] += 1 12 print(d)
绘制AQI与PM2.5的关系散点图
1 import pandas as pd 2 import numpy as np 3 import seaborn as sns 4 import matplotlib.pyplot as plt 5 df=pd.read_csv('data.csv') 6 #绘制 aqi 和 pm2.5 的关系散点图 7 # 设置图像尺寸 8 plt.figure(figsize=(15, 10)) 9 # 绘制散点图,横坐标为aqi数据的第二列,纵坐标为aqi数据的第四列 10 plt.scatter(df[df.columns[1]], df[df.columns[3]]) 11 # 设置横轴标签为'AQI',字体大小为20 12 plt.xlabel('空气等级', fontsize=20) 13 # 设置纵轴标签为'PM2.5',字体大小为20 14 plt.ylabel('AQI', fontsize=20) 15 # 设置图像标题为'AQI和PM2.5的关系散点图',字体大小为25 16 plt.title('空气质量等级分类散点图', fontsize=25) 17 # 显示图像 18 plt.show()
由图可知:PM2.5排放越大,AQI指数越高,空气等级越高,空气质量越不好。
绘制空气等级质量的单变量分布图
1 import pandas as pd 2 import numpy as np 3 import seaborn as sns 4 import seaborn as sn 5 import matplotlib.pyplot as plt 6 df=pd.read_csv('data.csv') 7 # 绘制空气质量等级单变量分布图 8 # 绘制以第三列为 x 轴,数据来源为 aqi 的计数图 9 sn.countplot(x=df.columns[2], data=df) 10 # 设置标题为“空气质量等级单变量分布图” 11 plt.title("空气质量等级单变量分布图") 12 # 设置 x 轴标签为“质量等级” 13 plt.xlabel("质量等级") 14 # 设置 y 轴标签为“aqi” 15 plt.ylabel("aqi") 16 # 显示图像 17 plt.show()
可知:AQI指数越高,空气质量越差。
1 import pandas as pd 2 import numpy as np 3 import seaborn as sns 4 import seaborn as sn 5 import matplotlib.pyplot as plt 6 df=pd.read_csv('data.csv') 7 # 绘制空气质量等级单变量分布图 8 # 绘制以第三列为 x 轴,数据来源为 aqi 的计数图 9 sn.countplot(x=df.columns[4], data=df) 10 # 设置标题为“空气质量等级单变量分布图” 11 plt.title("空气质量等级单变量分布图") 12 # 设置 x 轴标签为“质量等级” 13 plt.xlabel("质量等级") 14 # 设置 y 轴标签为“aqi” 15 plt.ylabel("PM2.5") 16 # 显示图像 17 plt.sho
可知:PM2.5浓度越高,空气质量越差。以此有害气体浓度越高,空气质量越差。
制作2020-2022年空气质量饼图
1 import numpy as np 2 import pandas as pd 3 import matplotlib 4 import matplotlib.pyplot as plt 5 6 # 读文件,去无用字段 7 bj_date = pd.read_csv('data.csv') 8 # print(bj_date.head(30)) 9 # 数据清洗 10 #bj_date.drop(bj_date[np.isnan(bj_date['PM_US Post'])].index, inplace=True) 11 12 13 # 空气质量定级 14 def get_level(AQI指数): 15 if AQI指数 < 35: 16 return '优' 17 elif AQI指数 < 75: 18 return '良' 19 elif AQI指数 < 150: 20 return '轻度污染' 21 elif AQI指数 < 250: 22 return '中度污染' 23 elif AQI指数 >= 250: 24 return '高度污染' 25 26 27 # 给原始数据添加新列表level 28 bj_date.loc[:, 'level'] = bj_date['AQI指数'].apply(get_level) 29 print(bj_date) 30 # 统计各种空气质量的比列 31 bj_level=bj_date.groupby(['level']).size() / len(bj_date) 32 print(bj_level) 33 #画图 34 matplotlib.rcParams['font.sans-serif'] = 'SimHei' 35 l=['中度污染','优','良','轻度污染','高度污染'] 36 plt.pie(bj_level,labels=l,autopct='%.2f%%') 37 plt.title('北京空气质量指数') 38 plt.show()
可知:北京近两年空气质量优良占比较高,空气较好。
绘制PM2.5与AQI的线性回归图
1 import pandas as pd 2 import numpy as np 3 import seaborn as sns 4 import seaborn as sn 5 import matplotlib.pyplot as plt 6 df=pd.read_csv('data.csv') 7 # 绘制PM2.5与AQI的线性回归拟合图 8 # 调用seaborn库的regplot函数,将PM2.5含量(ppm)作为x轴,AQI作为y轴,数据源为aqi 9 sn.regplot(x='PM2.5', y='AQI指数', data=df) 10 # 设定图表标题为 'PM2.5与AQI的线性回归拟合图' 11 plt.title('PM2.5与AQI的线性回归拟合图') 12 # 设定图表x轴标签为'PM2.5含量(ppm)' 13 plt.xlabel('PM2.5含量(ppm)') 14 # 设定图表y轴标签为'AQI' 15 plt.ylabel('AQI') 16 # 显示图表 17 plt.show()
可知: AQI排放量与PM2.5成正比
So2与PM2.5之间的关系:
1 df['So2'].plot.line() 2 3 plt.xlabel('So2') 4 5 plt.ylabel('PM2.5') 6 7 plt.title('变化趋势') 8 9 plt.show() 10 #变化趋势图
如图 So2与PM2.5没有直接关联。
绘制各污染物之间的特征相关性热力分布图
1 import pandas as pd 2 import numpy as np 3 import seaborn as sns 4 import seaborn as sn 5 import matplotlib.pyplot as plt 6 df=pd.read_csv('data.csv') 7 # 绘制特征相关性热力图 8 # 设置画布大小 9 plt.figure(figsize=(17, 14)) 10 # 计算相关系数并赋值给变量 corr 11 corr = df[['AQI指数', 'PM2.5', 'PM10', 'So2', 'Co', 'No2', 'O3']].corr() 12 # 以热图的形式展示相关性,并用蓝红色调表示,同时在每个方格中显示数值,并设置线宽为1 13 sn.heatmap(corr, cmap='RdBu_r', annot=True, linewidths=1) 14 # 设置热图的标题,并设置字体大小为25 15 plt.title("各污染物之间的特征相关性热力分布图", fontsize=25) 16 # 设置x轴标签字体大小为15 17 plt.xticks(fontsize=15) 18 # 设置y轴标签字体大小为15 19 plt.yticks(fontsize=15) 20 # 展示画布 21 plt.show()
绘制每日So2与AQI排放量的条形图
1 # 打开清洗后的数据文件'data.csv' 2 import pandas as pd 3 df_new = pd.read_csv('data.csv') 4 df_new 5 import matplotlib.pyplot as plt #导入matplotlib库中的pyplot模块,pyplot是用于创建图表的主要函数 6 df_new['当天AQI排名'].value_counts().nlargest(10).plot.bar(figsize=(14,6),fontsize= 13) 7 plt.title('柱形图',fontsize= 20) 8 plt.xlabel('AQI',fontsize= 16) 9 plt.xticks(rotation=0) #设置X轴刻度标签的旋转角度。xticks是指X轴上的刻度,rotation参数指定刻度标签的旋转度数,0表示不旋转。若刻度标签内容过长,旋转角度可以调整为其他角度,以便更好地展示文本。 10 plt.ylabel('So2',fontsize= 16) 11 plt.legend() #显示标签 12 plt.rcParams['font.sans-serif'] = ['SimHei'] #设置显示中文字符的字体 13 plt.grid() #显示网格线 14 plt.show() #s显示图形,
可知:So2排放量越高,AQI指数越大,空气越不好。
总代码:
1 import csv 2 #导入CSV文件库 3 import random 4 #导入标准库 5 import time 6 import requests 7 #可爬取http文件库 8 from bs4 import BeautifulSoup 9 import matplotlib.pyplot as plt 10 #导入前两个库为爬虫所需要的库 11 12 import jieba 13 from wordcloud import WordCloud 14 # 导入WordCloud模块,用于生成词云 15 from PIL import Image 16 # 导入PIL库,用于处理图像 17 import numpy as np 18 # 导入numpy库,用于数值计算 19 from matplotlib import cm 20 # 导入cm模块,用于颜色映射 21 import pandas as pd 22 #导入pandas库进行数据清洗使用 23 24 import seaborn as sns 25 #实现网络相关库和框架 26 import matplotlib.pyplot as plt 27 #导入numpu对后面使用随机函数使用 28 plt.rcParams["font.sans-serif"] = ["SimHei"] 29 plt.rcParams["axes.unicode_minus"] = False 30 import pandas as pd 31 # 导入pandas库,用于数据处理和操作 32 import matplotlib.pyplot as plt 33 # 导入matplotlib库,用于绘图 34 from wordcloud import WordCloud 35 # 导入WordCloud模块,用于生成词云 36 from PIL import Image 37 # 导入PIL库,用于处理图像 38 import numpy as np 39 # 导入numpy库,用于数值计算 40 from matplotlib import cm 41 # 导入cm模块,用于颜色映射 42 43 44 class Spider(object): 45 def __init__(self): 46 pass 47 48 def get_data_and_save(self): 49 with open('data.csv', 'w', encoding='utf-8', newline='') as f: 50 csv_writer = csv.writer(f) 51 csv_writer.writerow(['日期', '质量等级', 'AQI指数', '当天AQI排名', 'PM2.5', 'PM10', 'So2', 'No2', 'Co', 'O3']) 52 years = [2020, 2021, 2022] 53 #2020年到2022年 54 months = range(1, 13) 55 #1月到12月 56 for year in years: 57 for month in months: 58 if month < 10: 59 url = f'http://tianqihoubao.com/aqi/beijing-{year}0{month}.html' 60 else: 61 url = f'http://tianqihoubao.com/aqi/beijing-{year}{month}.html' 62 res = requests.get(url).text 63 soup = BeautifulSoup(res, 'html.parser') 64 for attr in soup.find_all('tr')[1:]: 65 one_day_data = list() 66 for index in range(0, 10): 67 one_day_data.append(attr.find_all('td')[index].get_text().strip()) 68 csv_writer.writerow(one_day_data) 69 time.sleep(2 + random.random()) 70 print(year, month) 71 72 def drawing(self): 73 csv_df = pd.read_csv('data.csv', encoding='GBK') 74 csv_df['日期'] = pd.to_datetime(csv_df['日期']) 75 csv_df.index = csv_df['日期'] 76 del csv_df['日期'] 77 78 str_data = '2020-01-01' 79 end_data = '2020-01-31' 80 new_split_df = csv_df[str_data:end_data] 81 values_count = new_split_df['质量等级'].value_counts().items() 82 total = new_split_df['质量等级'].value_counts().tolist() 83 label = new_split_df['质量等级'].value_counts().index 84 explode = [0.01 for i in range(len(total))] 85 fig, axes = plt.subplots(3, 1, figsize=(10, 8)) 86 87 88 89 if __name__ == '__main__': 90 spider = Spider() 91 # 获取数据,保存数据 92 spider.get_data_and_save() 93 # 画分析图 94 spider.drawing() 95 96 df=pd.read_csv('data.csv') 97 df 98 #导出CSV 99 100 #处理缺失值 101 df.isnull().sum() 102 103 df=pd.read_csv('data.csv') 104 #重复值处理 105 df=df.drop_duplicates() 106 df 107 108 import pandas as pd 109 import numpy as np 110 import seaborn as sns 111 import matplotlib.pyplot as plt 112 df=pd.read_csv('data.csv') 113 df.isna().any() 114 115 116 import matplotlib.pyplot as plt 117 df=pd.read_csv('data.csv') 118 #清除空值 119 datas = df.dropna() 120 display(datas) 121 122 df=pd.read_csv('data.csv') 123 df.isna().any() 124 #s是否有true值 125 126 df=pd.read_csv('data.csv') 127 #绘制 aqi 和 pm2.5 的关系散点图 128 # 设置图像尺寸 129 plt.figure(figsize=(15, 10)) 130 # 绘制散点图,横坐标为aqi数据的第二列,纵坐标为aqi数据的第四列 131 plt.scatter(df[df.columns[1]], df[df.columns[3]]) 132 # 设置横轴标签为'AQI',字体大小为20 133 plt.xlabel('空气等级', fontsize=20) 134 # 设置纵轴标签为'PM2.5',字体大小为20 135 plt.ylabel('AQI', fontsize=20) 136 # 设置图像标题为'AQI和PM2.5的关系散点图',字体大小为25 137 plt.title('空气质量等级分类散点图', fontsize=25) 138 # 显示图像 139 plt.show() 140 141 df=pd.read_csv('data.csv') 142 # 绘制空气质量等级单变量分布图 143 # 绘制以第三列为 x 轴,数据来源为 aqi 的计数图 144 sn.countplot(x=df.columns[2], data=df) 145 # 设置标题为“空气质量等级单变量分布图” 146 plt.title("空气质量等级单变量分布图") 147 # 设置 x 轴标签为“质量等级” 148 plt.xlabel("质量等级") 149 # 设置 y 轴标签为“aqi” 150 plt.ylabel("aqi") 151 # 显示图像 152 plt.show() 153 df=pd.read_csv('data.csv') 154 # 绘制空气质量等级单变量分布图 155 # 绘制以第三列为 x 轴,数据来源为 aqi 的计数图 156 sn.countplot(x=df.columns[4], data=df) 157 # 设置标题为“空气质量等级单变量分布图” 158 plt.title("空气质量等级单变量分布图") 159 # 设置 x 轴标签为“质量等级” 160 plt.xlabel("质量等级") 161 # 设置 y 轴标签为“So2” 162 plt.ylabel("So2") 163 # 显示图像 164 plt.show() 165 166 df=pd.read_csv('data.csv') 167 # 绘制空气质量等级单变量分布图 168 # 绘制以第三列为 x 轴,数据来源为 aqi 的计数图 169 sn.countplot(x=df.columns[7], data=df) 170 # 设置标题为“空气质量等级单变量分布图” 171 plt.title("空气质量等级单变量分布图") 172 # 设置 x 轴标签为“质量等级” 173 plt.xlabel("质量等级") 174 # 设置 y 轴标签为“No2” 175 plt.ylabel("No2") 176 # 显示图像 177 plt.show() 178 179 df=pd.read_csv('data.csv') 180 # 绘制空气质量等级单变量分布图 181 # 绘制以第三列为 x 轴,数据来源为 aqi 的计数图 182 sn.countplot(x=df.columns[8], data=df) 183 # 设置标题为“空气质量等级单变量分布图” 184 plt.title("空气质量等级单变量分布图") 185 # 设置 x 轴标签为“质量等级” 186 plt.xlabel("质量等级") 187 # 设置 y 轴标签为“co” 188 plt.ylabel("Co") 189 # 显示图像 190 plt.show() 191 192 df=pd.read_csv('data.csv') 193 # 绘制空气质量等级单变量分布图 194 # 绘制以第三列为 x 轴,数据来源为 aqi 的计数图 195 sn.countplot(x=df.columns[9], data=df) 196 # 设置标题为“空气质量等级单变量分布图” 197 plt.title("空气质量等级单变量分布图") 198 # 设置 x 轴标签为“质量等级” 199 plt.xlabel("质量等级") 200 # 设置 y 轴标签为“o3” 201 plt.ylabel("O3") 202 # 显示图像 203 plt.show() 204 df=pd.read_csv('data.csv') 205 # 绘制PM2.5与AQI的线性回归拟合图 206 # 调用seaborn库的regplot函数,将PM2.5含量(ppm)作为x轴,AQI作为y轴,数据源为aqi 207 sn.regplot(x='PM2.5', y='AQI指数', data=df) 208 # 设定图表标题为 'PM2.5与AQI的线性回归拟合图' 209 plt.title('PM2.5与AQI的线性回归拟合图') 210 # 设定图表x轴标签为'PM2.5含量(ppm)' 211 plt.xlabel('PM2.5含量(ppm)') 212 # 设定图表y轴标签为'AQI' 213 plt.ylabel('AQI') 214 # 显示图表 215 plt.show() 216 217 df=pd.read_csv('data.csv') 218 # 绘制特征相关性热力图 219 # 设置画布大小 220 plt.figure(figsize=(17, 14)) 221 # 计算相关系数并赋值给变量 corr 222 corr = df[['AQI指数', 'PM2.5', 'PM10', 'So2', 'Co', 'No2', 'O3']].corr() 223 # 以热图的形式展示相关性,并用蓝红色调表示,同时在每个方格中显示数值,并设置线宽为1 224 sn.heatmap(corr, cmap='RdBu_r', annot=True, linewidths=1) 225 # 设置热图的标题,并设置字体大小为25 226 plt.title("各污染物之间的特征相关性热力分布图", fontsize=25) 227 # 设置x轴标签字体大小为15 228 plt.xticks(fontsize=15) 229 # 设置y轴标签字体大小为15 230 plt.yticks(fontsize=15) 231 # 展示画布 232 plt.show() 233 234 # Author:xueling 235 # 先打开一篇我们要统计的文章,并读取内容 236 f = open(r'data.csv', 'r', encoding='utf-8') 237 article = f.read() 238 # 建立一个空字典来存储统计结果 239 d = {} 240 # 遍历整篇文章 241 for i in article: 242 d[i] = d.get(i,0) + 1 # 字频统计 243 # 在此基础上我们还可以做一个排序: 244 ls = sorted(list(d.items()), key= lambda x:x[1], reverse=True) 245 print(d) 246 f.close() 247 248 # Author:xueling 249 # 在colletions 导入哈希表的包 250 from collections import defaultdict 251 # 打开一个要统计的文件 252 f = open(r'data.csv', 'r', encoding='utf-8') 253 article = f.read() 254 # d是通过defaultdict生成的一个哈希表,其中value我们给int型的数据类型,来记录字符数 255 d = defaultdict(int) 256 # article里每一个字我们把它当做哈希表里的key,每有一个字就给value + 1,value默认值就是0 257 for key in article: 258 d[key] += 1 259 print(d) 260 261 # 读文件,去无用字段 262 bj_date = pd.read_csv('data.csv') 263 # print(bj_date.head(30)) 264 # 数据清洗 265 #bj_date.drop(bj_date[np.isnan(bj_date['PM_US Post'])].index, inplace=True) 266 267 268 # 空气质量定级 269 def get_level(AQI指数): 270 if AQI指数 < 35: 271 return '优' 272 elif AQI指数 < 75: 273 return '良' 274 elif AQI指数 < 150: 275 return '轻度污染' 276 elif AQI指数 < 250: 277 return '中度污染' 278 elif AQI指数 >= 250: 279 return '高度污染' 280 281 282 # 给原始数据添加新列表level 283 bj_date.loc[:, 'level'] = bj_date['AQI指数'].apply(get_level) 284 print(bj_date) 285 # 统计各种空气质量的比列 286 bj_level=bj_date.groupby(['level']).size() / len(bj_date) 287 print(bj_level) 288 #画图 289 matplotlib.rcParams['font.sans-serif'] = 'SimHei' 290 l=['中度污染','优','良','轻度污染','高度污染'] 291 plt.pie(bj_level,labels=l,autopct='%.2f%%') 292 293 plt.title('北京空气质量指数') 294 plt.show() 295 296 # 打开清洗后的数据文件'data.csv' 297 import pandas as pd 298 df_new = pd.read_csv('data.csv') 299 df_new 300 import matplotlib.pyplot as plt 301 #导入matplotlib库中的pyplot模块,pyplot是用于创建图表的主要函数 302 df_new['当天AQI排名'].value_counts().nlargest(10).plot.bar(figsize=(14,6),fontsize= 13) 303 plt.title('柱形图',fontsize= 20) 304 plt.xlabel('AQI',fontsize= 16) 305 plt.xticks(rotation=0) 306 #设置X轴刻度标签的旋转角度。xticks是指X轴上的刻度,rotation参数指定刻度标签的旋转度数,0表示不旋转。若刻度标签内容过长,旋转角度可以调整为其他角度,以便更好地展示文本。 307 plt.ylabel('So2',fontsize= 16) 308 plt.legend() 309 #显示标签 310 plt.rcParams['font.sans-serif'] = ['SimHei'] 311 #设置显示中文字符的字体 312 plt.grid() 313 #显示网格线 314 315 plt.show() 316 #s显示图形 317 318 df['So2'].plot.line() 319 320 plt.xlabel('So2') 321 322 plt.ylabel('PM2.5') 323 324 plt.title('变化趋势') 325 326 plt.show() 327 #变化趋势图
总结:
1.pm2.5,pm10,so2,no2,co,o3等有毒气体对AQI指数的影响,有毒气体排放越大,AQI指数越大,AQI指数越大,空气质量越差。
2.我们应爱护环境,减少有毒气体的排放,坚持绿色发展。
改进的建议包括:
增加更多的数据源,以获得更全面和准确的数据,可以提却更多的字段信息,从不同角度去分析“空气污染程度”的普及程度。
进一步优化爬虫程序的效率和稳定性。
进一步深入数据分析和建模,例如使用机器学习算法进行情感分析或预测模型的构建。
增加更多的数据可视化方法和图表类型,以更好地展示数据和结论。
要对所获取的文本进行更加精确的分词以及进行聚类,使所得到的分词更具有主题性。
通过不断改进和完善,可以使网络爬虫程序更具实用性和可靠性,并为空气污染相关的数据分析提供更有价值的见解。