Python爬取全球各國疫情實時動態及數據分析


(一)、選題的背景

由於疫情原因的影響,世界各地都因為新型冠狀病毒(簡稱新冠肺炎)而陷入種種危機。因此,對於現存全球的疫情數據我進行了一個爬取和一些數據分析,並作出數據可視化處理,更加直觀的查看出全球現存疫情的情況。

(二)、主題式網絡爬蟲設計方案

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雖然好用但不是非常靈活,配合字典和列表構成新的數據格式,可以繪制出想要的可視化效果

 


免責聲明!

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



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