绘制疫情可视化地图
前言
在当前世界新冠疫情的背景下,我想知道世界各国具体有多少患者,以及它们的排行
数据来源
https://news.qq.com/zt2020/page/feiyan.htm#/global
爬虫设计方案
1.数据的爬取
对网页元素分析,可以发现地区在span标签中,数据在tr标签的td标签中
(1)爬取¶
from bs4 import BeautifulSoup import requests import pandas as pd import json def request_cqputure(url): #尝试爬取网站返回文本形式 try : r = requests.get(url,timeout = 30)#抓取页面数据时间30秒 r.raise_for_status() #如果状态不是200引发异常 r.encoding = r.apparent_encoding #更改编码为utf-8 return r.text except: return "false" #1.调用函数爬取并解析 url="https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist" a=request_cqputure(url) soup=BeautifulSoup(a) data = json.loads(a) data
(2)数据保存
a=[] b=[] for i in data["data"]: a.append(i['name']) a.append(i['continent']) a.append(i['y']) a.append(i['date']) a.append(i['isUpdated']) a.append(i['confirmAdd']) a.append(i['confirmAddCut']) a.append(i['confirm']) a.append(i['suspect']) a.append(i['dead']) a.append(i['heal']) a.append(i['nowConfirm']) b.append(a) a=[] print(b)
import csv with open("E:\\疫情.csv","w",encoding="utf-8") as fi: writer=csv.writer(fi) writer.writerow(["name","continent","year","date","isUpdated","confirmAdd","confirmAddCut","confirm", "suspect","dead","heal","continent","nowConfirm"])#给每列的数据列名 for a in b: writer.writerow(a) fi.close()
2.数据清洗与处理
(1)因为数据量较大,所以我们可以通过pandas库来查看数据是否有异常、缺失、重复
import numpy as np import scipy as sp import pandas as pd import matplotlib import seaborn as sns import pylab as pl import matplotlib.pyplot as plt from sklearn.linear_model import LogisticRegression from sklearn import linear_model yq = pd.read_csv('E:\\疫情.csv') print('世界疫情',yq.shape,) yq.columns.tolist()
(2)通过查看数据的简要信息,数据正常,数据的最小值也不是负数
yq.head() #查看数据总体信息 print('世界疫情:',yq.info(),)
(3)通过pandas库的isnull()方法查看是否有空值
yq[yq.isnull().values==True] print('\n各列的空值情况如下:') yq.isnull().sum()
3.数据可视化分析
yq20 = yq.head(21) # 取出中国及前20个国家的数据 plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['axes.unicode_minus'] = False # 作图: plt.title('累计确诊人数') # plt.xlabel('国家') # plt.ylabel('人数') x = yq20['name'] y = yq20['confirm'] # plt.ylim(0, max(int_top20['累计确诊'])) plt.xticks(rotation=65) plt.bar(range(len(x)), y,color='r',tick_label=x) plt.show()
import json import requests import jsonpath from pyecharts.charts import Map,Geo from pyecharts import options as opts from pyecharts.globals import GeoType,RenderType # 1.目标网站 url='https://api.inews.qq.com/newsqa/v1/automation/foreign/country/ranklist' # 2.请求资源 resp=requests.get(url) # 3.提取数据 # 类型转换 json-->dict data=json.loads(resp.text) name = jsonpath.jsonpath(data,"$..name") # print(name) confirm = jsonpath.jsonpath(data,"$..confirm") # print(confirm) data_list = zip(name,confirm) # print(list(data_list)) # 4.可视化 matplotlib 和 pyecharts map = Map().add(series_name='世界疫情分布', data_pair=data_list, maptype='world', is_map_symbol_show=False ) map.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) map.render('世界疫情分布情况2.html')
'Burkina Faso':'布基纳法索', 'Bangladesh':'孟加拉国', 'Bulgaria':'保加利亚', 'The Bahamas':'巴哈马', 'Bosnia and Herz.':'波斯尼亚和黑塞哥维那', 'Belarus':'白俄罗斯', 'Belize':'伯利兹', 'Bermuda':'百慕大', 'Bolivia':'玻利维亚', 'Brazil':'巴西', 'Brunei':'文莱', 'Bhutan':'不丹', 'Botswana':'博茨瓦纳', 'Central African Rep.':'中非', 'Canada':'加拿大', 'Switzerland':'瑞士', 'Chile':'智利', 'China':'中国', 'Ivory Coast':'象牙海岸', 'Cameroon':'喀麦隆', 'Dem. Rep. Congo':'刚果民主共和国', 'Congo':'刚果', 'Colombia':'哥伦比亚', 'Costa Rica':'哥斯达黎加', 'Cuba':'古巴', 'N. Cyprus':'北塞浦路斯', 'Cyprus':'塞浦路斯', 'Czech Rep.':'捷克', 'Germany':'德国', 'Djibouti':'吉布提', 'Denmark':'丹麦', 'Algeria':'阿尔及利亚', 'Ecuador':'厄瓜多尔', 'Egypt':'埃及', 'Eritrea':'厄立特里亚', 'Spain':'西班牙', 'Estonia':'爱沙尼亚', 'Ethiopia':'埃塞俄比亚', 'Finland':'芬兰', 'Fiji':'斐', 'Falkland Islands':'福克兰群岛', 'France':'法国', 'Gabon':'加蓬', 'United Kingdom':'英国', 'Georgia':'格鲁吉亚', 'Ghana':'加纳', 'Guinea':'几内亚', 'Gambia':'冈比亚', 'Guinea Bissau':'几内亚比绍', 'Eq. Guinea':'赤道几内亚', 'Greece':'希腊', 'Greenland':'格陵兰', 'Guatemala':'危地马拉', 'French Guiana':'法属圭亚那', 'Guyana':'圭亚那', 'Honduras':'洪都拉斯', 'Croatia':'克罗地亚', 'Haiti':'海地', 'Hungary':'匈牙利', 'Indonesia':'印度尼西亚', 'India':'印度', 'Ireland':'爱尔兰', 'Iran':'伊朗', 'Iraq':'伊拉克', 'Iceland':'冰岛', 'Israel':'以色列', 'Italy':'意大利', 'Jamaica':'牙买加', 'Jordan':'约旦', 'Japan':'日本', 'Japan':'日本本土', 'Kazakhstan':'哈萨克斯坦', 'Kenya':'肯尼亚', 'Kyrgyzstan':'吉尔吉斯斯坦', 'Cambodia':'柬埔寨', 'Korea':'韩国', 'Kosovo':'科索沃', 'Kuwait':'科威特', 'Lao PDR':'老挝', 'Lebanon':'黎巴嫩', 'Liberia':'利比里亚', 'Libya':'利比亚', 'Sri Lanka':'斯里兰卡', 'Lesotho':'莱索托', 'Lithuania':'立陶宛', 'Luxembourg':'卢森堡', 'Latvia':'拉脱维亚', 'Morocco':'摩洛哥', 'Moldova':'摩尔多瓦', 'Madagascar':'马达加斯加', 'Mexico':'墨西哥', 'Macedonia':'马其顿', 'Mali':'马里', 'Myanmar':'缅甸', 'Montenegro':'黑山', 'Mongolia':'蒙古', 'Mozambique':'莫桑比克', 'Mauritania':'毛里塔尼亚', 'Malawi':'马拉维', 'Malaysia':'马来西亚', 'Namibia':'纳米比亚', 'New Caledonia':'新喀里多尼亚', 'Niger':'尼日尔', 'Nigeria':'尼日利亚', 'Nicaragua':'尼加拉瓜', 'Netherlands':'荷兰', 'Norway':'挪威', 'Nepal':'尼泊尔', 'New Zealand':'新西兰', 'Oman':'阿曼', 'Pakistan':'巴基斯坦', 'Panama':'巴拿马', 'Peru':'秘鲁', 'Philippines':'菲律宾', 'Papua New Guinea':'巴布亚新几内亚', 'Poland':'波兰', 'Puerto Rico':'波多黎各', 'Dem. Rep. Korea':'朝鲜', 'Portugal':'葡萄牙', 'Paraguay':'巴拉圭', 'Qatar':'卡塔尔', 'Romania':'罗马尼亚', 'Russia':'俄罗斯', 'Rwanda':'卢旺达', 'W. Sahara':'西撒哈拉', 'Saudi Arabia':'沙特阿拉伯', 'Sudan':'苏丹', 'S. Sudan':'南苏丹', 'Senegal':'塞内加尔', 'Solomon Is.':'所罗门群岛', 'Sierra Leone':'塞拉利昂', 'El Salvador':'萨尔瓦多', 'Somaliland':'索马里兰', 'Somalia':'索马里', 'Serbia':'塞尔维亚', 'Suriname':'苏里南', 'Slovakia':'斯洛伐克', 'Slovenia':'斯洛文尼亚', 'Sweden':'瑞典', 'Swaziland':'斯威士兰', 'Syria':'叙利亚', 'Chad':'乍得', 'Togo':'多哥', 'Thailand':'泰国', 'Tajikistan':'塔吉克斯坦', 'Turkmenistan':'土库曼斯坦', 'East Timor':'东帝汶', 'Trinidad and Tobago':'特里尼达和多巴哥', 'Tunisia':'突尼斯', 'Turkey':'土耳其', 'Tanzania':'坦桑尼亚', 'Uganda':'乌干达', 'Ukraine':'乌克兰', 'Uruguay':'乌拉圭', 'United States':'美国', 'Uzbekistan':'乌兹别克斯坦', 'Venezuela':'委内瑞拉', 'Vietnam':'越南', 'Vanuatu':'瓦努阿图', 'West Bank':'西岸', 'Yemen':'也门', 'South Africa':'南非', 'Zambia':'赞比亚', 'Zimbabwe':'津巴布韦' } map = Map().add(series_name='世界疫情分布', data_pair=data_list, maptype='world', name_map=nameMap, is_map_symbol_show=False ) map.set_series_opts(label_opts=opts.LabelOpts(is_show=False)) map.render('世界疫情分布情况3.html')
总结:
1.在对疫情数据可视化之后,可以看到各个国家的疫情数据和排名,大体达到预期。
2.在完成设计的过程中遇到了各种各样的问题,在分析各方数据代码之后也能初步的解决,在爬虫代码的使用和图表代码的使用上都有缺陷,以后要多加学习。