工具:pandas
爬虫取得的数据一般用于分析,下面,我们将先前获得的数据转换为CSV文件,方便分析。
目前我们获得的数据格式如下:
基本结构如下:
[[ { 20200123美国 }, {20200124美国 }…],[ { 20200123法国 }, {20200124法国 }…],…]
所有国家和地区在一起组成一个列表,每个国家也是一个列表,每天的疫情数据是一个字典,我们想把它转换为如下CSV格式的文件:
思路:
1、加载JSON文件,遍历列表,获得每个国家的疫情数据
2、遍历单个国家疫情数据列表,获取国家名称,将累计确诊人数和日期组成字典
3、利用pandas将上述列表和字典转换为CSV文件
def list_to_dataframe(self):
"""
清洗数据,将疫情数据转换为方便处理的CSV文件
:return:
"""
# 1.加载各国疫情数据
with open('data/corona_virus_data_of_world.json') as fp:
corona_virus_data_2_1 = json.load(fp)
# 定义列表,用于存储各国从1月23号至今的json数据
corona_virus_data_of_world = []
corona_virus_data_of_country = {}
# data_list用于放置序列化的数据
data_list = []
# provinceName_dict 放置序号:国家字典,方便后面更改dataframe的列名称
provinceName_dic = {}
provinceName_list = []
i = 0
# 2.遍历各国疫情数据
for country in corona_virus_data_2_1: # country是列表
# print(country, '\n')
corona_virus_data_of_time = {}
# 遍历各国每日疫情数据
for date in country: # data是字典
# 获取 日期:确诊人数 键值对
corona_virus_data_of_time['{}'.format(date['dateId'])] = date["confirmedCount"]
# 序列化
s = Series(data=corona_virus_data_of_time)
corona_virus_data_of_country[country[0]['provinceName']] = corona_virus_data_of_time
corona_virus_data_of_world.append(corona_virus_data_of_country)
data_list.append(s)
# 获取 序号:国家 字典
if country[0]['provinceName']:
provinceName_dic['{}'.format(i)] = country[0]['provinceName']
i += 1
provinceName_list.append(country[0]['provinceName'])
# 将序列化的数据转换为dataframe数据
df = DataFrame(data=data_list).stack().unstack(0)
# 数据中多了这5行,不知道什么原因,删除他们,不影响后续使用
df = df.drop(['20200121', '20200122', '20200119', '20200120', '20201015'])
# 更改列名称
df.columns = provinceName_list
# 将缺失数据NaN替换为0
df.fillna(value=0, inplace=True)
# 保存为CSV文件
df.to_csv('data/corona_virus_of_world.csv', index=True, header=True)
结束