异常处理python 空气质量问题_Python入门案例(八):空气质量指数(AQI)计算

一、空气质量指数计算V1.0

主要知识点:分支结构、函数、异常处理

# -*- coding:utf-8 -*-

"""@author:Angel@file:AQI_V1.0.py@time:2018/11/28 14:29@1.0功能:AQI计算"""

def cal_linear(iaqi_lo, iaqi_hi, bp_lo, bp_hi, cp):

# 线性缩放

iaqi = (iaqi_hi - iaqi_lo) * (cp - bp_lo) / (bp_hi - bp_lo) +iaqi_lo

return iaqi

def 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)

else:

pass

return iaqi

def 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)

else:

pass

return iaqi

def 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)

AQI = max(iaqi_list)

return AQI

def 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('空气质量指数(AQI):{}'.format(aqi_val))

if __name__ == '__main__':

main()

二、空气质量指数计算V2.0

主要知识点:JSON文件格式及操作:JSON是一种轻量级数据交换格式,可以对复杂数据进行表达和存储,易于阅读和理解。数据保存在键值对中,键值对之间由逗号分隔,花括号用于保存键值对数据组成的对象,方括号用户保存键值对数据组成的数组;采用对象、数组方式组织起来的键值对可以表示任何结构的数据

JSON库是处理JSON数据格式的Python标准库,两个过程:编码(encoding),将Python数据类型转换成JSON格式的过程;解码(decoding),从JSON格式中解析数据对应到Python数据类型的过程

# -*- coding:utf-8 -*-

"""@author:Angel@file:AQI_V2.0.py@time:2018/11/28 14:29@1.0功能:AQI计算@2.0功能:读取已经获取的JSON数据文件,并将AQI前5的数据输出到文件"""

import json

def process_json_file(filepath):

# 解码JSON文件

f = open(filepath, mode='r', encoding='utf-8')

city_list = json.load(f)

return city_list

def main():

filepath = input('请输入JSON文件名称:')

city_list = process_json_file(filepath)

