【每天学点Python】案例八:空气质量指数计算

时间:2021-05-07 22:26:04

V1.0功能:AQI计算

案例描述:

【每天学点Python】案例八:空气质量指数计算

【每天学点Python】案例八:空气质量指数计算

案例分析:

【每天学点Python】案例八:空气质量指数计算

【每天学点Python】案例八:空气质量指数计算

  • 实现步骤:
    1. 实现每种污染物对应的AQI函数,一个输入参数,即Cp
    2. 实现线性缩放函数,5个输入参数

上机实验:

【每天学点Python】案例八:空气质量指数计算【每天学点Python】案例八:空气质量指数计算
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 # author: Kevin.Wang
 4 # time  : 2018/10/16
 5 
 6 
 7 """
 8     作者:王鑫正
 9     版本:1.0
10     日期:2018/10/16
11     功能:AQI计算
12 """
13 
14 
15 def cal_linear(iaqi_lo, iaqi_hi, bp_lo, bp_hi, cp):
16     """
17         范围缩放
18     """
19     iaqi = (iaqi_hi - iaqi_lo) * (cp - bp_lo) / (bp_hi - bp_lo) + iaqi_lo
20     return iaqi
21 
22 
23 def cal_pm_iaqi(pm_val):
24     """
25         计算PM2.5的IAQI
26     """
27     if 0 <= pm_val < 35:
28         iaqi = cal_linear(0, 50, 0, 35, pm_val)
29     elif 35 <= pm_val < 75:
30         iaqi = cal_linear(50, 100, 35, 75, pm_val)
31     elif 75 <= pm_val < 115:
32         iaqi = cal_linear(100, 150, 75, 115, pm_val)
33     else:
34         pass
35 
36     return iaqi
37 
38 
39 def cal_co_iaqi(co_val):
40     """
41         计算CO的IAQI
42     """
43     if 0 <= co_val < 3:
44         iaqi = cal_linear(0, 50, 0, 3, co_val)
45     elif 3 <= co_val < 5:
46         iaqi = cal_linear(50, 100, 2, 4, co_val)
47 
48     else:
49         pass
50 
51     return iaqi
52 
53 
54 def cal_aqi(para_list):
55     """
56         AQI计算
57     """
58     pm_val = para_list[0]
59     co_val = para_list[1]
60 
61     pm_iaqi = cal_pm_iaqi(pm_val)
62     co_iaqi = cal_co_iaqi(co_val)
63 
64     iaqi_list = []
65     iaqi_list.append(pm_iaqi)
66     iaqi_list.append(co_iaqi)
67 
68     aqi = max(iaqi_list)
69     return aqi
70 
71 
72 def main():
73     """
74         主函数
75     """
76     print('请输入以下信息,用空格分隔')
77     input_str = input('(1)PM2.5 (2)CO:')
78     str_list = input_str.split(' ')
79     pm_val = float(str_list[0])
80     co_val = float(str_list[1])
81 
82     para_list = []
83     para_list.append(pm_val)
84     para_list.append(co_val)
85 
86     # 调用AQI计算函数
87     aqi_val = cal_aqi(para_list)
88 
89     print('空气质量指数为:{}'.format(aqi_val))
90 
91 
92 if __name__ == '__main__':
93     main()
View Code

 


V2.0功能:json文件读取

案例描述:

  • 读取已经获取的JSON数据文件
  • 并将AQI前5的数据输出到文件

上机实验:

【每天学点Python】案例八:空气质量指数计算【每天学点Python】案例八:空气质量指数计算
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 # author: Kevin.Wang
 4 # time  : 2018/10/16
 5 
 6 
 7 """
 8     作者:王鑫正
 9     版本:1.0
10     日期:2018/10/16
11     功能:2.0 JSON文件读取
12 """
13 import json
14 
15 
16 def process_json_file(filepath):
17     """
18         解码json文件
19     """
20     f = open(filepath,mode='r',encoding='utf-8')
21     city_list = json.load(f)
22     return city_list
23 
24 
25 def main():
26     """
27         主函数
28     """
29     filepath = input('请输出json文件名称:')
30     city_list = process_json_file(filepath)
31     city_list.sort(key=lambda city:city['aqi'])
32     top5_list = city_list[:5]
33 
34     f = open('top5_aqi.json',mode='w',encoding='utf-8')
35     json.dump(top5_list,f,ensure_ascii=False)
36     f.close()
37 
38 
39 if __name__ == '__main__':
40     main()
View Code

