在昨天的文章『用python制作动态图表看全球疫情变化趋势』中,由于篇幅原因,在数据处理与数据可视化相关内容上我们只是简单带过,那么我将以python小小白的角度去还原如何处理数据与数据可视化。本文为第一篇:获取数据并处理。
一、数据获取
一开始就有一个问题摆在面前,疫情数据哪里获取。虽然国内很多网站都提供了疫情的跟踪报道,但是并没有找到提供完整历史数据的网站,所以想直接从网站爬数据的思路就暂时断掉。不过没关系,我们去GitHub上搜搜
选择第一个并进去他的API说明页面,找到我们要的历史数据API
可以看到请求方式和接收的参数,于是我们就能得到获取全球历史数据的链接
https://lab.isaaclin.cn/nCoV/api/area?latest=0
然后用requests把数据拿下来就完成了第一步
二、数据处理
首先将存储在字典里面的数据保存到dataframe中,使用pandas里面的pd.DataFrame()
当传进去一个字典形式的数据之后可以转换为dataframe⬇️
现在紧接着又出现一个问题就是时间变量是以13位时间戳形式存储的,所以要先将时间进行转换
时间转换我们选择的是python里的time
模块,写一个函数来转换时间
def time_c(timeNum):
timeTemp = float(timeNum/1000)
tupTime = time.localtime(timeTemp)
stadardTime = time.strftime("%Y-%m-%d %H:%M:%S", tupTime)
return stadardTime
接下来遍历dataframe中所有的数据来将时间转换
可以发现数据里有很多重复值,所以接下来要对这一部分进行处理。比如我们随便选择一个国家
可以看到每天可能有多条数据,而pandas里面有去重函数.drop_duplicates()
,比如可以这样用
data.drop_duplicates(subset=['A','B'],keep='first',inplace=True)
代码中subset对应的值是列名,表示只考虑这两列,将这两列对应值相同的行进行去重。默认值为subset=None表示考虑所有列。
keep=’first’表示保留第一次出现的重复行,是默认值。keep另外两个取值为”last”和False,分别表示保留最后一次出现的重复行和去除所有重复行。
inplace=True表示直接在原来的DataFrame上删除重复项,而默认值False表示生成一个副本
于是我们我们需要根据时间进行去重,也就是每天每个国家只保留一条数据,首先把所有时间取出来
然后根据时间进行去重,也就是每天只保留一条最新数据
这样就完成了去重,我们将数据保存为Excel看看。
tem.to_excel('data.xlsx')
任意选择一个国家,发现每天只有一条数据,搞定!
数据汇总
在上一步已经完成了数据去重,接下来进行数据汇总,比如如何得到分大洲汇总的数据。首先取出我们需要的数据和各大洲的名字
现在我们就需要各个大洲每天的疫情数据,这时就用到了pandas里面的分组计算函数.groupby()
# groupby 只进行分组,不会进行任何的计算操作
grouped = df["data1"].groupby(df["key1"])
可以按照上面的方法调用,按照某个key进行分组后可以针对结果进行一些统计⬇️
grouped.count() # 根据分组结果,计算每个分组下元素的个数
grouped.max() # 根据分组结果,计算每个分组下的最大值
grouped.mean()
grouped.size()
grouped.describe()
grouped.sum()
所以我们的分组汇总过程就应该这么写
来看下提取的数据
虽然已经成功提取到了数据但是依旧有一个问题,并不是每天数据都是完整的,在疫情刚开始的时候,很多大洲并没有数据,这会导致绘图时的不便,而在之前的缺失值处理的文章中我们已经详细的讲解了如何处理缺失值。这所以我们在pandas中进行处理,将缺失值填充为0,这样就搞定了。
四、结束语&彩蛋
回顾上面的过程,本次处理数据过程中使用的语法都是pandas中比较基础的语法,当然过程中也有很多步骤可以优化。关于pandas中其他语法我们会在以后的技术解析文章中慢慢探讨,最后彩蛋时间,有没有更省事的获取历史数据的办法?有,只需pip安装akshare库,然后两行代码就能获取到整理好的疫情历史数据
import akshare as ak
epidemic_hist_all_df = ak.epidemic_hist_all()
===========================
我的公众号:早起python