获取数据
最近在 Github 上找到了是使用 Python 编写的爬取 “ 丁香园 ” 的实时爬虫。但获取到历史数据就需要用到这位开发者提供的数据仓库:
数据处理
我们这次可视化是要做各省的数据可视化,所以就需要各省的数据。数据仓库中也提供了 “ 地区数据 DXYArea.csv ”。分析之后会发现这份数据需要对数据进行两个处理:
合并各市级城市数据
数据仓库当中为我们提供的数据比较详细,包含了市级的数据,我原本考虑是做相加,但后来发现其实数据当中也包含了所在省的确认人数,因此我们只需要删除市级的数据即可。
provinceName | cityName | province_confirmedCount | province_suspectedCount | province_curedCount | province_deadCount | city_confirmedCount | city_suspectedCount | city_curedCount | city_deadCount | updateTime |
贵州省 | 贵阳 | 64 | 0 | 8 | 1 | 12 | 0 | 4 | 0 | 2020/2/5 18:16:12 |
贵州省 | 毕节 | 64 | 0 | 8 | 1 | 11 | 0 | 0 | 0 | 2020/2/5 18:16:12 |
贵州省 | 六盘水 | 64 | 0 | 8 | 1 | 9 | 0 | 0 | 1 | 2020/2/5 18:16:12 |
可以用 Python 来实现删去除省级以外的内容,顺便实现一下时间倒序(从最远时间到最近时间):
# By Bing_Yanchi
import csv
data = []
after = []
# 读取数据
def read():
with open('DXYArea.csv',encoding='utf-8') as f:
f_csv = csv.reader(f)
for row in f_csv:
del row[9],row[8],row[7],row[6]
del row[5],row[4],row[3],row[1]
data.append(row)
# 合并数据
def merge():
for i in range(len(data)):
if i > 0 :
if data[i][0] != data[i-1][0]:
if data[i][2] != data[i-1][2]:
data[i][2] = data[i][2][:-4]
after.append(data[i])
# 添加表头
def reverse():
after.reverse()
after.insert(0,['name','value','date'])
# 写出数据
def write():
with open('data.csv','w',newline='',encoding='utf-8') as f:
f_csv = csv.writer(f)
for row in after:
f_csv.writerow(row)
read()
merge()
reverse()
write()
将更新数据转换为累计数据
数据仓库为我们提供的数据是某个省市数据变更后的储存记录,并不是每个时刻每个省份的数据,因此要再次对数据做更细的处理:
# By Bing_Yanchi
import csv
time = []
final = []
province = ['北京市','广东省','山东省','江苏省','河南省','上海市','河北省','浙江省','陕西省','湖南省','重庆市','福建省','天津市','云南省','四川省','广西壮族自治区','安徽省','海南省','江西省','湖北省','山西省','辽宁省','黑龙江','内蒙古自治区','贵州省','甘肃省','青海省','新疆维吾尔自治区','西藏区','吉林省','宁夏回族自治区']
value = {}
mid = []
# 生成字典
def init():
for i in range(len(province)):
value[province[i]] = '0'
# 获取时间列表
def get_time():
with open('data.csv',encoding='utf-8') as f:
f_csv = csv.reader(f)
for row in f_csv:
time.append(row[2])
del time[0]
# 主程序
def main():
with open('data.csv',encoding='utf-8') as f:
f_csv = csv.reader(f)
for row in f_csv:
if row[2] != 'date':
value[row[0]] = row[1]
for a in range(len(province)):
final.append([province[a],value[province[a]],row[2]])
final.insert(0,['name','value','date'])
# 写出数据
def write():
with open('data_new.csv','w',newline='',encoding='utf-8') as f:
f_csv = csv.writer(f)
for row in final:
f_csv.writerow(row)
init()
main()
write()
发表回复