补充说明:

1. JSON格式

  • JSON(JavaScript Object Notation)是一种轻量级数据交换格式
  • 可以对复杂数据进行表达和存储,易于阅读和理解
  • 规则
    1. 数据保存在键值对中
    2. 键值对之间由逗号分隔
    3. 花括号用于保存键值对数据组成的对象
    4. 方括号用于保存键值对数据组成的数组
  • 采用对象、数组方式组织起来的键值对可以表示任何结构的数据
  • JSON格式是互联网上主要使用的复杂数据格式之一
 1 [
 2     {
 3         "aqi":47,
 4         "area":"北京",
 5         "position_name":"万寿西宫",
 6         "time_point":"2017-07-29"
 7     },
 8     {
 9         "aqi": 63,
10         "area": "北京",
11         "position_name": "叮铃",
12         "time_point": "2017-07-29"
13     }
14 ]

2. JSON库

  • JSON库是处理JSON格式的Python标准库
  • 两个过程:
    • 编码(encoding),将Python数据类型转换成JSON格式的过程
    • 解码(decoding),从JSON格式中解析数据对用到Python数据类型的过程
  • 函数:
    • dumps(),将Python数据类型转换为JSON格式
    • loads(),将JSON格式字符串转换为Python数据类型
    • dump(),与dumps()功能一致,输出到文件
    • load(),与loads()功能一致,从文件读入

3. 列表排序

  • list.sort(func)
    • func指定了排序的方法
    • func可以通过lambda函数实现

4. JSON格式转换

  • 百度搜索“json format”,可以转换

 


V3.0功能:读取JSON数据文件并将其转换为CSV文件

案例描述:

  • 读取已经获取的JSON数据文件
  • 并将其转换为CSV文件

上机实验:

【每天学点Python】案例八:空气质量指数计算【每天学点Python】案例八:空气质量指数计算
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 # author: Kevin.Wang
 4 # time  : 2018/10/16
 5 
 6 
 7 """
 8     作者:王鑫正
 9     版本:1.0
10     日期:2018/10/16
11     功能:3.0 JSON文件读取,转换为CSV文件
12 """
13 import json
14 import csv
15 
16 
17 def process_json_file(filepath):
18     """
19         解码json文件
20     """
21     f = open(filepath,mode='r',encoding='utf-8')
22     city_list = json.load(f)
23     return city_list
24 
25 
26 def main():
27     """
28         主函数
29     """
30     filepath = input('请输出json文件名称:')
31     city_list = process_json_file(filepath)
32     city_list.sort(key=lambda city:city['aqi'])
33 
34     lines = []
35     # 列名
36     lines.append(list(city_list[0].keys()))
37     for city in city_list:
38         lines.append(list(city.values()))
39 
40     f = open('aqi.csv','w',encoding='utf-8',newline='')
41     writer = csv.writer(f)
42     for line in lines:
43         writer.writerow(line)
44 
45 
46 if __name__ == '__main__':
47     main()
View Code

补充说明:

1. CSV格式

  • CSV(Comma-Separated Values)是一种通用的、相对简单的文件格式
  • 在商业和科学领域上广泛使用
  • 规则
    1. 以行为单位
    2. 每行表示一条记录
    3. 以英文逗号分割每列数据(如果数据为空,逗号也要保留)
    4. 列名通常放置在文件第一行
  • import csv
  • csv.writerow(list)将列表中的元素写入文件的一行中

 


V4.0增加功能:判断输入的文件判断是JSON格式还是CSV格式,并进行相应的操作

案例描述:

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

上机实验:

【每天学点Python】案例八:空气质量指数计算【每天学点Python】案例八:空气质量指数计算
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 # author: Kevin.Wang
 4 # time  : 2018/10/16
 5 
 6 
 7 """
 8     作者:王鑫正
 9     版本:1.0
10     日期:2018/10/16
11     功能:4.0 JSON文件读取,转换为CSV文件
12 """
13 import json
14 import csv
15 import os
16 
17 
18 def process_json_file(filepath):
19     """
20         解码json文件
21     """
22     # f = open(filepath,mode='r',encoding='utf-8')
23     # city_list = json.load(f)
24     # return city_list
25 
26     with open(filepath,mode='r',encoding='utf-8') as f:
27         city_list = json.load(f)
28     print(city_list)
29 
30 
31 def process_csv_file(filepath):
32     """
33         处理csv文件
34     """
35     with open(filepath, mode='r', encoding='utf-8', newline='') as f:
36         reader = csv.reader(f)
37         for row in reader:
38             print(', '.join(row))   # 将列表里每一行的函数用‘, ’连接起来
39 
40 
41 def main():
42     """
43         主函数
44     """
45     filepath = input('请输入文件名称:')
46     filename, file_ext = os.path.splitext(filepath)
47 
48     if file_ext == '.json':
49         # json文件
50         process_json_file(filepath)
51     elif file_ext == '.csv':
52         # csv文件
53         process_csv_file(filepath)
54     else:
55         print('不支持的文件格式!')
56 
57 
58 if __name__ == '__main__':
59     main()
View Code

补充说明:

1. CSV补充

  • CSV文件读取
1 import csv
2 csv.reader()    将没行记录作为列表返回
  • 使用with语句操作文件对象
1 with open('file name') as somefile:
2     for line in somefile:
3         print(line)
  • 使用with语句,不管在处理文件过程中是否发生异常,都能保证with语句执行完毕后关闭文件,不需要close()语句。

2. os模块

  • os模块提供了与系统、目录操作相关的功能,不受平台的限制
函数 含义
os.remove() 删除文件
os.makedirs() 创建多层目录
os.rmdir() 删除单级目录
os.rename() 重命名文件
os.path.isfile() 判断是否为文件
os.path.isdir() 判断是否为目录
os.path.join() 连接目录,如path1连接path2为path1/path2
os.path.splitext() 将文件分割成文件名与扩展名,如分割tmp.txt为tmp和.txt

 


 V5.0增加功能:网络爬虫

案例描述:

  • 为了能有效地提取并利用网络信息并提供工作效率,出现了网络爬虫
  • 利用网络爬虫实时获取城市的空气质量

上机实验:

【每天学点Python】案例八:空气质量指数计算【每天学点Python】案例八:空气质量指数计算
 1 #!/usr/bin/env python
 2 # -*- coding:utf-8 -*-
 3 # author: Kevin.Wang
 4 # time  : 2018/10/16
 5 
 6 
 7 """
 8     作者:王鑫正
 9     版本:1.0
10     日期:2018/10/16
11     功能:4.0 JSON文件读取,转换为CSV文件
12 """
13 
14 import requests
15 
16 
17 def get_html_text(url):
18     """
19 
20     """
21     r = requests.get(url, timeout=30)
22     # print(r.status_code)
23     return r.text
24 
25 
26 def main():
27     """
28         主函数
29     """
30     city_pinyin = input('请输入城市拼音:',)
31     url = 'http://pm25.in/' + city_pinyin
32     url_text = get_html_text(url)
33     # print(url_text)
34     aqi_div = '''<div class="span12 data">
35         <div class="span1">
36           <div class="value">
37             '''
38     index = url_text.find(aqi_div)
39     begin_index = index + len(aqi_div)
40     end_index = begin_index + 2
41     aqi_val = url_text[begin_index:end_index]
42     print('空气质量为:{}'.format(aqi_val))
43 
44 
45 if __name__ == '__main__':
46     main()
View Code

补充说明:

1. 网络爬虫

  • 自动抓取互联网信息的程序;利用互联网数据进行分析、开发产品
  • 步骤:
    1. 通过网络链接获取网页内容
    2. 对获得的网页内容进行处理

2. requests模块

  • requests模块是一个简洁且简单的处理HTTP请求的工具
  • 支持非常丰富的链接访问功能,包括URL获取,HTTP会话,Cookie记录等
  • requests网页请求
函数 含义
get() 对应HTTP的GET方式
post() 对应HTTP的POST方式,用于传递用户数据
  • requests对象属性
函数 含义
status_code HTTP请求的返回状态,200表示连接成功,400表示失败
text HTTP相应内容的字符串形式,即url对应的页面内容

3. 网页常用操作

  • 查看对应代码,右键选择“审查元素”
  • 打开网页源码,Ctrl+U