city_list.sort(key=lambda city: city['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()

if __name__ == '__main__':

main()

三、空气质量指数计算V3.0

主要知识点:CSV是一种通用的、相对简单的文件格式,以行为单位,每行表示一条记录,以英文逗号分隔每列数据,列名通常放置在文件第一行

# -*- coding:utf-8 -*-

"""@author:Angel@file:AQI_V3.0.py@time:2018/11/28 14:29@1.0功能:AQI计算@2.0功能:读取已经获取的JSON数据文件,并将AQI前5的数据输出到文件@3.0功能:读取已经获取的JSON数据文件,并将其转换成CSV文件"""

import json

import csv

def process_json_file(filepath):

# 解码JSON文件

f = open(filepath, mode='r', encoding='utf-8')

city_list = json.load(f)

return city_list

def main():

filepath = input('请输入JSON文件名称:')

city_list = process_json_file(filepath)

city_list.sort(key=lambda city: city['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()

四、空气质量指数计算V4.0

主要知识点:os模块:提供了与系统、目录操作相关的功能,不受平台的限制

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

# -*- coding:utf-8 -*-

"""@author:Angel@file:AQI_V4.0.py@time:2018/11/28 14:29@1.0功能:AQI计算@2.0功能:读取已经获取的JSON数据文件,并将AQI前5的数据输出到文件@3.0功能:读取已经获取的JSON数据文件,并将其转换成CSV文件@4.0功能:根据输入的文件判断是JSON格式还是CSV格式,并进行相应的操作"""

import json

import csv

import os

def process_json_file(filepath):

# 处理JSON文件

with 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', newline='') 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':

# json文件

process_json_file(filepath)

elif file_ext == '.csv':

# CSV文件

process_csv_file(filepath)

else:

print('不支持该文件格式!')

if __name__ == '__main__':

main()

五、空气质量指数计算V5.0

主要知识点:网络爬虫是自助抓取互联网信息的程序:通过网络链接获取网页内容,对获得的网页内容进行处理

requests模块:一个简洁且简单的处理HTTP请求的工具,支持丰富的链接访问功能,包括URL获取,HTTP会话,cookie记录等。

# -*- coding:utf-8 -*-

"""@author:Angel@file:AQI_V5.0.py@time:2018/11/28 14:29@1.0功能:AQI计算@2.0功能:读取已经获取的JSON数据文件,并将AQI前5的数据输出到文件@3.0功能:读取已经获取的JSON数据文件,并将其转换成CSV文件@4.0功能:根据输入的文件判断是JSON格式还是CSV格式,并进行相应的操作@5.0功能:利用网络爬虫实时获取城市的空气质量指数"""

import requests

def get_html_text(url):

# 返回URL的文本

r = requests.get(url, timeout=30)

# print(r.status_code)

return r.text

def main():

city_pinyin = input('请输入城市拼音:')

url = 'http://pm25.in/' + city_pinyin

url_text = get_html_text(url)

# print(url_text)

aqi_div = '''

'''

index = url_text.find(aqi_div)

begin_index = index + len(aqi_div)

end_index = begin_index + 3

aqi_val = url_text[begin_index: end_index]

print('空气质量为:{}'.format(aqi_val))

if __name__ == '__main__':

main()

六、空气质量指数计算V6.0

主要知识点:BeautifulSoup解析网页:用于解析HTML或XML

# -*- coding:utf-8 -*-

"""@author:Angel@file:AQI_V6.0.py@time:2018/11/28 14:29@1.0功能:AQI计算@2.0功能:读取已经获取的JSON数据文件,并将AQI前5的数据输出到文件@3.0功能:读取已经获取的JSON数据文件,并将其转换成CSV文件@4.0功能:根据输入的文件判断是JSON格式还是CSV格式,并进行相应的操作@5.0功能:利用网络爬虫实时获取城市的空气质量指数@6.0功能:利用beautifulsoup4获取所有城市的空气质量"""

import requests

from bs4 import BeautifulSoup

def get_city_aqi(city_pinyin):

# 解析URL,获取城市的AQI

url = 'http://pm25.in/' + city_pinyin

r = 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):

div_content = div_list[i]

caption = div_content.find('div', {'class': 'caption'}).text.strip() # strip()去空格

value = div_content.find('div', {'class': 'value'}).text.strip()

city_aqi.append((caption, value))

return city_aqi

def main():

city_pinyin = input('请输入城市拼音:')

city_aqi = get_city_aqi(city_pinyin)

print('空气质量为:{}'.format(city_aqi))

if __name__ == '__main__':

main()

七、空气质量指数计算V7.0

主要知识点:BeautifulSoup库的使用

# -*- coding:utf-8 -*-

"""@author:Angel@file:AQI_V7.0.py@time:2018/11/28 14:29@1.0功能:AQI计算@2.0功能:读取已经获取的JSON数据文件,并将AQI前5的数据输出到文件@3.0功能:读取已经获取的JSON数据文件,并将其转换成CSV文件@4.0功能:根据输入的文件判断是JSON格式还是CSV格式,并进行相应的操作@5.0功能:利用网络爬虫实时获取城市的空气质量指数@6.0功能:利用beautifulsoup4获取所有城市的空气质量@7.0功能:获取所有城市空气质量数据"""

import requests

from bs4 import BeautifulSoup

def get_city_aqi(city_pinyin):

# 解析URL,获取城市的AQI

url = 'http://pm25.in/' + city_pinyin

r = 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):

div_content = div_list[i]

caption = div_content.find('div', {'class': 'caption'}).text.strip() # strip()去空格

value = div_content.find('div', {'class': 'value'}).text.strip()

city_aqi.append((caption, value))

return city_aqi

def 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]

city_link_list = city_div.find_all('a')

for city_link in city_link_list:

city_name = city_link.text

city_pinyin = city_link['href'][1:]

city_list.append((city_name, city_pinyin))

return city_list

def 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()

八、空气质量指数计算V8.0

主要知识点:BeautifulSoup和CSV结合,实现完整的网络爬虫

# -*- coding:utf-8 -*-

"""@author:Angel@file:AQI_V8.0.py@time:2018/11/28 14:29@1.0功能:AQI计算@2.0功能:读取已经获取的JSON数据文件,并将AQI前5的数据输出到文件@3.0功能:读取已经获取的JSON数据文件,并将其转换成CSV文件@4.0功能:根据输入的文件判断是JSON格式还是CSV格式,并进行相应的操作@5.0功能:利用网络爬虫实时获取城市的空气质量指数@6.0功能:利用beautifulsoup4获取所有城市的空气质量@7.0功能:获取所有城市空气质量数据@8.0功能:将获取的所有城市空气质量保存成CSV数据文件"""

import requests

from bs4 import BeautifulSoup

import csv

def get_city_aqi(city_pinyin):

# 解析URL,获取城市的AQI

url = 'http://pm25.in/' + city_pinyin

r = 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):

div_content = div_list[i]

# caption = div_content.find('div', {'class': 'caption'}).text.strip() # strip()去空格

