失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > Python小程序(8)--空气质量指数计算+爬虫获取空气质量指数+数据分析

Python小程序(8)--空气质量指数计算+爬虫获取空气质量指数+数据分析

时间:2020-11-07 14:49:15

相关推荐

Python小程序(8)--空气质量指数计算+爬虫获取空气质量指数+数据分析

版本1.0

'''功能:AQI计算版本:1.0'''def cal_linear(iaqi_lo,iaqi_hi,bp_lo,bp_hi,cp):'''范围缩放'''iaqi = (iaqi_hi-iaqi_hi)*(cp-bp_lo)/(bp_hi-bp_lo) + iaqi_loreturn iaqidef cal_pm_iaqi(pm_val):'''计算pm2.5的iaqi'''if 0 <= pm_val <36:iaqi = cal_linear(0,50,0,35,pm_val )elif 36 <= pm_val <76:iaqi = cal_linear(50, 100, 35, 75, pm_val)elif 76 <= pm_val <116:iaqi = cal_linear(100, 150, 75, 115, pm_val)elif 116 <= pm_val < 151:iaqi = cal_linear(150, 200, 115, 150, pm_val)elif 151 <= pm_val < 251:iaqi = cal_linear(200, 300, 150, 250, pm_val)elif 251 <= pm_val < 351:iaqi = cal_linear(300, 400, 250, 350, pm_val)elif 351 <= pm_val < 501:iaqi = cal_linear(400, 500, 350, 500, pm_val)return iaqidef cal_co_iaqi(co_val):'''计算co的iaqi'''if 0 <= co_val <3:iaqi = cal_linear(0,50,0,2,co_val )elif 3 <= co_val <5:iaqi = cal_linear(50, 100, 2, 4, co_val)elif 5 <= co_val <15:iaqi = cal_linear(100, 150, 4, 14, co_val)elif 15 <= co_val < 25:iaqi = cal_linear(150, 200, 14, 24, co_val)elif 25 <= co_val < 37:iaqi = cal_linear(200, 300, 24, 36, co_val)elif 37 <= co_val < 49:iaqi = cal_linear(300, 400, 36, 48, co_val)elif 49 <= co_val < 61:iaqi = cal_linear(400, 500, 48, 60, co_val)return iaqidef cal_aqi(param_list):'''AQI计算'''pm_val = param_list[0]co_val = param_list[1]pm_iaqi = cal_pm_iaqi(pm_val)co_iaqi = cal_co_iaqi(co_val)iaqi_list = []iaqi_list.append(pm_iaqi)iaqi_list.append(co_iaqi)print(iaqi_list)aqi = max(iaqi_list)return aqidef main():print('请输入以下信息,用空格分割')input_str = input('(1)PM2.5 (2)CO:')str_list = input_str.split(' ')pm_val = float(str_list [0])co_val = float(str_list[1])param_list = []param_list.append(pm_val )param_list.append(co_val)#调用AQI计算函数aqi_val = cal_aqi(param_list )print('空气质量指数为:{}'.format(aqi_val))if __name__ == '__main__':main()

版本2.0

新增功能:

读取已经获取的JSON数据文件

• 并将AQI前5的数据输出到文件

列表排序

• list.sort(func)

func指定了排序的方法

• func可以通过lambda函数实现

'''功能:AQI计算版本:2.0'''import jsondef pricess_json_file(filepath):'''解码json文件'''f = open(filepath ,mode= 'r',encoding= 'utf-8')city_list = json.load(f)return city_listdef main():filepath = input('请输入json文件路径:')city_list = pricess_json_file(filepath)city_list.sort(key=lambda city:city['aqi']) #根据aqi排序top5_list = city_list [:5]f = open('top5_aqi.json',mode= 'w',encoding= 'utf-8')json.dump(top5_list ,f,ensure_ascii= False ) #写入文件f.close()print(city_list )if __name__ == '__main__':main()

版本3.0

读取已经获取的JSON数据文件

• 并将其转换成CSV文件

• CSV(Comma-Separated Values)是一种通用的、相对简单的文件格式

• 在商业和科学领域上广泛使用

• 规则

1. 以行为单位

2. 每行表示一条记录

3. 以英文逗号分割每列数据(如果数据为空,逗号也要保留)

4. 列名通常放置在文件第一行

import csv

• csv.writerow(list) 将列表中的元素写入文件的一行中

'''功能:AQI计算版本:3.0'''import jsonimport csvdef pricess_json_file(filepath):'''解码json文件'''f = open(filepath ,mode= 'r',encoding= 'utf-8')city_list = json.load(f)return city_listdef main():filepath = input('请输入json文件路径:')city_list = pricess_json_file(filepath)city_list.sort(key=lambda city:city['aqi']) #根据aqi排序lines = []#列名lines.append(list(city_list[0].keys()))for city in city_list:lines.append(list(city.values()))f = open('aqi.csv','w',encoding= 'utf-8',newline= '')writer = csv.writer(f)for line in lines:writer.writerow(line)f.close()if __name__ == '__main__':main()

