一、前言
最近国内疫情已经有所好转,但是国外的情况不容乐观,那么怎样用python去制作动态图表来看全球疫情变化趋势呢?比如下面的国内外疫情发展趋势
还是全球疫情发展趋势⬇️
其实用python实现并不难,简单来说就分为三步:
- 获取数据(requests)
- 数据清洗(pandas)
- 数据可视化(pyecharts)
那么我们就来一点一点讲解吧!
二、数据获取与处理
疫情数据获取并不是很难,在目前互联网上已经有许多提供数据的网站,比如丁香园、腾讯新闻、百度新闻等,为了省事直接GitHub上找找看有没有现成的接口,很轻松就找到了丁香园数据的API,
接下来两行命令就能拿下所有历史数据
代码语言:javascript复制data = requests.get('https://lab.isaaclin.cn/nCoV/api/area?latest=0')
data = data.json()
来看下数据
很明显这样的数据是没有办法去做分析的,所以接下来的重点就是如何清洗这一堆数据,主要又分为下面两块:
- 数据整理:原始数据整理,由 json格式转换为方便分析的dataframe格式
- 数据清洗:原数据由于API采集的机制。包含大量重复数据、无效数据、缺失数据所以需要对这些数据进行处理
先来看下数据量
可以看到一共采集到了7584条数据,由于脏数据比较多,所以这一部分的工作量是比较大的,因此我们不在这里使用太多篇幅去讲如何一步一步提取出我们想要的数据,会单独写一篇数据处理过程的文章,不过还是来看看经历了哪些过程与代码吧!
首先要将所有数据从字典提取出来并对时间戳进行转换,然后将数据保存到pandas里
代码语言:javascript复制data = requests.get('https://lab.isaaclin.cn/nCoV/api/area?latest=0')
data = data.json()
res = data['results']
df = pd.DataFrame(res)
def time_c(timeNum):
timeTemp = float(timeNum/1000)
tupTime = time.localtime(timeTemp)
stadardTime = time.strftime("%Y-%m-%d %H:%M:%S", tupTime)
return stadardTime
for i in range(len(df)):
df.iloc[i,16] = time_c(df.iloc[i,16])
for i in range(len(df)):
df.iloc[i,16] = df.iloc[i,16][5:10]
现在数据就成了这样
这样看起来就舒服多了,但是还是不可以使用,因为API每天会采集很多次数据,所以里面有很多重复数据和异常数据,所以接下来重点处理这一部分。对于重复数据我们只保留最新一个,对于空数据我们选择前一天的数据填充。
代码语言:javascript复制#去重部分代码
tem = df1[df1['updateTime'] == '03-02']
tem = tem.drop_duplicates(['provinceShortName'], keep='last')
for i in date[1:41]:
tem1 = df1[df1['updateTime'] == i]
tem1 = tem1.drop_duplicates(['provinceName'], keep='last')
tem = tem.append(tem1)
tem = tem.reset_index(drop=True)
tem
由于篇幅原因,就不再贴出更多的代码,我们来看下最终处理完的数据
三、数据可视化
数据可视化,我们依旧选择之前讲解过很多次的pyecharts,主要使用的就是里面的Timeline:时间线轮播多图,简单来说就是在每一个时间点生成一张图然后滚动播放,有点像小时候的手绘小人书一样,所以我们的数据就需要是时间序列数据,那么具体关于怎样使用,参数如何调整请关注后续单独的可视化讲解文章,直接看代码与分析吧。首先是国内外疫情趋势
代码语言:javascript复制from pyecharts.faker import Faker
from pyecharts import options as opts
from pyecharts.charts import Bar, Page, Pie, Timeline,Grid
def timeline_bar() -> Timeline:
x = ['国内','国外']
tl = Timeline()
tl = Timeline()
tl.add_schema(is_auto_play = True,
play_interval = 500,
is_loop_play = False)
k= 0
for i in date:
bar = (
Line()
.add_xaxis(date)
.add_yaxis("国内", hs(c1,k))
.add_yaxis("国外", hs(c,k))
.extend_axis(
yaxis=opts.AxisOpts(
)
)
.set_series_opts(
areastyle_opts=opts.AreaStyleOpts(opacity=0.5),
label_opts=opts.LabelOpts(is_show=False),
)
.set_global_opts(title_opts=opts.TitleOpts("{}国内外疫情趋势".format(i)))
)
tl.add(bar, "{}".format(i))
k = k 1
return tl
timeline_bar().render_notebook()
可以看出,国内的增长已经处于平缓状态,而国外自二月底来突然爆发,目前还处于上升期,这也是为什么现在要严防境外输入病例。再来看看国外具体的病例占比吧(微信GIF只能上传5M所以有点糊)
可以看出在最近几天韩国、日本、意大利突然爆发,这三个国家的病例数量就占到了约75%。最后再来看看全球疫情的变化趋势吧!
四、结束语
至此,我们就完全使用python对疫情数据进行了一次动态可视化,回顾整个过程其实并没有太多过于复杂的步骤,更多的是关于pandas和pyecharts基础功能的使用。