干货!如何用Python KNN算法分析预测城市空气质量?

作者|李
编辑|吴
图|东方IC CSDN付费下载
| csdn (ID: csdnnews)
随着中国工业和科技的发展,中国一些发达城市的空气质量问题越来越严重,其中最严重的是PM2.5造成的恶劣环境问题
基于网上公布的空气质量数据,抓取相关数据,对天津、北京、广州等环境相对恶劣城市的质量数据进行对比分析。在分析的基础上,得出了空气质量的变化情况,并提出了一些建议。利用机器学习算法根据数据预测空气质量,从而达到分析预测的典型大数据分析模型效果。
总体分析的流程图如下:
实验前准备
1.1数据采集这里我们得到的数据来自于互联网上公布的空气质量数据,数据来自于“天气邮报”的网站,其网址为:http://www.tianqihoubao.com/aqi/tianjin.html.内容见下图:
图1-1网站资料图
整个数据采集都是用python爬取的。流程如下:
(1)导入爬虫所需的库:
在空中_天津_2019.py程序。
其中,Requests是一个用Python语言编写的HTTP库,基于urllib,采用Apache2授权开源协议。比urllib方便,可以省去我们很多工作,完全满足HTTP测试需求。
其中,BeautifulSoup库是一个灵活方便的网页解析库,处理效率高,支持多种解析器。使用它,我们可以轻松地捕获web信息,而无需编写正则表达式。
相应的代码如下:
导入时间
导入请求
从bs4导入BeautifulSoup
(2)为了防止网站的反爬取机制,我们设置了模拟浏览器来访问和获取数据:
headers={ ‘ User-Agent ‘ : ‘ Mozilla/5.0(Windows NT 6.1;WOW64) AppleWebKit/537.36 (KHTML,像壁虎一样)Chrome/63 . 0 . 3239 . 132 Safari/537.36 ‘ }
(3)然后得到2019年全年的空气质量数据:
对于(1,13):范围内的I
时间.睡眠(5)
URL=’ http://www . tianchihoubao . com/aqi/Tianjin-2019 ‘ str(\’d\’ % I)’。’ html ‘
response=requests.get(url=url,headers=headers)
soup=beautiful soup(response . text,’ html.parser ‘)
tr=soup.find_all(‘tr ‘)
1.2数据预处理如果只是从网站获取的数据会有一些标签等干扰项,我们可以去掉一些标签:
对于tr[1:]:中的j
td=j.find_all(‘td ‘)
日期=td[0]。get_text.strip
质量_等级=td[1]。get_text.strip
AQI=td[2]。get_text.strip
AQI_rank=td[3]。get_text.strip
PM=td[4]。获取_文本
用open(‘air_tianjin_2019.csv ‘,’ a ‘,编码=’utf-8-sig ‘)作为f:
f.write(日期’,’质量等级’,’ AQI ‘,’ AQI _等级’,’ PM ‘\n ‘)
最后爬下来的部分数据如下:
表1-1天津爬行部分数据表
这些数据分别对应AQI指数、当日AQI排名和PM2.5值。
这里的数据分析,数据分析主要是通过可视化的方法得到图像进行分析。
(1)天津空气质量指数年表
在码air_tianjin_2019_AQI.py
通过导入pyecharts库绘制趋势图。
首先,通读获取的数据:
df=PD . read _ CSV(‘ air _ Tianjin _ 2019 . CSV ‘,header=None,names=[‘ Date \ ‘,\’Quality_grade\ ‘,\’AQI\ ‘,\’AQI_rank\ ‘,\’PM\’])
然后获取日期和AQI数据,并将它们存储在列表变量中,以便于绘制图像:
attr=df[‘Date’]v1=df[‘AQI’]
然后定义标题,绘制曲线,保存为网页:
Line=Line(\’2019天津AQI年度图\ ‘,title _ pos=’ center ‘,title _ top=’ 18 ‘,宽度=800,高度=400)
line.add(\’\ ‘,attr,v1,mark_line=[‘average’],is_fill=True,area_color=\’#000\ ‘,area_opacity=0.3,mark _ point=[‘ max \ ‘,\’min\’],mark_point_symbol=\’circle\ ‘,mark_point_symbolsize=25)
Line.render(\’2019年天津AQI.html年度图表\ ‘)
最终效果图如下
图2-2 2019年天津AQI年度图表
根据图2-2,2019年天津市空气质量峰值分别在1月、2月、11月和12月,即主要集中在春季和冬季。考虑到春夏两季可能通风不畅,节日多,节日烟花太多,汽车人的移动导致空气质量变差。
(2)天津月平均空气质量指数图
air _天津_2019_AQI_month.py
为了反映月平均空气质量的变化,我们绘制了月平均趋势图。
第一件事是读取数据:
df=PD . read _ CSV(‘ air _ Tianjin _ 2019 . CSV ‘,header=None,names=[‘ Date \ ‘,\’Quality_grade\ ‘,\’AQI\ ‘,\’AQI_rank\ ‘,\’PM\’])
然后获取日期和空气质量数据,并对其进行处理以删除日期中间的“-”:
dom=df[[‘Date ‘,’ AQI’]]
列表1=
对于dom中的j[‘ Date ‘]:
time=j.split(‘-‘)[1]
list1.append(时间)
df[‘月’]=列表1
然后计算月平均空气质量。
month _ message=df . group by([‘ month ‘])
month_com=month_message[‘AQI’]。agg([‘mean’])
month _ com . reset _ index(in place=True)
month _ com _ last=month _ com . sort _ index
Attr=[\'{}\ ‘。format(stri(I)’ month ‘)表示范围(1,13)中的I]
v1=NP . array(month _ com _ last[‘ mean ‘])
v1=[\'{}\ ‘。v1]中I的格式(int(i))
然后画一个趋势图:
Line=Line(\’2019天津月度AQI图\ ‘,title _ pos=’ center ‘,title _ top=’ 18 ‘,宽度=800,高度=400)
line.add(\’\ ‘,attr,v1,mark_point=[\’max\ ‘,\’min\’])
Line.render(\’2019天津月度AQI Chart.html \ ‘)
最终效果图如下:
图2-3 2019年天津月度AQI图
(3)天津市季度空气质量指数方框图
在码air _天津_2019_AQI_season.py
绘制天津市季度空气质量箱线图。步骤如下:
读取已爬网数据:
df=PD . read _ CSV(‘ air _ Tianjin _ 2019 . CSV ‘,header=None,names=[‘ Date \ ‘,\’Quality_grade\ ‘,\’AQI\ ‘,\’AQI_rank\ ‘,\’PM\’])
然后按照月份分成四个季度:
dom=df[[‘Date ‘,’ AQI’]]
data=[[],]
dom1、dom2、dom3、dom4=数据
对于I,j in zip(dom[‘Date’],dom[‘AQI’]):
time=i.split(‘-‘)[1]
如果时间在[’01 ‘,’ 02 ‘,’ 03′]:
dom1.append(j)
elif时间为[’04 ‘,’ 05 ‘,’ 06′]:
追加(j)
elif时间为[’07 ‘,’ 08 ‘,’ 09′]:
dom3.append(j)
else:
dom4.append(j)
然后定义箱线图的标题、横坐标和纵坐标,绘制箱线图:
Box plot=Box plot(\ ‘ 2019年天津季度AQI箱线图’,title _ pos=’ center ‘,title _ top=’ 18 ‘,宽度=800,高度=400)
X_axis=[‘第一季度’,’第二季度’,’第三季度’,’第四季度’]
y_axis=[dom1,dom2,dom3,dom4]
_ ya xis=box plot . prepare _ data(y _ axis)
boxplot.add(\’\ ‘,x_axis,_yaxis)
Boxplot.render(\’2019年Tianjin.html季度AQI方框图\ ‘)
最终绘制的箱线图可以看到如下:
图2-4 2019年天津季度AQI方框图
KNN算法预测的整个代码流程分为两部分。一部分是建立test.py程序,将CSV文件转换成符合标准的TXT数据进行存储;另一部分是K-means聚类的数据分类。
(1)数据生成TXT
在代码test.py中
首先读入数据,存取款清单是X和y,同时因为y的值是汉字,所以需要转换成数字:
#文件的名称
filename 1=\ ‘ air _ Tianjin _ 2019 . CSV \ ‘
#禁用科学计数
pd.set_option(‘float_format ‘,lambda x :“% . 3f ‘ % x ‘)
NP . set _ print options(threshold=NP . INF)
#读取数据
data=pd.read_csv(文件名1)
rows,clos=data.shape
#数据帧到数组
DataArray=data.values
Y=
y=DataArray[:1]
对于y:中的I
我==’好的’
y .追加(0)
我==’光污染’
Y.append(1)
我==’非常好’
Y.append(2)
我==’严重污染’
Y.append(3)
I==’重度污染’ 3360
Y.append(4)
打印(Y)
print(len(y))
X=DataArray[:2:5]
打印(X[1])
然后将存储的数据写入TXT,注意换行并加上“,”:
对于范围内的I(len(Y)):
f=打开(\’data.txt\ ‘,\’a \ ‘)
对于范围(3):中的j
f.write(str(X[i][j]) \ ‘,\ ‘)
f.write(str(Y[i]) \’\n\ ‘)
打印(\’data.txt数据生成\ ‘)
(2)K均值聚类
代码在KNearestNeighbor.py中
首先,读取数据:
Def Dataset (self,filename,split,trainingset,testset) 3360 # Load DataSet Split以某个值为边界对训练和测试进行分类。
用打开(文件名,’ r ‘)作为CSV文件:
lines=csv.reader(csvfile) #读取所有的行
数据集=列表(行)#转化成列表
对于范围内的x(len(dataset)-1):
对于范围(3):中的y
数据集[x][y]=float(数据集[x][y])
if random.random split: #将所有数据加载到火车和试验中
trainingSet.append(dataset[x])
else:
testSet.append(dataset[x])
定义计算距离的函数
定义计算距离(自身、测试数据、训练数据、长度): #计算距离
距离=0 #长度表示维度数据共有几维
对于范围(长度):内的x
距离=功率((int(testdata[x])-traindata[x]),2)
返回math.sqrt(距离)
对每个数据文档测量其到每个质心的距离,并把它归到最近的质心的类。
def getNeighbors(self,trainingSet,testInstance,k): #返回最近的k个边距
距离=
length=len(testInstance)-1
对于范围内的x(len(训练集)): #对训练集的每一个数计算其到测试集的实际距离
距离=自我。计算距离(测试实例,trainingSet[x],长度)
打印(‘训练集:{}-距离:{}’.格式(训练集[x],dist))
距离。append((定型集[x],距离))
距离。sort(key=operator。item getter(1))#把距离从小到大排列
打印(距离)
邻居=
对于范围: #中的x排序完成后取前k个距离
neighbors.append(距离[x][0])
打印(邻居)
返回邻居
决策函数,根据少数服从多数,决定归类到哪一类:
def getResponse(自己、邻居): #根据少数服从多数,决定归类到哪一类
classVotes={}
对于范围内的x(len(neighbors)):
响应=邻居[x][-1] #统计每一个分类的多少
classVotes:中的如果响应
classVotes[response]=1
else:
classVotes[response]=1
打印(classVotes.items)
已排序投票=已排序(类别投票。items,key=operator.itemgetter(1),reverse=True) #reverse按降序的方式排列
返回已排序的投票数[0][0]
计算模型准确度
def getAccuracy(自我、测试集、预测): #准确率计算
正确=0
对于范围内的x(len(测试集)):
if testSet[x][-1]==预测值[x]: #预测值是预测的和测试设备实际的比对
正确=1
打印(‘共有{}个预测正确,共有{}个测试数据。格式(正确,len(testSet)))
return(correct/float(len(testSet)))* 100.0
接着整个模型的训练,种子数定义等等:
定义运行(自身):
培训设置=
测试集=
分割=0.75
self.loadDataset(r’data.txt ‘,split,trainingSet,testSet) #数据划分
打印(‘训练集: ‘字符串(len(训练集)))
打印(‘测试集: ‘ str(len(testSet)))
#生成预测
预测=
k=5 #取最近的5个数据
#正确=
对于范围内的x(镜头(测试集)): #对所有的测试集进行测试
邻居=自己。获取邻居(训练集,测试集[x],k) #找到5个最近的邻居
结果=自己。getresponse(邻居)#找这5个邻居归类到哪一类
预测。追加(结果)
#打印(“预测:”回复(预测))
# print(‘predicted=’ repr(result)’,actual=’ repr(testSet[x][-1]))
#打印(正确)
准确度=自我获得准确度(测试集,预测)
打印(‘ Accuracy: ‘ repr(accuracy) ‘% ‘)
最终模型的准确度为90%。
图2-10 模型运行结果图
源码地址:https://潘。百度一下。com/s/1 VCC
提取码:qvy7
作者简介:李秋键,CSDN博客专家,CSDN达人课作者。硕士在读于中国矿业大学,开发有龙头龙头网站竞赛获奖等。

其他教程

宫崎骏的新电影阿雅与魔女会在中国播出吗(宫崎骏的所有作品电影魔女)

2022-9-2 1:13:01

其他教程

巧妙的机械动图(10个经典机械动图)

2022-9-2 1:15:10

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索