0%

疫情数据清洗

因为服务业作业需要用到疫情数据,所以重新找了一些数据处理步骤

数据来源

  1. Github,DXY-COVID-19-Data

  2. 霍普金斯大学,Covid Data

Github数据处理

导入数据并筛选国内数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import pandas as pd
#读取所有数据作为data_1
data_1 = pd.read_csv('DXYArea.csv')
#删除provinceName是中国的数据行
indexNames = data_1[data_1["provinceName"]=="中国"].index
# Delete these row indexes from dataFrame
data_1.drop(indexNames, inplace=True)
#筛选countryName是中国的数据
data_2 = data_1[data_1["countryName"]=="中国"]
#筛选特定行
save_series = ["provinceName","provinceEnglishName","province_confirmedCount","province_curedCount","province_deadCount","updateTime"]
data_2 = data_2[save_series]
data_2.head(2)
#删除同一天中的相同时间节点数据
data_2.drop_duplicates(inplace=True)

其中批量删除行用到的操作是:先获取有指定值的行的索引数据,然后使用drop()函数drop掉指定索引的行,删除重复行使用的是drop_duplicates()函数

按不同省份划分数据集:

1
2
3
4
5
6
7
# 按省划分数据集
def split_pro(data):
datas = []
province_list = data["provinceName"].unique()
for province in province_list:
datas.append(data[data["provinceName"]==province])
return datas

首先确定好“provinceName”列的不重复值,然后根据这些数据对数据集进行划分,并将所有省份的数据集存储在datas列表中返回

处理时间数据:

1
2
3
4
5
6
7
8
9
10
#对每个省份分别处理时间数据
def time_process(data):
datas = pd.merge(data, pd.DataFrame(data['updateTime'].str.split(' ',expand=True)), how='left', left_index=True, right_index=True)
datas = datas.groupby(0)[1].agg('max').reset_index()
datas["updateTime"] = datas[0] +" "+ datas[1]
datas.drop([0,1],axis=1,inplace=True)
data = datas.merge(data,how='inner',on='updateTime')
#添加每日新增数据
data["province_currentConfirmedCount"] = data["province_confirmedCount"] - data["province_curedCount"] - data["province_deadCount"]
return data

这步操作的原因是,源数据中是按照市级单位抓取的数据,但是这里只需要用到省级数据,所以只需要保留每天最后一条数据中的省级数据列。这里其实有个遗留问题就是,如何确定数据正确,因为issues里提到有一些地区的数据存在错误,作者解释道可能是丁香医生工作人员在录入数据时出现错误,但是由于爬虫仅爬取数据所以未对数据进行修正。但是从后续结果看,这些错误不太影响整体结果。

如何确定每天的最后一条数据?因为时间序列的操作没整明白,就用了原始的操作,即切割字符串,根据字符串比较,选出最大的字符串后汇编成一列,然后根据挑选出的数据左联,得出每天最后一条数据的数据集,并添加日新增的数据列

按省份处理数据

1
2
3
4
5
6
7
8
9
10
#处理省份数据
def pro_process(datas,name):
datas_1 = []
for i in datas:
i = time_process(i)
datas_1.append(i)
for j in datas_1:
if(j["provinceName"].unique() == name):
res = j
return res

这一步根据传入的不同省市,输出处理好的数据

清洗和汇总每个省份的日新增数据

1
2
3
4
5
#处理具体省份具体数据
def pro_process_1(data):
data = data.groupby("updateTime")["province_currentConfirmedCount"].sum().reset_index()
data_1 = times(data)
return data_1

这一步是将数据集中的数据转换成只有时间和日新增确诊的数据表,以存储为csv格式进行后续的图表绘制等操作。

整体步骤

1
2
3
4
datas = split_pro(data_2)
guangzhou = pro_process(datas,"广东省")
guangzhou = pro_process_1(guangzhou)
guangzhou.to_csv("guangzhou.csv",index=False)

如果需要获取全国的日新增数据,只需要对data_2进行时间处理,然后进行新增数据计算并汇总时间数据即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#处理时间数据
def times(data):
data_1 = pd.merge(data, pd.DataFrame(data["updateTime"].str.split(' ',expand=True)), how='left', left_index=True, right_index=True)
data_1 = data_1.groupby(0)[1].agg('max').reset_index()
data_1["updateTime"] = data_1[0] +" "+ data_1[1]
data_1.drop([0,1],axis=1,inplace=True)
#获取每天最后一条日期的数据并存储
data_1 = data_1.merge(data,how='inner',on='updateTime')
return data_1

datas_1 = []
for i in datas:
i = time_process(i)
datas_1.append(i)
test = pd.concat(datas_1)
test_1 = test.groupby("updateTime")["province_currentConfirmedCount"].sum().reset_index()
test_2 = times(test_1)#因为对每个省的数据汇总后会有当天时间重合的部分,所以需要去除
test_3 = test_2[test_2["updateTime"].str.startswith("2020")]
#将test_3转换成csv文件并存储在本地
test_3.to_csv("test_3.csv",index=False)

霍普金斯大学数据处理

这个数据集就很清晰,不用做太多工作,直接筛选出新增数据和时间戳就行了。