(一)、選題的背景
由於疫情原因的影響,世界各地都因為新型冠狀病毒(簡稱新冠肺炎)而陷入種種危機。因此,對於現存全球的疫情數據我進行了一個爬取和一些數據分析,並作出數據可視化處理,更加直觀的查看出全球現存疫情的情況。
(二)、主題式網絡爬蟲設計方案
1.主題式網絡爬蟲名稱
全球疫情實施動態爬取
2.主題式網絡爬蟲爬取的內容與數據特征分析
爬取多國的當日新增確診,當日新增治愈,當日新增死亡,病死率以及累計治愈,從而作出分析。
3.主題式網絡爬蟲設計方案概述
使用爬蟲爬取【網易新聞 肺炎疫情實時動態播報】頁面信息,然后將爬取的數據存儲為csv格式文件,再讀取csv文件,對數據進行相應的處理,最后對處理后的數據進行可視化分析。
(三)、主題頁面的結構特征分析
1.主題頁面的結構與特征分析
爬取界面josn格式展示:
2.Htmls 頁面解析
josn格式可以觀察到每個數據都可以通過索引得到。通過字典索引即可得到需要數據
3.節點(標簽)查找方法與遍歷方法
通過data,keys()獲取字典鍵再對其索引遍歷,通過reaTree = data['areaTree'] 獲取各國數據,索引前先對data['areaTree'][1]進行分析數據的索引字符串,再通過遍歷對需要數據爬取添加。
(四)、網絡爬蟲程序設計
爬蟲程序主體要包括以下各部分,要附源代碼及較詳細注釋,並在每部分程序后面提供輸出結果的截圖。
1.數據爬取與采集
進入需要爬取的目標網址 https://wp.m.163.com/163/page/news/virus_report/index.html
通過響應network找到數據源如下:
(https://c.m.163.com/ug/api/wuhan/app/data/list-total?t=328093598837)
偽裝瀏覽器,headers如下:headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36 Edg/96.0.1054.62'})
使用requests庫對目標網址進行請求,打印響應碼:
源碼:
1 import requests # 請求庫 2 import json # 用於解析json數據 3 import pandas as pd # 數據分析庫 4 import time # 導入時間模塊 5 # ## 找到目標網址,偽裝瀏覽器,請求數據 6 url = 'https://c.m.163.com/ug/api/wuhan/app/data/list-total?t=328100359682' 7 headers = { 8 'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'} 9 req = requests.get(url, headers=headers) 10 print(req.status_code) # 響應碼 200為成功
截圖展示:
打印響應內容(這里不知道為什么響應內容只顯示在一行,但是並不影響操作):
使用Json模塊對響應內容進行初步解析
data_json = json.loads(req.text) #使用json.loads將json字符串轉化為字典
打印字典的key值源碼: 1 data_json = json.loads(req.text) 2 data_json.keys()
截圖展示:
可以看到我們需要的是其中的data數據,再次打印data查看結果。
源碼: 1 print(data_json['data'])
截圖展示:
有點混亂,可以看到其仍然為字典,再次打印data的key值,得到關鍵信息。
源碼: 1 print(data_json['data'].keys())
截圖展示:
前兩個和中國有關,第3、4個和更新時間有關,最后一個不太確定是啥,打印再看看。
源碼:1 print(data_json['data']['areaTree'])
截圖展示:
這次我們可以看到出現了很多國家的名字,按照猜測應該是對應網頁這塊
使用PrettyPrinter打印字典(PrettyPrinter格式化輸出字典)
源碼: 1 pp.pprint(data['areaTree'][0])
截圖展示:
可以看到areaTree的數據格式是list,里面每一個國家對應一個字典,而字典中又嵌套着字典。
(1)獲取areaTree數據
areaTree = data['areaTree']
(2)獲取數據源碼:
1 # 將提取數據的方法進行封裝 2 def get_data(data, info_list): 3 info = pd.DataFrame(data)[info_list] # 主要信息 4 today_data = pd.DataFrame([i['today'] for i in data]) # 提取today的數據 5 today_data.columns = ['today_' + i for i in today_data.columns] # 更改列名 6 total_data = pd.DataFrame([i['total'] for i in data]) # 提取total的數據 7 total_data.columns = ['total_' + i for i in total_data] # 更改列名 8 return pd.concat([info, today_data, total_data], axis=1) # 將info.today,total數據進行合並 9 today_world = get_data(areaTree, ['id', 'lastUpdateTime', 'name']) # 調用封裝的函數獲取數據 10 today_world.head()截圖展示:
存儲數據
源碼:
1 def save_data(data, name): 2 file_name = name + '_' + time.strftime('%Y_%m_%d', time.localtime(time.time())) + '.csv' 3 data.to_csv(file_name, sep=',', encoding='utf-8-sig') 4 print(file_name + ' 保存成功! ') 5 save_data(today_world, 'today_world')
截圖展示:
按照各國id,訪問各國的數據,並獲取json數據,提取各國的數據,然后寫入各國的名稱,然后合並數據。
源碼:
1 country_dict = {num: name for num, name in zip(today_world['id'], today_world['name'])} 2 start = time.time() 3 for country_id in country_dict: 4 try: 5 url = 'https://c.m.163.com/ug/api/wuhan/app/data/list-by-area-code?areaCode=' + country_id 6 req2 = requests.get(url, headers=headers) 7 data_json = json.loads(req2.text) 8 country_data = get_data(data_json['data']['list'], 'date') 9 country_data['name'] = country_dict[country_id] 10 if country_id == '9577772': 11 alltime_country = country_data 12 else: 13 alltime_country = pd.concat([alltime_country, country_data]) 14 print('-' * 20, country_dict[country_id], '抓取成功', country_data.shape, 15 '以獲取數據大小', alltime_country.shape, '累計耗時', round(time.time() - start), '-' * 20) 16 except: 17 print('-' * 20, country_dict[provience_id], '數據抓取失敗', '-' * 20)
截圖展示:
2.對數據進行清洗和處理
更換數據列名,將英文列名換為中文列名方便我們理解數據進行處理。
源碼:
1 td_wd = pd.read_csv('today_world_2021_12_26.csv') 2 ac = pd.read_csv('alltime_country_2021_12_26.csv') 3 4 name_dict = { 5 'id': '編號', 'lastUpdateTime': '更新時間', 'name': '名稱', 'today_confirm': '當日新增確診', 6 'today_suspect': '當日新增疑似', 'today_heal': '當日新增治愈', 'today_dead': '當日新增死亡', 'today_severe': '當日新增重症', 7 'today_storeConfirm': '當日現存確診', 'today_input': '當日新增輸入', 'total_confirm': '累計確診', 'total_suspect': '累計疑似', 8 'total_heal': '累計治愈', 'total_dead': '累計死亡', 'total_severe': '累計重症', 'total_input': '累計輸入' 9 } 10 11 td_wd.rename(columns=name_dict, inplace=True) 12 ac.rename(columns=name_dict, inplace=True) 13 td_wd.head()
截圖展示:
使用drop()方法刪除Unnamed: 0列,使用describe()方法查看對數據的描述:
源碼:
1 td_wd = td_wd.drop(columns=['Unnamed: 0']) 2 ac = ac.drop(columns=['Unnamed: 0']) 3 td_wd.describe()
截圖展示:
計算【當日現存確診】公式為:累計確診-累計治愈-累計死亡
計算【病死率】公式為:累計死亡/累計確診
通過數據描述可以發現NaN值特別多,那么我們可以計算一下每一列NaN值占多少
源碼:
1 td_wd['當日現存確診'] = td_wd['累計確診'] - td_wd['累計治愈'] - td_wd['累計死亡'] 2 td_wd['病死率'] = (td_wd['累計死亡'] / td_wd['累計確診']).apply(lambda x: format(x, '.2f')) 3 td_wd['病死率'] = td_wd['病死率'].astype('float') 4 ac['當日現存確診'] = ac['累計確診'] - ac['累計治愈'] - ac['累計死亡'] 5 ac['病死率'] = (ac['累計死亡'] / ac['累計確診']).apply(lambda x: format(x, '.2f')) 6 ac['病死率'] = ac['病死率'].astype('float') 7 print('統計nan值:') 8 td_wd_nan = td_wd.isnull().sum() / len(td_wd) 9 td_wd_nan.apply(lambda x: format(x, '.1%'))
截圖展示:
使用isnull()方法查看DataFrame數據的NaN值,並用sum()方法進行求和,除以總大小。
使用sort_values方法對DataFrame進行排序,排序方式以病死率,按降序方式,得到如下結果:
源碼: 1 td_wd.sort_values('病死率', ascending=False, inplace=True) 2 td_wd.head()
截圖展示:
將索引改為國家名稱:
td_wd.set_index('名稱',inplace=True)
並按累計確診進行再次排序,取出['累計確診','累計死亡','病死率']三列前10賦給新的變量:
源碼:
1 td_wd.set_index('名稱', inplace=True) # 索引改為國家名稱 2 wd_top10 = td_wd.sort_values('病死率', ascending=False)[:10] 3 wd_top10 = wd_top10[['累計確診', '累計死亡', '病死率']] 4 wd_top10
截圖展示:
3.數據分析與可視化
(1)從matplotlib可視化庫中導入pyplot
(2)指定plt.rcParams['font.sans-serif'] = ['SimHei'] #防止中文亂碼
(3)按照病死率對10位數據進行排序,並將['累計確診','累計死亡','病死率']三列分別作為每一張子圖,得到可視化結果源碼:
1 cn = [] 2 for i in wd_top10.index[:5]: 3 cn.append(i) 4 import matplotlib.pyplot as plt 5 plt.rcParams['font.sans-serif'] = ['SimHei'] 6 plt.rcParams['figure.dpi'] = 120 7 wd_top10.sort_values('病死率').plot.barh(subplots=True, layout=(1, 3), sharex=False, sharey=True, figsize=(7, 4)) 8 plt.show()
截圖展示:
爬取最近幾月內歷史數據。
經過適當處理后得到如下結果:
源碼:
1 hisc = {} 2 ac['date'] = ac['date'].apply(lambda x: x[-5:]) 3 ac
截圖展示:
可以看到一個國家對應最近倆月不同的行,這種數據結構不易處理,再將其國家名稱作為key值,存儲每一天的數據。
源碼:
1 for i in ac.index: 2 name = ac['名稱'][i] 3 if name not in hisc.keys(): 4 hisc[name] = [] 5 hisc[name].append(list(ac.loc[i])) 6 else: 7 hisc[name].append(list(ac.loc[i])) 8 ds1 = {} 9 q = 0 10 for i in cn: 11 if i not in ds1.keys(): 12 ds1[i] = [] 13 for j in hisc[i]: 14 ds1[i].append(j[0]) 15 else: 16 for j in hisc[i]: 17 ds1[i].append(j[0])
循環讀取數據的每一行,判斷當前行國家名在此字典key值是否存在,如果存在直接添加數據,不存在則創建值空列表再添加當前行數據。
查看數據以后,發現不同國家之間爬取到的數據是存在缺失值的,我們將不存在的日期去除,只保留當前所有國家存在日期的交集:
源碼:
1 d = 0 2 for i in cn: 3 d += 1 4 if d == 1: 5 p_a = ds1[i] 6 continue 7 else: 8 p_b = ds1[i] 9 p_a = set(p_a) & set(p_b) 10 ppd = list(p_a) 11 ds2 = {} 12 ppd.sort()
cn為國家名稱(由於數據太多,表現效果不是很理想,故只取病死率前5國家作為可視化分析的依據)
由於橫坐標軸顯示問題,將其文本旋轉60°,由於太過密集的原因,再將其設置為間隔顯示。
當日新增確診趨勢:
源碼:
1 s = 0 2 for i in cn: 3 for j in hisc[i]: 4 if j[0] in ppd: 5 if i not in ds2.keys(): 6 ds2[i] = [] 7 ds2[i].append(j[1]) 8 else: 9 ds2[i].append(j[1]) 10 ds2k = list(ds2.keys()) 11 for i in ds2k: 12 plt.plot(ppd, ds2[i]) 13 plt.xticks(rotation=60) # 橫坐標每個值旋轉60度 14 plt.xticks(range(0, len(ppd), 3)) 15 plt.legend(cn) 16 plt.title('當日新增確診') 17 plt.show()
當日新增治愈趨勢:
源碼:
1 s = 0 2 ds2 = {} 3 for i in cn: 4 for j in hisc[i]: 5 if j[0] in ppd: 6 if i not in ds2.keys(): 7 ds2[i] = [] 8 ds2[i].append(j[2]) 9 else: 10 ds2[i].append(j[2]) 11 ds2k = list(ds2.keys()) 12 for i in ds2k: 13 plt.plot(ppd, ds2[i]) 14 plt.xticks(rotation=60) # 橫坐標每個值旋轉60度 15 plt.xticks(range(0, len(ppd), 3)) 16 plt.legend(cn) 17 plt.title('當日新增治愈') 18 plt.show()
當日新增死亡趨勢:
源碼:
1 s = 0 2 ds2 = {} 3 for i in cn: 4 for j in hisc[i]: 5 if j[0] in ppd: 6 if i not in ds2.keys(): 7 ds2[i] = [] 8 ds2[i].append(j[3]) 9 else: 10 ds2[i].append(j[3]) 11 ds2k = list(ds2.keys()) 12 for i in ds2k: 13 plt.plot(ppd, ds2[i]) 14 plt.xticks(rotation=60) # 橫坐標每個值旋轉60度 15 plt.xticks(range(0, len(ppd), 3)) 16 plt.legend(cn) 17 plt.title('當日新增死亡') 18 plt.show()
病死率趨勢:
源碼:
1 s = 0 2 ds2 = {} 3 for i in cn: 4 for j in hisc[i]: 5 if j[0] in ppd: 6 if i not in ds2.keys(): 7 ds2[i] = [] 8 ds2[i].append(j[-1]) 9 else: 10 ds2[i].append(j[-1]) 11 ds2k = list(ds2.keys()) 12 for i in ds2k: 13 plt.plot(ppd, ds2[i]) 14 plt.xticks(rotation=60) # 橫坐標每個值旋轉60度 15 plt.xticks(range(0, len(ppd), 3)) 16 plt.legend(cn) 17 plt.title('病死率') 18 plt.show()
當日累計治愈:
源碼:
1 s = 0 2 ds2 = {} 3 for i in cn: 4 for j in hisc[i]: 5 if j[0] in ppd[-1]: 6 if i not in ds2.keys(): 7 ds2[i] = [] 8 ds2[i].append(j[7]) 9 else: 10 ds2[i].append(j[7]) 11 ds2k = list(ds2.keys()) 12 sd = [] 13 for i in ds2k: 14 sd.append(ds2[i][0]) 15 print(sd) 16 plt.bar(cn, sd) 17 plt.xticks(rotation=60) # 橫坐標每個值旋轉60度 18 plt.legend(cn) 19 plt.title('累計治愈') 20 plt.show()
截圖展示如下:
4.將以上各部分的代碼匯總,附上完整程序代碼
1 import requests # 請求庫 2 import json # 用於解析json數據 3 import pandas as pd # 數據分析庫 4 import time # 導入時間模塊 5 # 找到目標網址,偽裝瀏覽器,請求數據 6 url = 'https://c.m.163.com/ug/api/wuhan/app/data/list-total?t=328100359682' 7 8 headers = { 9 'user-agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36'} 10 11 req = requests.get(url, headers=headers) 12 print(req.status_code) # 響應碼 200為成功 13 14 # print(req.text) 15 # ## 使用Json模塊對響應內容進行初步解析 16 17 data_json = json.loads(req.text) # 使用json.loads將json字符串轉化為字典 18 ata_json.keys() 19 20 data = data_json['data'] 21 data.keys() 22 23 import pprint 24 25 pp = pprint.PrettyPrinter(indent=2) # 2個空格縮進 26 # pp.pprint(data['areaTree']) #查看data數據結構 27 28 # ## 世界各國實時數據爬取 29 30 # ### 獲取areaTree數據 31 32 areaTree = data['areaTree'] # 獲取各國數據 33 34 pp.pprint(data['areaTree'][0]) # 查看data['areaTree']數據格式 35 36 # ### 封裝函數並獲取數據 37 38 # 將提取數據的方法進行封裝 39 def get_data(data, info_list): 40 info = pd.DataFrame(data)[info_list] # 主要信息 41 42 today_data = pd.DataFrame([i['today'] for i in data]) # 提取today的數據 43 today_data.columns = ['today_' + i for i in today_data.columns] # 更改列名 44 45 total_data = pd.DataFrame([i['total'] for i in data]) # 提取total的數據 46 total_data.columns = ['total_' + i for i in total_data] # 更改列名 47 48 return pd.concat([info, today_data, total_data], axis=1) # 將info.today,total數據進行合並 49 50 today_world = get_data(areaTree, ['id', 'lastUpdateTime', 'name']) # 調用封裝的函數獲取數據 51 52 today_world.head() 53 54 # ### 封裝函數並存儲數據 55 56 def save_data(data, name): 57 file_name = name + '_' + time.strftime('%Y_%m_%d', time.localtime(time.time())) + '.csv' 58 data.to_csv(file_name, sep=',', encoding='utf-8-sig') 59 print(file_name + ' 保存成功! ') 60 61 save_data(today_world, 'today_world') # 調用函數保存數據 62 63 country_dict = {num: name for num, name in zip(today_world['id'], today_world['name'])} 64 65 start = time.time() 66 for country_id in country_dict: 67 try: 68 # 按照各國id,訪問各國的數據,並獲取json數據 69 url = 'https://c.m.163.com/ug/api/wuhan/app/data/list-by-area-code?areaCode=' + country_id 70 req2 = requests.get(url, headers=headers) 71 data_json = json.loads(req2.text) 72 73 # 提取各國的數據,然后寫入各國的名稱 74 country_data = get_data(data_json['data']['list'], 'date') 75 country_data['name'] = country_dict[country_id] 76 77 # 合並數據 78 if country_id == '9577772': 79 alltime_country = country_data 80 else: 81 alltime_country = pd.concat([alltime_country, country_data]) 82 print('-' * 20, country_dict[country_id], '抓取成功', country_data.shape, 83 '以獲取數據大小', alltime_country.shape, '累計耗時', round(time.time() - start), '-' * 20) 84 # time.sleep(5) 85 except: 86 print('-' * 20, country_dict[provience_id], '數據抓取失敗', '-' * 20) 87 88 save_data(alltime_country, 'alltime_country') 89 90 # ## 數據處理 91 92 # ### 更換數據列名 93 94 td_wd = pd.read_csv('today_world_2021_12_26.csv') 95 ac = pd.read_csv('alltime_country_2021_12_26.csv') 96 97 name_dict = { 98 'id': '編號', 'lastUpdateTime': '更新時間', 'name': '名稱', 'today_confirm': '當日新增確診', 99 'today_suspect': '當日新增疑似', 'today_heal': '當日新增治愈', 'today_dead': '當日新增死亡', 'today_severe': '當日新增重症', 100 'today_storeConfirm': '當日現存確診', 'today_input': '當日新增輸入', 'total_confirm': '累計確診', 'total_suspect': '累計疑似', 101 'total_heal': '累計治愈', 'total_dead': '累計死亡', 'total_severe': '累計重症', 'total_input': '累計輸入' 102 } 103 104 td_wd.rename(columns=name_dict, inplace=True) 105 ac.rename(columns=name_dict, inplace=True) 106 td_wd.head() 107 108 # ### 數據描述 109 110 td_wd = td_wd.drop(columns=['Unnamed: 0']) 111 ac = ac.drop(columns=['Unnamed: 0']) 112 td_wd.describe() 113 114 td_wd['當日現存確診'] = td_wd['累計確診'] - td_wd['累計治愈'] - td_wd['累計死亡'] 115 td_wd['病死率'] = (td_wd['累計死亡'] / td_wd['累計確診']).apply(lambda x: format(x, '.2f')) 116 td_wd['病死率'] = td_wd['病死率'].astype('float') 117 118 ac['當日現存確診'] = ac['累計確診'] - ac['累計治愈'] - ac['累計死亡'] 119 ac['病死率'] = (ac['累計死亡'] / ac['累計確診']).apply(lambda x: format(x, '.2f')) 120 ac['病死率'] = ac['病死率'].astype('float') 121 122 print('統計nan值:') 123 124 td_wd_nan = td_wd.isnull().sum() / len(td_wd) 125 126 td_wd_nan.apply(lambda x: format(x, '.1%')) 127 128 td_wd.sort_values('病死率', ascending=False, inplace=True) 129 td_wd.head() 130 131 td_wd.set_index('名稱', inplace=True) # 索引改為國家名稱 132 wd_top10 = td_wd.sort_values('病死率', ascending=False)[:10] 133 wd_top10 = wd_top10[['累計確診', '累計死亡', '病死率']] 134 wd_top10 135 136 cn = [] 137 for i in wd_top10.index[:5]: 138 cn.append(i) 139 140 # ## 數據可視化 141 142 import matplotlib.pyplot as plt 143 144 plt.rcParams['font.sans-serif'] = ['SimHei'] 145 plt.rcParams['figure.dpi'] = 120 146 147 wd_top10.sort_values('病死率').plot.barh(subplots=True, layout=(1, 3), sharex=False, sharey=True, figsize=(7, 4)) 148 plt.show() 149 150 ac.describe() 151 152 print('統計nan值:') 153 154 ac_nan = ac.isnull().sum() / len(ac) 155 156 ac_nan.apply(lambda x: format(x, '.1%')) 157 158 hisc = {} # 存儲最近幾天歷史數據的字典 159 ac['date'] = ac['date'].apply(lambda x: x[-5:]) 160 ac 161 162 for i in ac.index: 163 name = ac['名稱'][i] 164 if name not in hisc.keys(): 165 hisc[name] = [] 166 hisc[name].append(list(ac.loc[i])) 167 else: 168 hisc[name].append(list(ac.loc[i])) 169 170 # cn = list(hisc.keys()) 171 172 ds1 = {} 173 174 q = 0 175 for i in cn: 176 if i not in ds1.keys(): 177 ds1[i] = [] 178 for j in hisc[i]: 179 ds1[i].append(j[0]) 180 else: 181 for j in hisc[i]: 182 ds1[i].append(j[0]) 183 184 d = 0 185 for i in cn: 186 d += 1 187 if d == 1: 188 p_a = ds1[i] 189 continue 190 else: 191 p_b = ds1[i] 192 p_a = set(p_a) & set(p_b) 193 194 ppd = list(p_a) 195 ds2 = {} 196 ppd.sort() 197 198 s = 0 199 for i in cn: 200 for j in hisc[i]: 201 if j[0] in ppd: 202 if i not in ds2.keys(): 203 ds2[i] = [] 204 ds2[i].append(j[1]) 205 else: 206 ds2[i].append(j[1]) 207 208 ds2k = list(ds2.keys()) 209 210 for i in ds2k: 211 plt.plot(ppd, ds2[i]) 212 plt.xticks(rotation=60) # 橫坐標每個值旋轉60度 213 plt.xticks(range(0, len(ppd), 3)) 214 plt.legend(cn) 215 plt.title('當日新增確診') 216 plt.show() 217 218 s = 0 219 ds2 = {} 220 for i in cn: 221 for j in hisc[i]: 222 if j[0] in ppd: 223 if i not in ds2.keys(): 224 ds2[i] = [] 225 ds2[i].append(j[2]) 226 else: 227 ds2[i].append(j[2]) 228 ds2k = list(ds2.keys()) 229 for i in ds2k: 230 plt.plot(ppd, ds2[i]) 231 plt.xticks(rotation=60) # 橫坐標每個值旋轉60度 232 plt.xticks(range(0, len(ppd), 3)) 233 plt.legend(cn) 234 plt.title('當日新增治愈') 235 plt.show() 236 237 s = 0 238 ds2 = {} 239 for i in cn: 240 for j in hisc[i]: 241 if j[0] in ppd: 242 if i not in ds2.keys(): 243 ds2[i] = [] 244 ds2[i].append(j[3]) 245 else: 246 ds2[i].append(j[3]) 247 ds2k = list(ds2.keys()) 248 for i in ds2k: 249 plt.plot(ppd, ds2[i]) 250 plt.xticks(rotation=60) # 橫坐標每個值旋轉60度 251 plt.xticks(range(0, len(ppd), 3)) 252 plt.legend(cn) 253 plt.title('當日新增死亡') 254 plt.show() 255 256 s = 0 257 ds2 = {} 258 for i in cn: 259 for j in hisc[i]: 260 if j[0] in ppd: 261 if i not in ds2.keys(): 262 ds2[i] = [] 263 ds2[i].append(j[-1]) 264 else: 265 ds2[i].append(j[-1]) 266 ds2k = list(ds2.keys()) 267 for i in ds2k: 268 plt.plot(ppd, ds2[i]) 269 plt.xticks(rotation=60) # 橫坐標每個值旋轉60度 270 plt.xticks(range(0, len(ppd), 3)) 271 plt.legend(cn) 272 plt.title('病死率') 273 plt.show() 274 275 s = 0 276 ds2 = {} 277 for i in cn: 278 for j in hisc[i]: 279 if j[0] in ppd[-1]: 280 if i not in ds2.keys(): 281 ds2[i] = [] 282 ds2[i].append(j[7]) 283 else: 284 ds2[i].append(j[7]) 285 ds2k = list(ds2.keys()) 286 sd = [] 287 for i in ds2k: 288 sd.append(ds2[i][0]) 289 print(sd) 290 plt.bar(cn, sd) 291 plt.xticks(rotation=60) # 橫坐標每個值旋轉60度 292 plt.legend(cn) 293 plt.title('累計治愈') 294 plt.show()
(五)、總結
1.經過對主題數據的分析與可視化,可以得到哪些結論?是否達到預期的目標?
從以上數據可以看到也門人口基數少,但卻是病死率最高的國家。秘魯的新增確診和新增治愈波動都比較大,有可能是因為人口基數的原因,同時可能是由於政策上的原因導致疫情二次擴散,不過及時解決了問題,同時也說明了秘魯治療肺炎的能力也不差,好在病死率不高。
聖馬丁島的病死率也不低。從累計治愈人數來看 秘魯>聖馬丁島>也門>蒙特塞拉特>毛利亞尼亞。總的來說,對主題數據的分析與可視化,還是達到了預期目標。
(89556>61>23>10>6)
2.在完成此設計過程中,得到哪些收獲?以及要改進的建議?
通過本次Python爬蟲設計,掌握了許多編程技巧。在不斷進步的過程中,收獲了許多新的知識,實用性也非常好,對於以后不懂編程很難混有極大的科普價值,當然也有一定的實用性!
數據處理過程中,DataFrame雖然好用但不是非常靈活,配合字典和列表構成新的數據格式,可以繪制出想要的可視化效果