版本4.0

根据输入的文件判断是JSON格式还是CSV格式,并进行相应的操作

文件操作补充:

CSV文件读取

imort csv

csv.reader() 将每行记录作为列表返回

• 使用with语句操作文件对象

使用with语句,不管在处理文件过程中是否发生异常,都能保证with语句执行完毕后关闭文件。不需要close()语句。

• os模块提供了与系统、目录操作相关的功能,不受平台的限制

'''功能:AQI计算版本:4.0'''import jsonimport csvimport osdef process_json_file(filepath):'''解码json文件'''# f = open(filepath ,mode= 'r',encoding= 'utf-8')# city_list = json.load(f)# return city_listwith open(filepath ,mode= 'r',encoding= 'utf-8') as f:city_list = json.load(f)print(city_list )def process_csv_file(filepath):'''处理csv文件'''with open(filepath ,mode= 'r',encoding= 'utf-8') as f:reader = csv.reader(f)for row in reader:print(','.join(row)) #行之间用,隔开def main():filepath = input('请输入文件路径:')filename,file_ext = os.path.splitext(filepath )if file_ext == '.json':process_json_file(filepath )elif file_ext == '.csv':process_csv_file(filepath)else:print('不支持的文件格式')if __name__ == '__main__':main()

版本5.0

为了能有效地提取并利用网络信息并工作提高效率,出现了网络爬虫

• 利用网络爬虫实时获取城市的空气质量

网络爬虫

自动抓取互联网信息的程序;利用互联网数据进行分析、开发产品

• 步骤:

1. 通过网络链接获取网页内容

2. 对获得的网页内容进行处理

requests模块

更多方法参考:http://docs.python-/

'''功能:爬虫/获取AQI版本:5.0'''import requestsdef get_html_text(url):'''返回url的文本'''r = requests.get(url,timeout=30)print(r.status_code) #判断是否成功打开网页return r.textdef main():city_pinyin = input('请输入城市的拼音:')url = 'http://pm25.in/'+city_pinyinurl_text = get_html_text(url) #获取网页‘审查元素’中的文本#浏览器中审查元素 找到所需数据的div位置#注意也要把空格复制进去 因为空格也占位置aqi_div = '''<div class="span12 data"><div class="span1"><div class="value">'''index = url_text.find(aqi_div) #获得aqi_div的起始序列号begin_index = index+len(aqi_div) #aqi数值的起始序列号end_index = begin_index + 2aqi = url_text [begin_index:end_index ]print('空气质量为:{}'.format(aqi))if __name__ == '__main__':main()

版本6.0

高效地解析和处理HTML,beautifulsoup4

BeautifulSoup

• 用于解析HTML或XML

• pip install beautifulsoup4

• import bs4

• 步骤

1. 创建BeautifulSoup对象

2. 查询节点

find,找到第一个满足条件的节点

find_all, 找到所有满足条件的节点

创建对象

• 创建BeautifulSoup对象

• bs = BeautifulSoup(

url,

html_parser, 指定解析器

enoding 指定编码格式(确保和网页编码格式一致)

)

查找节点

• <a href=‘a.html’ class=‘a_link’>next page</a>

• 可按节点类型、属性或内容访问

• 按类型查找节点

• bs.find_all(‘a’)

• 按属性查找节点

• bs.find_all(‘a’, href=‘a.html’)

• bs.find_all(‘a’, href=‘a.html’, string=‘next page’)

• bs.find_all(‘a’, class_=‘a_link’)

• 注意:是class_

• 或者bs.find_all(‘a’, {‘class’:’a_link’})

网站审查元素:找到div节点

'''功能:爬虫/获取AQI版本:6.0'''import requestsfrom bs4 import BeautifulSoupdef get_city_aqi(city_pinyin):'''获取城市的AQI'''url = 'http://pm25.in/' + city_pinyinr = requests.get(url,timeout=30)soup = BeautifulSoup(r.text,'lxml')div_list = soup.find_all('div',class_='span1')city_aqi = []for i in range(8): #一共有8个span1div_content = div_list[i]#print(div_content )caption = div_content.find('div',class_='caption').text.strip() #.text.strip()去掉空格变成字符串格式value = div_content.find('div',class_='value').text.strip()city_aqi.append((caption,value))return city_aqidef main():city_pinyin = input('请输入城市的拼音:')city_aqi = get_city_aqi(city_pinyin )print(city_aqi )if __name__ == '__main__':main()

版本7.0

功能:利用beautifulsoup4获取所有城市的空气质量

1. 首先获取所有的城市列表,及对应的url

2. 根据url获取城市的空气质量(6.0程序)

'''功能:爬虫/获取AQI版本:6.0'''import requestsfrom bs4 import BeautifulSoupdef get_city_aqi(city_pinyin):'''获取城市的AQI'''url = 'http://pm25.in/' + city_pinyinr = requests.get(url,timeout=30)soup = BeautifulSoup(r.text,'lxml')div_list = soup.find_all('div',class_='span1')city_aqi = []for i in range(8): #一共有8个span1div_content = div_list[i]#print(div_content )caption = div_content.find('div',class_='caption').text.strip() #.text.strip()去掉空格变成字符串格式value = div_content.find('div',class_='value').text.strip()city_aqi.append((caption,value))return city_aqidef get_all_cities():'''获取所有城市'''url = 'http://pm25.in/'city_list = []r = requests.get(url, timeout=30)soup = BeautifulSoup(r.text, 'lxml')city_div = soup.find_all('div',class_='bottom')[1] #因为url中有两个bottom,我们要的是第二个,所以用【1】city_link_list = city_div.find_all('a')for city_link in city_link_list : #遍历所有a节点#print(city_link) #<a href="/abazhou">阿坝州</a> ...city_name = city_link.text#print(city_name) #阿坝州 ...city_pinyin = city_link['href'][1:] #获取href属性,[1:]是不取前面的/city_list.append((city_name,city_pinyin))return city_listdef main():city_list = get_all_cities()for city in city_list:city_name = city[0]city_pinyin = city[1]city_aqi = get_city_aqi(city_pinyin )print(city_name,city_aqi )if __name__ == '__main__':main()

版本8.0

新增功能:将获取的所有城市空气质量保存成CSV数据文件

'''功能:爬虫/获取AQI版本:8.0'''import requestsfrom bs4 import BeautifulSoupimport csvdef get_city_aqi(city_pinyin):'''获取城市的AQI'''url = 'http://pm25.in/' + city_pinyinr = requests.get(url,timeout=30)soup = BeautifulSoup(r.text,'lxml')div_list = soup.find_all('div',class_='span1')city_aqi = []for i in range(8): #一共有8个span1div_content = div_list[i]#print(div_content )caption = div_content.find('div',class_='caption').text.strip() #.text.strip()去掉空格变成字符串格式value = div_content.find('div',class_='value').text.strip()city_aqi.append(value)return city_aqidef get_all_cities():'''获取所有城市'''url = 'http://pm25.in/'city_list = []r = requests.get(url, timeout=30)soup = BeautifulSoup(r.text, 'lxml')city_div = soup.find_all('div',class_='bottom')[1] #因为url中有两个bottom,我们要的是第二个,所以用【1】city_link_list = city_div.find_all('a')for city_link in city_link_list : #遍历所有a节点#print(city_link) #<a href="/abazhou">阿坝州</a> ...city_name = city_link.text#print(city_name) #阿坝州 ...city_pinyin = city_link['href'][1:] #获取href属性,[1:]是不取前面的/city_list.append((city_name,city_pinyin))return city_listdef main():city_list = get_all_cities()header = ['city','AQI','PM2.5/1h','PM10/1h','CO/1h','NO2/1h','O3/1h','O3/8h','SO2/1h']with open('china_city_aqi.csv','w',encoding='utf-8',newline= '')as f:writer = csv.writer(f)writer.writerow(header)#for city in city_list :#输出索引号,查看写入进度for i,city in enumerate(city_list):if (i+1) % 10 == 0:print('已处理{}行记录。共{}条记录'.format(i+1,len(city_list)) )city_name = city[0]city_pinyin = city[1]city_aqi = get_city_aqi(city_pinyin )#print(city_name,city_aqi )row = [city_name] + city_aqi #city_name是字符串,city_aqi是列表,进行拼接操作writer.writerow(row)if __name__ == '__main__':main()

版本9.0

新增功能:• 利用Pandas进行数据处理分析

Pandas的数据操作

Pandas

• 一个强大的分析结构化数据的工具集

• 基础是NumPy,提供了高性能矩阵的运算

• 应用,数据挖掘,数据分析

• 如,学生成绩分析、股票数据分析等。

• 提供数据清洗功能

Pandas的数据结构

Series

• 类似一维数组的对象

• 通过list构建Series

• ser_obj = pd.Series(range(10))

• 由数据和索引组成

• 索引在左,数据在右

• 索引是自动创建的

• 获取数据和索引

• ser_obj.index, ser_obj.values

• 预览数据

• ser_obj.head(n) #获取前n个数据

Series (续)

• 通过索引获取数据

• ser_obj[idx]

• 索引与数据的对应关系仍保持在数组运算的结果中

• 通过dict构建Series

• name属性

• ser_obj.name, ser_obj.index.name

