如何利用Python制作新型冠状病毒的线性趋势图?
一. 数据采集
先找到数据,对数据进行数据采集
数据来源:新浪疫情实时监测
URL: https://news.sina.cn/zt_d/yiqing0121
数据采集:
1.访问https://news.sina.cn/zt_d/yiqing0121
2.打开Chrome开发者工具,点开network,刷新页面,点击各个请求,找到获取取json的请求。
例如:附图
https://interface.sina.cn/news/wap/fymap2020_data.d.json?1581410367084&&callback=sinajp_15814103671094932140955446096
返回的数据显示:
City中,cureNum是治愈数,deathNum是死亡人数。value是确诊数
二. 数据处理:
用到以下几个模块
1.requests模块 (用于网页访问)
2.json模块,读取数据
3.图表地图模块:pyecharts
数据包:echarts-china-provinces-pypkg
数据包:echarts-china-cities-pypkg
(用pip安装requests,pyecharts以及两个数据包),例如:pip install pyecharts
三.数据处理代码:
说明:响应返回数据包含在一个js变量中,需要用正则处理下,然后用python自带的json.loads方法转为dict。
import requests import json import time from pyecharts.charts import * #这里主要用上了Map,Geo,如果用所有,用* from pyecharts import options as opts #import pandas as pd import datetime
def get_Data() ->dict: #获取新浪疫情数据 url="https://gwpre.sina.cn/interface/fymap2020_data.json?random=0.6606726084028551&_=1581585845511&callback=blankCallBack" result =requests.get(url).text #获得响应结果的text json_str = result.split('(')[1].split(')')[0] #print (json_str) #生成数据字典 data = json.loads(json_str) return data return data |
数据处理:
def get_daily_data() -> list: json_data = get_Data() daily_data = json_data['data']['historylist'] #每日新增数据 return daily_data |
生成线性图标代码:
1.china和wuhan的确诊疑似线性趋势图表。
def line_chart1(): daily_data=get_daily_data()
date_list=[] conNum_list=[] #确诊 susNum_list=[] #疑似 deathNum_list=[] #死亡 cureNum_list=[] #治愈 wuhan_conNum_list=[] wuhan_susNum_list=[] wuhan_deathNum_list=[] wuhan_cureNum_list=[] for daily in daily_data: #print (daily) date_list.append(daily["date"]) conNum_list.append(daily["cn_conNum"]) susNum_list.append(daily["cn_susNum"]) deathNum_list.append(daily["cn_deathNum"]) cureNum_list.append(daily["cn_cureNum"]) wuhan_conNum_list.append(daily["wuhan_conNum"]) wuhan_susNum_list.append(daily["wuhan_susNum"]) wuhan_deathNum_list.append(daily["wuhan_deathNum"]) wuhan_cureNum_list.append(daily["wuhan_cureNum"]) print (date_list) date_list=date_list[::-1] #倒着读取列表 conNum_list=conNum_list[::-1] susNum_list=susNum_list[::-1] wuhan_conNum_list=wuhan_conNum_list[::-1] wuhan_susNum_list=wuhan_susNum_list[::-1] #line_chart1=Line(init_opts=opts.InitOpts(theme=ThemeType.WESTEROS)) line_chart1 = Line() line_chart1.add_xaxis(date_list) line_chart1.add_yaxis("中国确诊",conNum_list,is_smooth=True) line_chart1.add_yaxis("中国疑似",susNum_list,is_smooth=True) line_chart1.add_yaxis("武汉市确诊",wuhan_conNum_list,is_smooth=True) line_chart1.add_yaxis("武汉市疑似",wuhan_susNum_list,is_smooth=True) line_chart1.set_global_opts(title_opts=opts.TitleOpts(title="COVID-19中国确诊与疑似趋势图")) line_chart1.render('COVID-19_1_{}.html'.format(datetime.date.today())) |
2.china和wuhan死亡治愈线性趋势图表。
def line_chart2(): daily_data=get_daily_data()
date_list=[] conNum_list=[] #确诊 susNum_list=[] #疑似 deathNum_list=[] #死亡 cureNum_list=[] #治愈 wuhan_conNum_list=[] wuhan_susNum_list=[] wuhan_deathNum_list=[] wuhan_cureNum_list=[] for daily in daily_data: #print (daily) date_list.append(daily["date"]) conNum_list.append(daily["cn_conNum"]) susNum_list.append(daily["cn_susNum"]) deathNum_list.append(daily["cn_deathNum"]) cureNum_list.append(daily["cn_cureNum"]) wuhan_conNum_list.append(daily["wuhan_conNum"]) wuhan_susNum_list.append(daily["wuhan_susNum"]) wuhan_deathNum_list.append(daily["wuhan_deathNum"]) wuhan_cureNum_list.append(daily["wuhan_cureNum"]) print (cureNum_list) date_list=date_list[::-1] #倒着读取列表 deathNum_list=deathNum_list[::-1] cureNum_list=cureNum_list[::-1] wuhan_deathNum_list=wuhan_deathNum_list[::-1] wuhan_cureNum_list=wuhan_cureNum_list[::-1] #line_chart1=Line(init_opts=opts.InitOpts(theme=ThemeType.WESTEROS)) line_chart2 = Line() line_chart2.add_xaxis(date_list) line_chart2.add_yaxis("中国死亡",deathNum_list,is_smooth=True) line_chart2.add_yaxis("中国治愈",cureNum_list,is_smooth=True) line_chart2.add_yaxis("武汉市死亡",wuhan_deathNum_list,is_smooth=True) line_chart2.add_yaxis("武汉市治愈",wuhan_cureNum_list,is_smooth=True) line_chart2.set_global_opts(title_opts=opts.TitleOpts(title="COVID-19中国死亡与治愈趋势图")) line_chart2.render('COVID-19_2_{}.html'.format(datetime.date.today())) |
主程序:
if __name__ == "__main__":
line_chart1()
line_chart2()
生成趋势图如下: