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.我们应爱护环境,减少有毒气体的排放,坚持绿色发展。

改进的建议包括:

增加更多的数据源,以获得更全面和准确的数据,可以提却更多的字段信息,从不同角度去分析“空气污染程度”的普及程度。

进一步优化爬虫程序的效率和稳定性。

进一步深入数据分析和建模,例如使用机器学习算法进行情感分析或预测模型的构建。

增加更多的数据可视化方法和图表类型,以更好地展示数据和结论。

要对所获取的文本进行更加精确的分词以及进行聚类,使所得到的分词更具有主题性。

通过不断改进和完善,可以使网络爬虫程序更具实用性和可靠性,并为空气污染相关的数据分析提供更有价值的见解。

posted @ 2023-09-04 12:05  罗宾aa  阅读(941)  评论(0编辑  收藏  举报