【每天學點Python】案例八:空氣質量指數計算


V1.0功能:AQI計算

案例描述:

案例分析:

  • 實現步驟:
    1. 實現每種污染物對應的AQI函數,一個輸入參數,即Cp
    2. 實現線性縮放函數,5個輸入參數

上機實驗:

 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的數據輸出到文件

上機實驗:

 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文件

上機實驗:

 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格式,並進行相應的操作

上機實驗:

 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增加功能:網絡爬蟲

案例描述:

  • 為了能有效地提取並利用網絡信息並提供工作效率,出現了網絡爬蟲
  • 利用網絡爬蟲實時獲取城市的空氣質量

上機實驗:

 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

 


V5.0

案例描述:

  • 為了能有效地提取並利用網絡信息並工作提高效率。出現了網絡爬蟲
  • 利用網絡爬蟲實時獲取城市的空氣質量
  • 高效地解析和處理HTML,beautifulsoup4

上機實驗:

 

補充說明:

 

1. 網頁解析

  • 結構化解析
  • DOM(Document Object Model),樹形結構

2.BeautifulSoup解析網頁

  • 用於解析HTML或XML
  • pip install beautifulsoup4
  • import bs4
  • 步驟
    1. 創建BeautifulSoup對象
    2. 查詢節點
      • find,找到第一個滿足條件的節點
      • find_all,找到所有滿足條件的節點
  • 創建對象
    • 創建BeautifulSoup對象
1 bs = BeautifulSoup(
2     url,
3     html_parser, 指定解析器
4     enoding        指定編碼格式(確保和網頁編碼格式一致)      
5 )

 

        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM