关于新型肺炎数据分析和可视化系列笔记,计划按下面顺序开展:
一、根据官方接口获取和解析数据为结构化数据
二、根据过往历史数据通过机器学习手段进行预测
三、根据数据进行基于地图的可视化呈现
四、如有各省历史数据进行地图的动态展示,展现疫情的动态变化
关于获取和结构化数据的知识要点
1、正则表达式
原来只是单纯学习,没有实际应用过,也走了一些弯路,就当学习re.compile,re.search,re.findall等命令吧
2、字典的合并和追加
通过dict(zip(a,b))优雅的生成字典
通过 key, value组合将字典中一部分键值对生成新字典
3、json学习
json学习和字典差别不大,关键在于尝试
代码如下:
# api主页在https://tianqiapi.com/index/doc?version=epidemic
# api调用方式为https://tianqiapi.com/api?version=epidemic&appid=&appsecret=
# 调用参数说明
# 参数名 必选 类型 说明 备注(示例)
# appid 是 string 用户appid
# appsecret 是 string 用户appid
# version 是 string 接口版本标识 固定值: epidemic 每个接口的version值都不一样
# callback 否 string jsonp参数 如: jQuery.Callbacks
# vue 否 string 跨域参数 如果您使用的是react、vue、angular请填写值: 1
# 响应参数说明
# 参数名 类型 说明 备注
# date String 实时更新时间
# diagnosed Int 确诊人数
# suspect Int 疑似病例人数
# death Int 死亡人数
# cured Int 治愈人数
# serious Int 重症人数
# list Array 全国数据列表
# history Array 每日历史数据
# area Array 具体省市区人数
{
'errcode': ,
'data': {
'author': '官网接口文档 tianqiapi.com 技术QQ 445899710', #作者
'date': '2020-02-06 21:21:03', #当前日期
'diagnosed': 28129, #确诊病例
'suspect': 24702, #疑似病例
'death': 564, #死亡病例
'cured': 1354, #治愈病例
'serious': 3859, #严重病例
'diagnosedIncr': 3766, #新增确诊病例
'suspectIncr': 5328, #新增疑似病例
'deathIncr': 73, #新增死亡病例
'curedIncr': 462, #新增治愈病例
'seriousIncr': 640, #新增严重病例
'list': ['湖北 确诊 19665 例,治愈 686 例,死亡 549 例',疑似 222 例,
'浙江 确诊 954 例,治愈 92 例'],
'history': [{
'date': '2020-02-05', #历史日期
'confirmedNum': 28060, #历史确诊病例
'suspectedNum': 24702, #历史疑似病例
'curesNum': 1153, #历史治愈病例
'deathsNum': 564, #历史死亡病例
'suspectedIncr': 5328 #历史疑似病例
}, {}],
'area': [{
'provinceName': '湖北', #当前省份
'provinceShortName': '湖北',
'confirmedCount': 19665, #当前确诊病例
'suspectedCount': , #当前疑似病例
'curedCount': 686, #当前治愈病例
'deadCount': 549, #当前死亡病例
'comment': '',
'locationId': 420000, #区域ID
'cities': [{
'cityName': '武汉', #当前城市
'confirmedCount': 10117,#当前确诊病例
'suspectedCount': , #当前疑似病例
'curedCount': 454, #当前治愈病例
'deadCount': 414 #当前死亡病例
}, {}
}, {}]
}
}
'''
import json,re
import urllib.request
def getcurprovicedata(str):
# 将每个省当前的病例情况进行格式化转换
provstr='湖北|广东|浙江|河南|湖南|安徽|江西|重庆|江苏|山东|四川|黑龙江|北京|上海|福建|陕西|广西|河北|云南|海南|山西|辽宁|天津|贵州|甘肃|吉林|内蒙古|宁夏|新疆|香港|青海|台湾|澳门|西藏'
condstr='确诊|治愈|死亡|疑似'
#提取省市自治区信息
provpat=re.compile(provstr)
resprov=re.search(provpat,str)
#提取病例类型
condstr=re.findall(condstr, str)
#提取病例数量
condnum=re.findall("\d+", str)
#将病例类型和病例数量合并成字典
curprovicedata=dict(zip(condstr,condnum))
#将省市自治区加入字典
curprovicedata['provicename']=resprov.group()
return curprovicedata
appid='aaaaaa'
appsecret='bbbbbb'
url = 'https://tianqiapi.com/api?version=epidemic&appid={}&appsecret={}'.format(appid,appsecret)
resp=urllib.request.urlopen(url)
html=resp.read()
data = json.loads(html)
#定义各个解析后的变量
curcountrydata={} #当前国家疫情情况
curprovicedatas=[] #当前各省疫情情况
countrydatahistorys=[] #国家疫情日历史记录
provincedatas=[] #当天各省市自治区疫情情况
citydatas=[] #当天各市疫情情况
countrydatanames = {'date', 'diagnosed','suspect','death','cured','serious','diagnosedIncr','suspectIncr','deathIncr','curedIncr','seriousIncr'}
provincedatanames = {'provinceName', 'provinceShortName','confirmedCount','suspectedCount','curedCount','deadCount','locationId'}
# 解析生成当前国家疫情情况
curcountrydata= {key: value for key, value in data['data'].items() if key in countrydatanames}
# 解析生成当前各省疫情情况
tempcurprovicedatas=data['data']['list']
for tempcurprovicedata in tempcurprovicedatas:
curprovicedata=getcurprovicedata(tempcurprovicedata)
curprovicedatas.append(curprovicedata)
# 解析生成国家疫情日历史记录
for countrydatahistory in data['data']['history']:
countrydatahistorys.append(countrydatahistory)
for provincedata in data['data']['area']:
# 解析生成当天各省市自治区疫情情况
tmpprovincedata = {key: value for key, value in provincedata.items() if key in provincedatanames}
provincedatas.append(tmpprovincedata)
# 解析生成当天各市疫情情况
for citydata in provincedata['cities']:
citydata['provinceName']=provincedata['provinceName']
citydatas.append(citydata)长按二维码关注“追梦IT人”
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/6517/viewspace-3136488/ ,如需转载,请注明出处,否则将追究法律责任。