一、空气质量指数计算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()
图形如下: