绘制疫情可视化地图

前言

在当前世界新冠疫情的背景下,我想知道世界各国具体有多少患者,以及它们的排行

数据来源

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.在完成设计的过程中遇到了各种各样的问题,在分析各方数据代码之后也能初步的解决,在爬虫代码的使用和图表代码的使用上都有缺陷,以后要多加学习。

 

posted @ 2021-12-30 13:44  李海辙  阅读(322)  评论(0编辑  收藏  举报