Python入门案例(八):空气质量指数(AQI)计算

浏览: 2463

一、空气质量指数计算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 = '''<div class="span12 data">
<div class="span1">
<div class="value">
'''
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()

图形如下:

image.png

推荐 0
本文由 花花_Angel 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册