本文数据来源于丁香园官网的疫情数据,包含国家/地区、省份的疑似病例、死亡病例、确诊病例、治愈病例等数据,将其存储在MySQL数据库中,并利用tableau完成相应的动态可视化。
数据爬取参考了文章——17行代码简单搞定最新疫情数据获取,根据改进得到代码如下:
//导入需要的库
import pymysql //数据库
import re //网页内容爬取正则化
import json //json文件
from pip._vendor import requests //网页爬取
def create(): //创建数据库表的函数
db = pymysql.connect("localhost", "root", "136131", "yiqing",charset='utf8') // 连接数据库,得到一个数据库对象yiqing
cursor = db.cursor() //开启游标功能,得到一个游标对象
cursor.execute("DROP TABLE IF EXISTS info") //执行SQL语句
//创建表的SQL语句
sql = """CREATE TABLE info(
Id INT PRIMARY KEY AUTO_INCREMENT,
Date varCHAR(255),
Country varchar(255),
Province varchar(255),
City varchar(255),
Confirmed_num varchar(255),
Yisi_num varchar(255),
Cured_num varchar(255),
Dead_num varchar(255),
Code varchar(255))"""
cursor.execute(sql) //执行上述SQL语句
db.close() //断开数据库,释放资源
//在数据库表中插入数据函数
def insert(value):
db = pymysql.connect("localhost", "root", "136131", "yiqing",charset='utf8')
cursor = db.cursor()
sql = "INSERT INTO info(Date,Country,Province,City,Confirmed_num,Yisi_num,Cured_num,Dead_num,Code) VALUES ( %s,%s,%s,%s,%s,%s,%s,%s,%s)"
try:
cursor.execute(sql, value)
db.commit()
print('插入数据成功')
except:
db.rollback()
print("插入数据失败")
db.close()
create() // 创建表
url='https://raw.githubusercontent.com/BlankerL/DXY-2019-nCoV-Data/master/json/DXYArea.json' //数据从丁香园网站获取
response = requests.get(url)
// 将响应信息进行json格式化
versionInfo = response.text
print(versionInfo)//打印爬取到的数据
print("------------------------")//重要数据分割线↓
//从内存加载
jsonData = json.loads(versionInfo)
获取到的数据是以字典的形式存储的,以中国的数据为例,形式如下:
{
"locationId": 951001,
"continentName": "亚洲",
"continentEnglishName": "Asia",
"countryName": "中国",
"countryEnglishName": "China",
"provinceName": "中国",
"provinceEnglishName": "China",
"provinceShortName": "中国",
"currentConfirmedCount": 2105,
"confirmedCount": 83482,
"suspectedCount": 0,
"curedCount": 78028,
"deadCount": 3349,
"comment": null,
"cities": null,
"updateTime": 1586669332105
},
接下来将上面的数据利用上面的函数读取到sql中去。
//用于存储数据的集合
dataSource = []
provinceShortNameList = []
confirmedCountList = []
curedCount = []
deadCountList = []
//遍历对应的数据存入集合中
for k in range(len(jsonData['results'])):
countryName=jsonData['results'][k]['countryName'] //获取该组数据的国家名称
provinceShortName = jsonData['results'][k]['provinceName'] //获取该组数据的省的名称
if("待明确地区" == provinceShortName): //如果是待明确地区
continue; //不操作
if jsonData['results'][k]['cities']==None or jsonData['results'][k]['cities']==[]:
confirmnum=jsonData['results'][k]['confirmedCount'] //确诊病例
yisi_num=jsonData['results'][k]['suspectedCount'] //疑似病例
cured_num=jsonData['results'][k]['curedCount'] //治愈病例
dead_num=jsonData['results'][k]['deadCount'] //死亡病例
code=jsonData['results'][k]['locationId']
cityname=jsonData['results'][k]['provinceName']
date='2020-4-12'
insert((date,countryName,provinceShortName,cityname,confirmnum,yisi_num,cured_num,dead_num,code)) //将其插入进SQL文件中
else:
for i in range(len(jsonData['results'][k]['cities'])): //对该组数据中的每一个城市
confirmnum=jsonData['results'][k]['cities'][i]['confirmedCount'] //确诊病例
yisi_num=jsonData['results'][k]['cities'][i]['suspectedCount'] //疑似病例
cured_num=jsonData['results'][k]['cities'][i]['curedCount'] //治愈病例
dead_num=jsonData['results'][k]['cities'][i]['deadCount'] //死亡病例
code=jsonData['results'][k]['cities'][i]['locationId']
cityname=jsonData['results'][k]['cities'][i]['cityName']
date='2020-4-12'
insert((date,countryName,provinceShortName,cityname,confirmnum,yisi_num,cured_num,dead_num,code)) //将其插入进SQL文件中
之后就可以使用tableau连接数据库进行相应的仪表盘制作。
对确诊病例进行可视化,由红到蓝确诊人数依次减少,下方显示各个国家的疑似、确诊、死亡、痊愈病例数。
在全球数据中,根据颜色数据可以大致判断确诊人数相对来说比较高的国家分别是美国、中国、俄罗斯以及欧洲一些国家例如意大利、西班牙等。
通过点击相应国家可以在下方的柱状图中查看到该国家的疑似、确诊、死亡、痊愈病例数。
如上图所示,美国确诊病例达到529951,治愈病例32091,死亡病例20608,无疑似病例。
国内的数据更加丰富,除去各个省市总的病例情况外,还包括各个市区的数据,下面是中国各个省的疫情数据,可以指向相对位置查看具体数据。
通过点击不同城市可以查看到该省各个市的柱状图和气泡图数据,更加直观明了,以上海为例,下图左下角是上海各个区包括境外输入的疑似、确诊、死亡、治愈病例分布,右下角是各个区的气泡图,可根据气泡大小来直观了解确诊数的多少,可以清晰地看到,徐汇区的确诊病例数为18。
关于tableau的更多操作细节可以前往Tableau官方教程。
以上可视化的动态图也可以前往Tableau Public查看。