value = div_content.find('div', {'class': 'value'}).text.strip()

city_aqi.append(value)

return city_aqi

def 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]

city_link_list = city_div.find_all('a')

for city_link in city_link_list:

city_name = city_link.text

city_pinyin = city_link['href'][1:]

city_list.append((city_name, city_pinyin))

return city_list

def 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 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)

row = [city_name] + city_aqi

writer.writerow(row)

if __name__ == '__main__':

main()

九、空气质量指数计算V9.0

主要知识点:pandas模块:强大的分析结构化数据的工具集,基础是numpy,提高了高性能矩阵的运算,主要应用于数据分析和数据挖掘,提供数据清洗功能

# -*- coding:utf-8 -*-

"""@author:Angel@file:AQI_V9.0.py@time:2018/11/28 14:29@1.0功能:AQI计算@2.0功能:读取已经获取的JSON数据文件,并将AQI前5的数据输出到文件@3.0功能:读取已经获取的JSON数据文件,并将其转换成CSV文件@4.0功能:根据输入的文件判断是JSON格式还是CSV格式,并进行相应的操作@5.0功能:利用网络爬虫实时获取城市的空气质量指数@6.0功能:利用beautifulsoup4获取所有城市的空气质量@7.0功能:获取所有城市空气质量数据@8.0功能:将获取的所有城市空气质量保存成CSV数据文件@9.0功能:利用pandas进行数据处理分析"""

import pandas as pd

def main():

aqi_data = pd.read_csv('china_city_aqi.csv')

print('基本信息:')

print(aqi_data.info())

print('数据预览:')

print(aqi_data.head(5))

# print(aqi_data[['city', 'AQI']])

# 基本统计

print('AQI最大值', aqi_data['AQI'].max())

print('AQI最小值', aqi_data['AQI'].min())

print('AQI均值', aqi_data['AQI'].mean())

# top10

top10_cities = aqi_data.sort_values(by=['AQI']).head(10) # 默认升序排列

print('空气质量最好的10个城市:')

print(top10_cities)

# bottom10

# bottom10_cities = aqi_data.sort_values(by=['AQI']).tail(10)

bottom10_cities = aqi_data.sort_values(by=['AQI'], ascending=False).head(10)

print('空气质量最差的10个城市:')

print(bottom10_cities)

# 保存CSV文件

top10_cities.to_csv('top10_aqi.csv', index=False)

bottom10_cities.to_csv('bottom10_aqi.csv', index=False)

if __name__ == '__main__':

main()

十、空气质量指数计算V10.0

主要知识点:用pandas模块进行数据可视化

数据清洗

# -*- coding:utf-8 -*-

"""@author:Angel@file:AQI_V10.0.py@time:2018/11/28 14:29@1.0功能:AQI计算@2.0功能:读取已经获取的JSON数据文件,并将AQI前5的数据输出到文件@3.0功能:读取已经获取的JSON数据文件,并将其转换成CSV文件@4.0功能:根据输入的文件判断是JSON格式还是CSV格式,并进行相应的操作@5.0功能:利用网络爬虫实时获取城市的空气质量指数@6.0功能:利用beautifulsoup4获取所有城市的空气质量@7.0功能:获取所有城市空气质量数据@8.0功能:将获取的所有城市空气质量保存成CSV数据文件@9.0功能:利用pandas进行数据处理分析@10.0功能:数据清洗,利用pandas进行数据可视化"""

import pandas as pd

import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif'] = ['SimHei']

plt.rcParams['axes.unicode_minus'] = False

def main():

aqi_data = pd.read_csv('china_city_aqi.csv')

print('基本信息:')

print(aqi_data.info())

print('数据预览:')

print(aqi_data.head(5))

# print(aqi_data[['city', 'AQI']])

# 数据清洗,只保留AQI大于0的数据

filter_condition = aqi_data['AQI'] > 0

clean_aqi_data = aqi_data[filter_condition]

# 基本统计

print('AQI最大值', clean_aqi_data['AQI'].max())

print('AQI最小值', clean_aqi_data['AQI'].min())

print('AQI均值', clean_aqi_data['AQI'].mean())

# top50

top50_cities = clean_aqi_data.sort_values(by=['AQI']).head(50) # 默认升序排列

top50_cities.plot(kind='bar', x='city', y='AQI', title='空气质量最好的50个城市', figsize=(20, 10))

# 图片保存

plt.savefig('top50_AQI_bar.png')

plt.show()

if __name__ == '__main__':

main()

图形如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值