DataFrame

• 类似多维数组/表格数据 (如,excel, R中的data.frame)

• 每列数据可以是不同的类型,what about ndarray?

• 索引包括列索引和行索引

DataFrame

• 通过ndarray构建DataFrame

• 通过dict构建DataFrame

• 通过列索引获取列数据(Series类型 )

• df_obj[col_idx] 或 df_obj.col_idx

• 增加列数据,类似dict添加key-value

• df_obj[new_col_idx] = data

• 删除列

• del df_obj[col_idx]

索引操作

• DataFrame索引

• 列索引

• df_obj[‘label’]

• 不连续索引

• df_obj[[‘label1’, ‘label2’]]

排序

• sort_index,索引排序

• 对DataFrame操作时注意轴方向

• 按值排序

• sort_values(by=‘label’)

常用的统计计算

• sum, mean, max, min…

• axis=0 按列统计,axis=1按行统计

• skipna 排除缺失值, 默认为True

• idmax, idmin, cumsum

统计描述

• describe 产生多个统计数据

'''功能:数据分析版本:9.0'''import pandas as pddef main():aqi_data = pd.read_csv('china_city_aqi.csv')#print(aqi_data.head(5))#print(aqi_data['AQI']) #获取AQI列#print(aqi_data[['AQI','city']])print('基本信息')print(aqi_data.info())print('数据预览')print(aqi_data.head())#基本统计print('AQI最大值',aqi_data['AQI'].max())print('AQI最小值',aqi_data['AQI'].min())print('AQI平均值',aqi_data['AQI'].mean())#top10top10_cities = aqi_data.sort_values(by= ['AQI'],ascending= True).head(10) #ascending= True为升序,False为降序print('空气质量最好的10个城市:',top10_cities )#bottom10bottom10_cities = aqi_data.sort_values(by=['AQI'], ascending=True).tail(10) #tail取底部10个数据#bottom10_cities = aqi_data.sort_values(by=['AQI'], ascending=False ).head(10) # ascending= True为升序,False为降序print('空气质量最差的10个城市:', bottom10_cities)#保存在csv文件top10_cities.to_csv('top10_aqi.csv',index=False ) #index=False不输出索引号bottom10_cities.to_csv('bottom10_aqi.csv',index=False )if __name__ == '__main__':main()

版本10.0

新增功能:数据清洗;利用Pandas进行数据可视化

• 处理缺失数据

dropna() 丢弃缺失数据

fillna() 填充缺失数据

• 数据过滤

df[filter_condition] 依据filter_condition对数据进行过滤

Pandas数据可视化

Pandas提供了内建的绘图功能(基于matplotlib)

• plot(kind, x, y, title, figsize)

x, y 横纵坐标对应的数据列

title图像名称

figsize图像尺寸

• 保存图片

plt.savefig()

• 更多例子请参考:/pandas-docs/stable/visualization.html

'''版本:10.0'''import pandas as pdimport matplotlib.pyplot as plt#解决中文显示乱码plt.rcParams['font.sans-serif'] = ['SimHei'] #指定黑体plt.rcParams['axes.unicode_minus'] = Falsedef main():aqi_data = pd.read_csv('china_city_aqi.csv')#print(aqi_data.head(5))#print(aqi_data['AQI']) #获取AQI列#print(aqi_data[['AQI','city']])print('基本信息')print(aqi_data.info())print('数据预览')print(aqi_data.head())#数据清洗#只保留AQI大于0的数据filter_condition = aqi_data['AQI']>0clean_data = aqi_data[filter_condition]#基本统计print('AQI最大值',clean_data['AQI'].max())print('AQI最小值',clean_data['AQI'].min())print('AQI平均值',clean_data['AQI'].mean())#top50top50_cities = clean_data.sort_values(by= ['AQI'],ascending= True).head(50) #ascending= True为升序,False为降序print('空气质量最好的50个城市:',top50_cities )#bottom10bottom10_cities = clean_data.sort_values(by=['AQI'], ascending=True).tail(10) #tail取底部10个数据#bottom10_cities = clean_data.sort_values(by=['AQI'], ascending=False ).head(10) # ascending= True为升序,False为降序print('空气质量最差的10个城市:', bottom10_cities)#保存在csv文件# top10_cities.to_csv('top10_aqi.csv',index=False ) #index=False不输出索引号# bottom10_cities.to_csv('bottom10_aqi.csv',index=False )#数据可视化top50_cities.plot(kind = 'bar',x='city',y='AQI',title='空气质量最好的50个城市',figsize=(20,10)) #kind为图表类型 bar为柱状图##保存图片plt.savefig('top50_aqi_bar.png')plt.show()if __name__ == '__main__':main()

如果觉得《Python小程序(8)--空气质量指数计算+爬虫获取空气质量指数+数据分析》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。