一:数据准备阶段
此次数据所有来源均从这两个地方得到
1.腾讯各省份市的疫情接口
2.腾讯疫情历史每日数据接口和国外疫情数据接口
二:工具和环境
IDE:Pycharm
第三方模块
1.json 主要功能:处理接口数据
2.requests 主要功能:获取接口数据
3.pandas 主要功能:将数据保存为csv
4.datetime 主要功能:文件保存时间
5.pyecahrts 主要功能:数据可视化制作地图等 版本1.7.0
环境 python3.7
浏览器:Chrome浏览器
三:具体功能实现
1.数据获取
def get_data(self): data = requests.get(self.api_url).json()['data'] return data
得到一个json类型的数据
需要对得到的数据利用json库进行简单处理下将字符串形式的json转换为dict字典
all = json.loads(self.get_data()) #将json数据转化成字典
2.数据处理
获取整个中国各省份市的疫情数据
def data_info(self): all = json.loads(self.get_data()) chinaTotal = all['chinaTotal'] # 目前中国总患病数 date = all['lastUpdateTime'] chinaAdd = all['chinaAdd'] # 昨日增加 areaTree = all['areaTree'][0]['children'] # for provice in areaTree: provice_name = provice['name'] # 获取省份 for city in provice['children']: city_ncov = { '日期': date, '省份': provice_name, '市': city['name'], '新增病例': city['today']['confirm'], # '新增死亡病例': city['today']['dead'], # '新增治愈病例': city['today']['heal'], '累计确认': city['total']['confirm'], '累计死亡': city['total']['dead'], '累计治愈': city['total']['heal'] } # print(city_ncov) # print(city) self.cities.append(city_ncov) df = pd.DataFrame(self.cities) #将数据转化成pandas里面的DataFrame格式然后保存 df.to_csv('中国疫情信息{}{}.csv'.format('中国疫情各省份市信息', datetime.date.today()), index=False)
这一步具体的方法要根据数据里面的字段进行处理
datetime.date,today()获取今天的具体日期
3.将数据好的数据进行pyecharts可视化
map_china_echarts = Map( init_opts=opts.InitOpts(width='1500px', height='1500px') ) map_china_echarts.add( '中国', [list(z) for z in zip(list(df["省份"]), list(df['累计确认']))], 'china', is_map_symbol_show=False ) map_china_echarts.set_global_opts( title_opts=opts.TitleOpts( title='最新ncov疫情地图(' + str(datetime.date.today()) + ')' # title ), visualmap_opts=opts.VisualMapOpts( max_=10000, is_piecewise=True, # 颜色是否分段显示(False为渐变,True为分段) pieces=[ {"min": 1, "max": 9, "label": "10人以下", "color": "#FFE6BE"}, {"min": 10, "max": 99, "label": "10-99人", "color": "#FFB769"}, {"min": 100, "max": 499, "label": "100-499人", "color": "#FF8F66"}, {"min": 500, "max": 999, "label": "500-999人", "color": "#ED514E"}, {"min": 1000, "max": 9999, "label": "1000人以上", "color": "#CA0D11"}, {"min": 10000, "max": 99999, "label": "1000人以上", "color": "#C23531"}, ] ), tooltip_opts=opts.TooltipOpts( is_show=True, # 显示 trigger_on='mousemove|click', # 鼠标点击或者移动到出现具体的数值 ), toolbox_opts=opts.ToolboxOpts( is_show=True, # 工具栏 下载图片,修改数据等 ) ) map_china_echarts.render('pyecharts_keshihua最新ncov疫情中国地图({}).html'.format(datetime.date.today()))
各省份确诊人数地图html文件
4.进行疫情历史数据统计和可视化
历史数据局部图
数据获取
这是对另外一个数据接口进行数据获取和处理
all = json.loads(self.get_ding_data()) for i in all['chinaDayList']: time_ncov = { '日期':i['date'], '确诊':i['confirm'], '疑似':i['suspect'], '死亡':i['dead'], '治愈':i['heal'], } # print(time_ncov) count.append(time_ncov) df = pd.DataFrame(count) df.to_csv('中国疫情信息中国累计数据.csv',index=False)
结果局部
利用pyecharts里的折线图进行绘制
line_echarts = Line() line_echarts.add_xaxis(list(df['日期'])) line_echarts.add_yaxis('确认', list(df['确诊']),is_smooth=True,) line_echarts.add_yaxis('疑似', list(df['疑似'])) line_echarts.set_global_opts( title_opts=opts.TitleOpts(title="nCoV确认病例与疑似病例曲线"), datazoom_opts=opts.DataZoomOpts( is_show=True, #显示 is_realtime=True, #拖动时,是否实时更新系列的视图。如果设置为 false,则只在拖拽结束的时候更新。 range_end= 60, # 数据窗口范围的结束百分比。 ), tooltip_opts=opts.TooltipOpts( is_show=True, # 是否显示提示框组件,包括提示框浮层和axisPointer。 trigger='axis', #坐标轴触发,主要在柱状图,折线图等会使用类目轴的图表中使用。 trigger_on='mousemove|click', #同时鼠标移动和点击时触发。 ), toolbox_opts=opts.ToolboxOpts( is_show=True, #是否显示提示框组件,包括提示框浮层和axisPointer。 ) ) line_echarts.render('pyecharts_keshihua最新ncov疫情折线图({}).html'.format(datetime.date.today()))
效果为
5.进行国外疫情统计和可视化地图制作
数据处理
count = [] count.append({'国家中': '中国', '国家英': 'China', '确诊': 80813, '死亡': 3073, '治愈': 55490, '新增': 103}) count.append({'国家中': '日本', '国家英': 'Japan', '确诊': 1116, '死亡': 12, '治愈': 248, '新增': 71}) all = json.loads(self.get_ding_data()) for i in all['foreignList']: if i['name'] != '钻石号邮轮'and i['name'] != '日本本土': contry = { '国家中':i['name'], '国家英':item_contry[i['name']], '确诊':i['confirm'], '死亡':i['dead'], '治愈':i['heal'], '新增':i['confirmAdd'], } count.append(contry) #判断国家具体地区的感染人数如果感染人数多则进行具体国家的数据统计 暂时没想着画地图 try: contry_conunt = [] contry_area = i['children'] for j in contry_area: # print(j) contryareas = { '地区':j['name'], '确诊':j['confirm'], '死亡':j['dead'], '治愈':j['heal'], '新增':j['confirmAdd'], } contry_conunt.append(contryareas) # self.export_csv(contry_conunt,i['name']) # print(contry_conunt) df2 = pd.DataFrame(contry_conunt) df2.to_csv('各国疫情状况{}{}.csv'.format(i['name'],datetime.date.today()), index=False)
因为在数据里包含的是国外数据所以没有中国的所以我在前面给加入了下
加入日本数据是因为数据里面的是日本国土还有钻石邮轮号的数据所以日本的数据不大准确,直接添加会好点
所以我就把日本本土数据给剔除掉了,钻石邮轮号没有具体的国家归属所以也给去掉了。
在后面加入了一个try except是因为有的国家确诊人数比较多,所以就统计此国家具体的地区确诊,疑似,治愈,死亡,新增数据。并保存到到csv中。
最后汇总一个所有国家的数据并保存在csv中
图片数据为局部
下面是对国外地图的绘制
world_map = ( Map() .add( series_name='世界地图', #系列名称,用于 tooltip 的显示,legend 的图例筛选。 data_pair=[list(z) for z in zip(list(df['国家英']), list(df['确诊']))], # 数据项 (坐标点名称,坐标点值) maptype='world', # 地图类型,具体参考 pyecharts.datasets.map_filenames.json 文件 ) .set_series_opts(label_opts=opts.LabelOpts(is_show=False)) .set_global_opts( title_opts=opts.TitleOpts( title='世界疫情地图ncov' #标题 ), visualmap_opts=opts.VisualMapOpts( type_='color' #根据颜色来进行区分 ), tooltip_opts=opts.TooltipOpts( is_show=True, # 显示 trigger_on='mousemove|click', #鼠标点击或者移动到出现具体的数值 ), toolbox_opts=opts.ToolboxOpts( is_show=True, # 工具栏 下载图片,修改数据等 ) ) ) world_map.render('pyecharts_keshihua最新世界ncov疫情分布图({}).html'.format(datetime.date.today())) print("最新世界ncov疫情分布图下载完成")
图片显示
在绘制地图的时候因为pyecharts带的地图国家名称是英文,我们的数据是中文,所以我当时想的是吧或得的国家进行调用一个百度翻译的api进行翻译。后来想了麻烦,于是我创建了一个字典包含所有的国家key是中文,value是英文。然后用的时候直接即可得到英文国家名称
item_contry[i['name']],
在这里提下关于pyecharts是一个很强大的可视化工具目前主要有两个版本一个是1点版本之前和1点本版之后,本次代码是pyecharts是1.7.0放在0.几版本上估计会有问题
建议学习的话还是看1版本之后的吧
这是一个pyecharts的中文文档 pyecharts
最后所有的代码我保存到我的百度网盘里面
百度网盘保存地址提取吗v9at
代码于2020/3/717.00前运行正常
码字不易,不喜勿喷。
有错误请在下面回复。谢谢
本文来互联网采集,已注明来源,如未注明来源可能来源未知,如有侵权请联系站长删除处理。