大家好,前几天的Python地图大家都会用了吗?如果数据无法获取的话,我们可以用今天提到的方法进行单日数据的获取,然后将他们concat成一个时间序列的面板数据。
一、疫情数据的获取
这次我们不用WindPy,因为很多小伙伴可能暂时没这个条件调用别人已经做好的数据库。所以今天使用爬虫的方法。
好了,关于爬虫的网页分析部分直接跳过,我也是直接拿的别人找好的请求接口。
url = 'https://view.inews.qq.com/g2/getOnsInfo?name=disease_h5&callback=&_=%d'
这里直接给出请求的url就行了。
下面,我们直接请求这个url,返回的数据就是最新的数据库。
import requestsimport json
直接请求这个url,并附上当前的时间戳。
r = requests.get(url % time.time(), timeout = 5)
然后解析返回的json数据,这里需要大家有点耐心,一层一层的解析
data = json.loads(r.text)data = json.loads(data['data'])last_update_time = data['lastUpdateTime']data = data['areaTree']data_beijing = data[0]['children'][0]['total']data_districts = data[0]['children'][0]['children']
然后我们就可以根据字典来取值了。
columns_list = ['现存确诊', '累计确诊', '死亡人数', '治愈人数', '疑似发病']df_beijing = pd.DataFrame(columns = columns_list)df_beijing.loc['北京', '现存确诊'] = data_beijing['nowConfirm']df_beijing.loc['北京', '累计确诊'] = data_beijing['confirm']df_beijing.loc['北京', '死亡人数'] = data_beijing['dead']df_beijing.loc['北京', '治愈人数'] = data_beijing['heal']df_beijing.loc['北京', '疑似发病'] = data_beijing['suspect']
各区的数值
df_districts = pd.DataFrame(columns = columns_list)for district in data_districts: name = district['name'] + '区' tmp = district['total'] nowconfirm = tmp['nowConfirm'] confirm = tmp['confirm'] suspect = tmp['suspect'] dead = tmp['dead'] heal = tmp['heal'] df_districts.loc[name, '现存确诊'] = nowconfirm df_districts.loc[name, '累计确诊'] = confirm df_districts.loc[name, '死亡人数'] = dead df_districts.loc[name, '治愈人数'] = heal df_districts.loc[name, '疑似发病'] = suspectdf_districts = df_districts.drop(index = ['境外输入区', '地区待确认区', '外地来京区'])
最后,合并数据并输出数据即可。
# 数据合并data = pd.concat([df_districts, df_beijing], axis=0)# 数据输出filename = '北京疫情数据_更新时间{}'.format(last_update_time).split()[0]data.to_excel(filename + '.xlsx')
二、疫情数据可视化
接下来我们用这个数据来绘制最新一期的疫情地图。
district_data = data.iloc[:-1, :]date = last_update_time.split()[0]plot_data = pd.DataFrame(columns = district_data.columns)for i in list(plot_data.columns): plot_data.loc[:, i] = [list(zip(district_data[i].index, district_data[i].values))]datemap = ( Map(init_opts=opt.InitOpts(theme=ThemeType.ROMANTIC)) .add("现存确诊", plot_data['现存确诊'].tolist()[0], maptype = '北京', is_map_symbol_show=False) .add("累计确诊", plot_data['累计确诊'].tolist()[0], maptype = '北京', is_map_symbol_show=False) .add("死亡人数", plot_data['死亡人数'].tolist()[0], maptype = '北京', is_map_symbol_show=False) .add("治愈人数", plot_data['治愈人数'].tolist()[0], maptype = '北京', is_map_symbol_show=False) .add("疑似发病", plot_data['疑似发病'].tolist()[0], maptype = '北京', is_map_symbol_show=False) .set_global_opts(title_opts=opt.TitleOpts(title='北京实时疫情图-现存确诊人数:' + str(int(data.loc['北京', '现存确诊'])), subtitle='更新时间'+date), visualmap_opts=opt.VisualMapOpts(max_=int(np.nanmax(district_data) / 100 + 1) * 100, range_text = ['高', '低'],), legend_opts=opt.LegendOpts(orient='Vertical',pos_right=0) ) )
这次添加了5个系列,如果需要看现存确诊,就把其他几个点掉就行了。
下面再绘制几个静态图
本期内容就到这里了,如需本文的完整代码,可在公众号后台私聊获取。
我们下期再见!