一、选题背景
2020年1月23日武汉宣布封城,武汉身为全世界第一个报道发现新冠的地区,从*开始,这个城市承受了非 常大的压力和痛苦。直到4月8号宣布解封,这座城市才展开双臂,成为全世界最安全的地方!对于这座城市,我有无以言说的感激。在疫情常态化的当下,要对疫情有更多的了解和反思!疫情数据的可视化能呈现出更直观的疫情信息。
二、大数据分析
1.分析的数据集:
数据的列名分别为:date:日期,country:国家,countryCode:国家简写,province:省级地区,provinceCode:省级地区邮政编码,city:城市,cityCode:城市邮政编码,confirmed:确诊病例,suspected:疑似病例,cured:治愈病例,dead:死亡病例。从纵向来看:数据以时间为轴,记录了全世界疫情情况,总共229061条数据。数据从可追溯的2019.12.1的第一个病例开始到2020.12.8
2.数据分析课程设计方案概述:
制作武汉的包含确诊病例、疑似病例、治愈病例、死亡病例的折线图。
制作全国疫情区域地图、饼图、确诊病例、疑似病例、治愈病例、死亡病例柱状图。
制作制全世界确诊人数图、世界死亡率图。
三、数据分析步骤
一、数据集
1.数据源:https://github.com/caly5144/shu-s-project/tree/master/covid 该数据集由国内第三方从卫健委公布的数据中提取出来的数据集。
2.导入包,导入数据集。
1 import numpy as np 2 import pandas as pd 3 import matplotlib.pyplot as plt 4 import seaborn as sns 5 from datetime import datetime 6 7 #图片中显示中文 8 from pylab import * 9 mpl.rcParams[\'font.sans-serif\'] = [\'SimHei\'] 10 11 #读取数据集 12 filename = \'Wuhan-2019-nCoV.csv\' 13 df = pd.read_csv(filename)
二、数据清洗
1.现在进行初步的数据清洗。
(1)首先添加3行关键数据,分别为:
现存确诊人数(now):确诊人数(confirmed)-治愈人数(cured)-死亡人数(dead)
死亡率(death_ratio):死亡人数(dead)/确诊人数(confirmed)
治愈率(cure_ratio):治愈人数(cured)/确诊人数(confirmed)。
(2)由于该数据集中出现了国家-省份-城市这种行政级别划分,并且再低一级的行政区下面为NAN值,为了区分数据的行政级别,用region_class存储:1为*别、2为省级别、3为市级别
(3)将数据中的“data”列的数据格式转化为“datetime64”
(4)删除对本次实验不需要的列:邮政编码、城市邮政编码、国家简写、疑似病例(该数据集没有收入疑似病例)
(5)删除重复数据
(6)空格处理
1 #数据清洗 2 3 #添加几行关键数据 4 df[\'now\'] = df.confirmed-df.cured-df.dead#现存确诊 5 df[\'death_ratio\'] = df[\'dead\']/df[\'confirmed\']#死亡率 6 df[\'cure_ratio\'] = df[\'cured\']/df[\'confirmed\']#治愈率 7 8 #添加一列,region_class,判断行政级别的数据 9 df[\'region_class\'] = 0 # 国家 10 df.loc[pd.isnull(df.province) == False , \'region_class\' ] = 1 # 省 11 df.loc[pd.isnull(df.city) == False , \'region_class\' ] = 2 # 市 12 13 #将date格式转化为datetime 14 df[\'date\'].astype(\'datetime64\') 15 16 #将时间作为标签 17 #df = df.set_index(\'date\')#暂时不需要 18 19 df.drop(\'provinceCode\',axis=1,inplace=True)#删除邮政编码列,对本次实验无用数据 20 df.drop(\'cityCode\',axis=1,inplace=True)#删除城市邮政编码列,对本次实验无用数据 21 df.drop(\'countryCode\',axis=1,inplace=True)#删除国家简写列,对本次实验无用数据 22 df.drop(\'suspected\',axis=1,inplace=True)#删除疑似病例列,该数据集没有录入疑似病例 23 24 #删除重复数据 25 df = df.drop_duplicates() 26 27 #空值处理:由于本数据集的空值表示最低地区级别,即城市为空则为省级数据,省级为空则为*数据,都是有意义的,所以不处理空值 28 29 #空格处理 30 df[\'date\']=df[\'date\'].map(str.strip) 31 df[\'country\']=df[\'country\'].map(str.strip) 32 #now列和region_class列是新增列,不用进行空格处理 33 34 df.head(10)
2.进一步数据清理:查询无用数据
1 #数据清洗查询无用数据 2 df[\'confirmed\'].isnull().value_counts()#查询是否有确诊人数为0的异常值 3 df[\'date\'].isnull().value_counts()#查询是否有无日期的异常行数据 4 df[\'country\'].isnull().value_counts()#查询是否有无国家名的异常行
没有异常值
3.进一步数据清理:通过describe()函数查询异常值
1 #异常值处理 2 df.describe()
这时出现了非常多的异常值。首先是现存病例的最小值竟然出现了负数,还有一些死亡率和治愈率的异常值。
开始处理这些异常,首先查看现存人数小于0的情况
1 #发现问题:在现存一栏中发现最小值出现-7.330000e+02,对此进行排查 2 df[df[\'now\']<0]#显示现存人数为负数值的行
由此我发现了有待确认、和所属地待确认两种异常情况,还有出现确诊人数小于治愈人数的情况,属于异常数据,由于我无法对现存数据进行判断,所以决定将现存确诊人数为负数的值替换为0,这样他对整个实验的影响最小。
1 #经过对数据的分析和查阅资料后了解到有些病例治愈了未公布来源 2 #还有个别地区出现数据错误,外国苏里南也出现了数据错误,对此将对这些负数值赋为0 3 df.loc[df[df[\'now\']<=0].index,[\'now\']]=0 4 5 df[\'death_ratio\'] = df[\'dead\']/df[\'confirmed\']#死亡率 6 df[\'cure_ratio\'] = df[\'cured\']/df[\'confirmed\']#治愈率
当然,重新赋值会打乱死亡率和治愈率,所以重新对死亡率和治愈率进行赋值,再次查看
1 #再次查看 2 df.describe()
三、数据可视化
1.制作武汉的疫情数据可视化
选取的时间段为该数据集中最早的日期到4月8日武汉市解封。由于主要为了了解数据的变化,所以选择了折线图进行绘制。
#折线图最能直观的表现出数据的变化 wuhan_df = df[df[\'city\'] == \'武汉市\']#提取出武汉市数据 wuhan_df = wuhan_df[wuhan_df[\'date\'] < \'2020-04-08\']#提取出武汉市解封前的数据 #提取数据 wuhan_date = np.array(wuhan_df[\'date\'])#提取时间 wuhan_confirmed = np.array(wuhan_df[\'confirmed\'])#提取所有新冠病例 wuhan_cured = np.array(wuhan_df[\'cured\'])#提取治愈病例 wuhan_dead = np.array(wuhan_df[\'dead\'])#提取死亡病例 wuhan_now = np.array(wuhan_df[\'now\'])#提取现存病例 #绘制死亡病例、治愈病例、所有病例、现存病例的折线图 plt.figure(figsize=(100,30)) plt.xlabel("日期") plt.ylabel("人数") plt.plot(wuhan_date,wuhan_dead,linewidth=5.0,c=\'k\',label="死亡病例") plt.show() plt.figure(figsize=(100,30)) plt.xlabel("日期") plt.ylabel("人数") plt.plot(wuhan_date,wuhan_cured,linewidth=5.0,c=\'r\',label="治愈病例") plt.show() plt.figure(figsize=(100,30)) plt.xlabel("日期") plt.ylabel("人数") plt.plot(wuhan_date,wuhan_confirmed,linewidth=5.0,c=\'b\',label="所有病例") plt.show() #图片显示,在该数据的后半段程直线,代表着武汉疫情的基本结束 #为4月8号解封武汉提供了实际基础 plt.figure(figsize=(100,30)) plt.xlabel("日期") plt.ylabel("人数") plt.plot(wuhan_date,wuhan_now,linewidth=5.0,c=\'y\',label="现存病例") plt.show()
为了更直观的看这四个折线的关系,将4个图融汇在一个图中
1 #将4个图融汇在一个图中 2 plt.figure(figsize=(100,30)) 3 plt.xlabel("日期") 4 plt.ylabel("人数") 5 plt.plot(wuhan_date,wuhan_dead,linewidth=5.0,c=\'k\',label="死亡病例") 6 plt.plot(wuhan_date,wuhan_cured,linewidth=5.0,c=\'r\',label="治愈病例") 7 plt.plot(wuhan_date,wuhan_confirmed,linewidth=5.0,c=\'b\',label="所有病例") 8 plt.plot(wuhan_date,wuhan_now,linewidth=5.0,c=\'y\',label="现存病例") 9 plt.show()
从图中可以明显看出,在4月8日武汉解封前,确诊人数已经是很长的一段直线了,非常感谢武汉人民!
2.制作全国疫情地图
通过pyecharts来制作中国疫情地图,首先提取改数据集最新的数据:2020-12-8
1 #制作全国疫情地图 2 df_index_date = df.set_index(\'date\')#将时间作为标签 3 4 date20201208 = df_index_date[\'2020-12-08\':\'2020-12-08\']#取出该数据集最后一日的数据(2020年12月8日) 5 6 China_data = date20201208[date20201208[\'country\'] == \'中国\']#提取出中国的数据 7 China_data = date20201208[date20201208[\'region_class\'] == 1] 8 province_data = China_data[["province","confirmed"]] 9 10 print(province_data)
接下来制作地图
1 from pyecharts.charts import Map 2 import pyecharts.options as opts 3 from pyecharts.globals import ChartType 4 5 #制作一张中国地图疫情图 6 7 ( 8 Map() 9 .add("",[list(z) for z in zip(list(province_data["province"]), list(province_data["confirmed"]))], "china",is_map_symbol_show=False) 10 .set_global_opts(title_opts=opts.TitleOpts(title="2019_nCoV中国各地区总确诊人数地图"),visualmap_opts=opts.VisualMapOpts(is_piecewise=True, 11 pieces = [ 12 13 {"min": 5000 , "label": \'>5000\',"color": "#893448"}, #不指定 max,表示 max 为无限大 14 {"min": 1000, "max": 4999, "label": \'1000-4999\',"color" : "#ff585e" }, 15 {"min": 500, "max": 999, "label": \'500-1000\',"color": "#fb8146"}, 16 {"min": 101, "max": 499, "label": \'101-499\',"color": "#ffA500"}, 17 {"min": 10, "max": 100, "label": \'10-100\',"color": "#ffb248"}, 18 {"min": 0, "max": 9, "label": \'0-9\',"color" : "#fff2d1" }])) 19 20 ).render_notebook()
发现该图中出现非常严重的错误,数据并没有展现出来。通过查阅资料,终于明白,地名不能“省”,途中的中文是唯一识别的中文。所以现在对数据进行替换。由于担心替换会造成更多不便,于是决定直接添加一列tihuan
1 province_data[\'tihuan\'] = [ 2 \'北京\',\'天津\',\'河北\',\'山西\',\'内蒙古\', 3 \'辽宁\',\'吉林\',\'黑龙江\',\'上海\',\'江苏\',\'浙江\', 4 \'安徽\',\'福建\',\'江西\',\'山东\',\'河南\',\'湖北\',\'湖南\', 5 \'广东\',\'广西\',\'海南\',\'重庆\',\'四川\',\'贵州\', 6 \'云南\',\'*\',\'陕西\',\'甘肃\',\'青海\',\'宁夏\', 7 \'*\',\'*\',\'香港\',\'澳门\'] 8 9 province_data
继续作图
1 from pyecharts.charts import Map 2 import pyecharts.options as opts 3 from pyecharts.globals import ChartType 4 5 #制作一张中国地图疫情图 6 7 ( 8 Map() 9 .add("",[list(z) for z in zip(list(province_data["tihuan"]), list(province_data["confirmed"]))], "china",is_map_symbol_show=False) 10 .set_global_opts(title_opts=opts.TitleOpts(title="2020_nCoV中国各地区总确诊人数地图"),visualmap_opts=opts.VisualMapOpts(is_piecewise=True, 11 pieces = [ 12 13 {"min": 5000 , "label": \'>5000\',"color": "#893448"}, #不指定 max,表示 max 为无限大 14 {"min": 1000, "max": 4999, "label": \'1000-4999\',"color" : "#ff585e" }, 15 {"min": 500, "max": 999, "label": \'500-1000\',"color": "#fb8146"}, 16 {"min": 101, "max": 499, "label": \'101-499\',"color": "#ffA500"}, 17 {"min": 10, "max": 100, "label": \'10-100\',"color": "#ffb248"}, 18 {"min": 0, "max": 9, "label": \'0-9\',"color" : "#fff2d1" }])) 19 20 ).render_notebook()
图中通过颜色深浅勾勒出疫情严重程度,是最直观的数据可视化。
3.制作全国各省疫情可视化图
分析不同省份,可以采取柱状图来制作。
1 province = np.array(province_data[\'province\'])#提取城市 2 province_confirmed = np.array(province_data[\'confirmed\'])#提取所有病例 3 province_cured = np.array(province_data[\'cured\'])#提取治愈病例 4 province_dead = np.array(province_data[\'dead\'])#提取死亡病例 5 province_now = np.array(province_data[\'now\'])#提取现存病例 6 province_death_ratio = np.array(province_data[\'death_ratio\'])#提取死亡率 7 province_cure_ratio = np.array(province_data[\'cure_ratio\'])#提取治愈率 8 11 #绘制全国各个省份确诊人数柱状图 12 plt.figure(figsize=(100,30)) 13 plt.xlabel("日期") 14 plt.ylabel("人数") 15 plt.bar(province,province_confirmed,linewidth=5.0,label="所有病例") 16 plt.show() 17 18 #绘制全国各个省份治愈病例柱状图 19 plt.figure(figsize=(100,30)) 20 plt.xlabel("日期") 21 plt.ylabel("人数") 22 plt.bar(province,province_cured,linewidth=5.0,label="所有病例") 23 plt.show() 24 25 #绘制全国各个省份死亡病例柱状图 26 plt.figure(figsize=(100,30)) 27 plt.xlabel("日期") 28 plt.ylabel("人数") 29 plt.bar(province,province_dead,linewidth=5.0,label="所有病例") 30 plt.show() 31 32 #绘制全国各个省份现存病例柱状图 33 plt.figure(figsize=(100,30)) 34 plt.xlabel("日期") 35 plt.ylabel("人数") 36 plt.bar(province,province_now,linewidth=5.0,label="所有病例") 37 plt.show() 38 39 #绘制全国各个省份死亡率柱状图 40 plt.figure(figsize=(100,30)) 41 plt.xlabel("日期") 42 plt.ylabel("人数") 43 plt.bar(province,province_death_ratio,linewidth=5.0,label="所有病例") 44 plt.show() 45 46 #绘制全国各个省份治愈率柱状图 47 plt.figure(figsize=(100,30)) 48 plt.xlabel("日期") 49 plt.ylabel("人数") 50 plt.bar(province,province_cure_ratio,linewidth=5.0,label="所有病例") 51 plt.show()
由于缩小显得非常模糊,其实图片的清晰度非常高
接下来制作明显看出各个省份所占比例的饼图
1 #各个省的确诊人数所占比重 2 fig = plt.figure() 3 plt.pie(province_confirmed,labels=province,autopct=\'%1.2f%%\') #画饼图(数据,数据对应的标签,百分数保留两位小数点) 4 plt.title("各个省的确诊人数所占比重") 5 6 plt.show()
到这不得不感叹我们国家的疫情管控做的非常的好。非常感谢在疫情中各个岗位艰辛付出的人们!致敬!
4.世界疫情可视化
提取数据
1 df_index_date = df.set_index(\'date\')#将时间作为标签 2 3 date20201208 = df_index_date[\'2020-12-08\':\'2020-12-08\']#取出该数据集最后一日的数据(2020年12月8日) 4 5 world_data = date20201208[date20201208[\'region_class\'] == 0]#提取以国家为单位的数据 6 7 world_data.drop(\'province\',axis=1,inplace=True)#删除省份列 8 world_data.drop(\'city\',axis=1,inplace=True)#删除城市列 9 world_data.drop(\'region_class\',axis=1,inplace=True)#删除地域级别列 10 11 world_data.head(10)
绘制水平柱状图,水平柱状图在y轴可以通过滚轮形式存放更多单位
1 world_country = np.array(world_data[\'country\'])#提取城市 2 world_confirmed = np.array(world_data[\'confirmed\'])#提取所有病例 3 world_cured = np.array(world_data[\'cured\'])#提取治愈病例 4 world_dead = np.array(world_data[\'dead\'])#提取死亡病例 5 world_now = np.array(world_data[\'now\'])#提取现存病例 6 world_death_ratio = np.array(world_data[\'death_ratio\'])#提取死亡率 7 world_cure_ratio = np.array(world_data[\'cure_ratio\'])#提取治愈率 8 9 #水平柱状图 10 plt.figure(figsize=(13,50)) #图像大小 11 plt.barh(world_country,world_confirmed, label="全世界记录的确诊人数") 12 plt.legend() 13 plt.show()
感觉并没有达到自己预想的样子,于是我决定将疫情数据进行排序
1 #此图看起来非常不美观,没有预想的效果,先将确诊人数进行排序 2 3 world_data_order = world_data.sort_index(axis = 0,by = \'confirmed\',ascending = True) 4 5 world_country_order = np.array(world_data_order[\'country\'])#提取国家 6 world_confirmed_order = np.array(world_data_order[\'confirmed\'])#提取所有病例 7 8 #水平柱状图 9 plt.figure(figsize=(13,50)) #图像大小 10 plt.barh(world_country_order,world_confirmed_order, label="全世界记录的确诊人数") 11 plt.legend() 12 plt.show()
这样就可以非常明显的看出世界疫情的情况。最后制作一张我一直想了解的图,全世界死亡率图
1 world_country_order = np.array(world_data_order[\'country\'])#提取国家 2 world_death_ratio = np.array(world_data[\'death_ratio\'])#提取死亡率 3 4 plt.figure(figsize=(13,50)) #图像大小 5 plt.barh(world_country_order,world_death_ratio, label="全世界记录的死亡率") 6 plt.legend() 7 plt.show()
该图的作用就不深说了。
接下来是完整代码:
1 import numpy as np 2 import pandas as pd 3 import matplotlib.pyplot as plt 4 import seaborn as sns 5 from datetime import datetime 6 7 #图片中显示中文 8 from pylab import * 9 mpl.rcParams[\'font.sans-serif\'] = [\'SimHei\'] 10 11 #读取数据集 12 filename = \'Wuhan-2019-nCoV.csv\' 13 df = pd.read_csv(filename) 14 15 #数据清洗 16 17 #添加几行关键数据 18 df[\'now\'] = df.confirmed-df.cured-df.dead#现存确诊 19 df[\'death_ratio\'] = df[\'dead\']/df[\'confirmed\']#死亡率 20 df[\'cure_ratio\'] = df[\'cured\']/df[\'confirmed\']#治愈率 21 22 #添加一列,region_class,判断行政级别的数据 23 df[\'region_class\'] = 0 # 国家 24 df.loc[pd.isnull(df.province) == False , \'region_class\' ] = 1 # 省 25 df.loc[pd.isnull(df.city) == False , \'region_class\' ] = 2 # 市 26 27 #将date格式转化为datetime 28 df[\'date\'].astype(\'datetime64\') 29 30 #将时间作为标签 31 #df = df.set_index(\'date\')#暂时不需要 32 33 df.drop(\'provinceCode\',axis=1,inplace=True)#删除邮政编码列,对本次实验无用数据 34 df.drop(\'cityCode\',axis=1,inplace=True)#删除城市邮政编码列,对本次实验无用数据 35 df.drop(\'countryCode\',axis=1,inplace=True)#删除国家简写列,对本次实验无用数据 36 df.drop(\'suspected\',axis=1,inplace=True)#删除疑似病例列,该数据集没有录入疑似病例 37 38 #删除重复数据 39 df = df.drop_duplicates() 40 41 #空值处理:由于本数据集的空值表示最低地区级别,即城市为空则为省级数据,省级为空则为*数据,都是有意义的,所以不处理空值 42 43 #空格处理 44 df[\'date\']=df[\'date\'].map(str.strip) 45 df[\'country\']=df[\'country\'].map(str.strip) 46 #now列和region_class列是新增列,不用进行空格处理 47 48 df.head(10) 49 50 #数据清洗查询无用数据 51 df[\'confirmed\'].isnull().value_counts()#查询是否有确诊人数为0的异常值 52 df[\'date\'].isnull().value_counts()#查询是否有无日期的异常行数据 53 df[\'country\'].isnull().value_counts()#查询是否有无国家名的异常行 54 #结果为全数据都是False,即没有出现非数据类的错误数据 55 56 #异常值处理 57 df.describe() 58 #发现现存人数为负数的异常值 59 60 #发现问题:在现存一栏中发现最小值出现-7.330000e+02,对此进行排查 61 df[df[\'now\']<0]#显示现存人数为负数值得行 62 63 #经过对数据的分析和查阅资料后了解到有些病例治愈了未公布来源 64 #还有个别地区出现数据错误,外国苏里南也出现了数据错误,对此将对这些负数值赋为0 65 df.loc[df[df[\'now\']<=0].index,[\'now\']]=0 66 67 #data.loc[data[(data[\'B\']>=5)&(data[\'B\']<=8)].index,[\'B\']]=0 68 69 df[\'death_ratio\'] = df[\'dead\']/df[\'confirmed\']#死亡率 70 df[\'cure_ratio\'] = df[\'cured\']/df[\'confirmed\']#治愈率 71 72 df[df[\'now\']<0] 73 74 #再次查看 75 df.describe() 76 77 #折线图最能直观的表现出数据的变化 78 wuhan_df = df[df[\'city\'] == \'武汉市\']#提取出武汉市数据 79 wuhan_df = wuhan_df[wuhan_df[\'date\'] < \'2020-04-08\']#提取出武汉市解封前的数据 80 81 #提取数据 82 wuhan_date = np.array(wuhan_df[\'date\'])#提取时间 83 wuhan_confirmed = np.array(wuhan_df[\'confirmed\'])#提取所有新冠病例 84 wuhan_cured = np.array(wuhan_df[\'cured\'])#提取治愈病例 85 wuhan_dead = np.array(wuhan_df[\'dead\'])#提取死亡病例 86 wuhan_now = np.array(wuhan_df[\'now\'])#提取现存病例 87 88 #绘制死亡病例、治愈病例、所有病例、现存病例的折线图 89 plt.figure(figsize=(100,30)) 90 plt.xlabel("日期") 91 plt.ylabel("人数") 92 plt.plot(wuhan_date,wuhan_dead,linewidth=5.0,c=\'k\',label="死亡病例") 93 plt.show() 94 95 plt.figure(figsize=(100,30)) 96 plt.xlabel("日期") 97 plt.ylabel("人数") 98 plt.plot(wuhan_date,wuhan_cured,linewidth=5.0,c=\'r\',label="治愈病例") 99 plt.show() 100 101 plt.figure(figsize=(100,30)) 102 plt.xlabel("日期") 103 plt.ylabel("人数") 104 plt.plot(wuhan_date,wuhan_confirmed,linewidth=5.0,c=\'b\',label="所有病例") 105 plt.show() 106 #图片显示,在该数据的后半段程直线,代表着武汉疫情的基本结束 107 #为4月8号解封武汉提供了实际基础 108 109 plt.figure(figsize=(100,30)) 110 plt.xlabel("日期") 111 plt.ylabel("人数") 112 plt.plot(wuhan_date,wuhan_now,linewidth=5.0,c=\'y\',label="现存病例") 113 plt.show() 114 115 #将4个图融汇在一个图中 116 plt.figure(figsize=(100,30)) 117 plt.xlabel("日期") 118 plt.ylabel("人数") 119 plt.plot(wuhan_date,wuhan_dead,linewidth=5.0,c=\'k\',label="死亡病例") 120 plt.plot(wuhan_date,wuhan_cured,linewidth=5.0,c=\'r\',label="治愈病例") 121 plt.plot(wuhan_date,wuhan_confirmed,linewidth=5.0,c=\'b\',label="所有病例") 122 plt.plot(wuhan_date,wuhan_now,linewidth=5.0,c=\'y\',label="现存病例") 123 plt.show() 124 125 #制作全国疫情地图 126 df_index_date = df.set_index(\'date\')#将时间作为标签 127 128 date20201208 = df_index_date[\'2020-12-08\':\'2020-12-08\']#取出该数据集最后一日的数据(2020年12月8日) 129 130 China_data = date20201208[date20201208[\'country\'] == \'中国\']#提取出中国的数据 131 China_data = date20201208[date20201208[\'region_class\'] == 1] 132 province_data = China_data[["province","confirmed"]] 133 134 print(province_data) 135 136 from pyecharts.charts import Map 137 import pyecharts.options as opts 138 from pyecharts.globals import ChartType 139 140 #制作一张中国地图疫情图 141 142 ( 143 Map() 144 .add("",[list(z) for z in zip(list(province_data["province"]), list(province_data["confirmed"]))], "china",is_map_symbol_show=False) 145 .set_global_opts(title_opts=opts.TitleOpts(title="2019_nCoV中国各地区总确诊人数地图"),visualmap_opts=opts.VisualMapOpts(is_piecewise=True, 146 pieces = [ 147 148 {"min": 5000 , "label": \'>5000\',"color": "#893448"}, #不指定 max,表示 max 为无限大 149 {"min": 1000, "max": 4999, "label": \'1000-4999\',"color" : "#ff585e" }, 150 {"min": 500, "max": 999, "label": \'500-1000\',"color": "#fb8146"}, 151 {"min": 101, "max": 499, "label": \'101-499\',"color": "#ffA500"}, 152 {"min": 10, "max": 100, "label": \'10-100\',"color": "#ffb248"}, 153 {"min": 0, "max": 9, "label": \'0-9\',"color" : "#fff2d1" }])) 154 155 ).render_notebook() 156 157 #并没有我想要的效果 158 #分析过后发现到,各个地区的地名是没有市、区这类字的,于是乎接下来的工作是替换掉这些名字 159 #替换可能会有错误,于是干脆直接添加一个列,添加地图可识别的数据,按顺序添加 160 161 province_data[\'tihuan\'] = [ 162 \'北京\',\'天津\',\'河北\',\'山西\',\'内蒙古\', 163 \'辽宁\',\'吉林\',\'黑龙江\',\'上海\',\'江苏\',\'浙江\', 164 \'安徽\',\'福建\',\'江西\',\'山东\',\'河南\',\'湖北\',\'湖南\', 165 \'广东\',\'广西\',\'海南\',\'重庆\',\'四川\',\'贵州\', 166 \'云南\',\'*\',\'陕西\',\'甘肃\',\'青海\',\'宁夏\', 167 \'*\',\'*\',\'香港\',\'澳门\'] 168 169 province_data 170 171 from pyecharts.charts import Map 172 import pyecharts.options as opts 173 from pyecharts.globals import ChartType 174 175 #制作一张中国地图疫情图 176 177 ( 178 Map() 179 .add("",[list(z) for z in zip(list(province_data["tihuan"]), list(province_data["confirmed"]))], "china",is_map_symbol_show=False) 180 .set_global_opts(title_opts=opts.TitleOpts(title="2020_nCoV中国各地区总确诊人数地图"),visualmap_opts=opts.VisualMapOpts(is_piecewise=True, 181 pieces = [ 182 183 {"min": 5000 , "label": \'>5000\',"color": "#893448"}, #不指定 max,表示 max 为无限大 184 {"min": 1000, "max": 4999, "label": \'1000-4999\',"color" : "#ff585e" }, 185 {"min": 500, "max": 999, "label": \'500-1000\',"color": "#fb8146"}, 186 {"min": 101, "max": 499, "label": \'101-499\',"color": "#ffA500"}, 187 {"min": 10, "max": 100, "label": \'10-100\',"color": "#ffb248"}, 188 {"min": 0, "max": 9, "label": \'0-9\',"color" : "#fff2d1" }])) 189 190 ).render_notebook() 191 192 #接下来分析全国疫情情况(以省为单位) 193 194 df_index_date = df.set_index(\'date\')#将时间作为标签 195 196 date20201208 = df_index_date[\'2020-12-08\':\'2020-12-08\']#取出该数据集最后一日的数据(2020年12月8日) 197 198 China_data = date20201208[date20201208[\'country\'] == \'中国\']#提取出中国的数据 199 province_data = date20201208[date20201208[\'region_class\'] == 1]#提取以省份为单位的数据 200 201 province_data.drop(\'country\',axis=1,inplace=True)#删除国家列 202 province_data.drop(\'city\',axis=1,inplace=True)#删除城市列 203 province_data.drop(\'region_class\',axis=1,inplace=True)#删除地域级别列 204 205 province_data.head(10) 206 207 province = np.array(province_data[\'province\'])#提取城市 208 province_confirmed = np.array(province_data[\'confirmed\'])#提取所有病例 209 province_cured = np.array(province_data[\'cured\'])#提取治愈病例 210 province_dead = np.array(province_data[\'dead\'])#提取死亡病例 211 province_now = np.array(province_data[\'now\'])#提取现存病例 212 province_death_ratio = np.array(province_data[\'death_ratio\'])#提取死亡率 213 province_cure_ratio = np.array(province_data[\'cure_ratio\'])#提取治愈率 214 215 #绘制全国各个省份确诊人数柱状图 216 plt.figure(figsize=(100,30)) 217 plt.xlabel("日期") 218 plt.ylabel("人数") 219 plt.bar(province,province_confirmed,linewidth=5.0,label="所有病例") 220 plt.show() 221 222 #绘制全国各个省份治愈病例柱状图 223 plt.figure(figsize=(100,30)) 224 plt.xlabel("日期") 225 plt.ylabel("人数") 226 plt.bar(province,province_cured,linewidth=5.0,label="所有病例") 227 plt.show() 228 229 #绘制全国各个省份死亡病例柱状图 230 plt.figure(figsize=(100,30)) 231 plt.xlabel("日期") 232 plt.ylabel("人数") 233 plt.bar(province,province_dead,linewidth=5.0,label="所有病例") 234 plt.show() 235 236 #绘制全国各个省份现存病例柱状图 237 plt.figure(figsize=(100,30)) 238 plt.xlabel("日期") 239 plt.ylabel("人数") 240 plt.bar(province,province_now,linewidth=5.0,label="所有病例") 241 plt.show() 242 243 #绘制全国各个省份死亡率柱状图 244 plt.figure(figsize=(100,30)) 245 plt.xlabel("日期") 246 plt.ylabel("人数") 247 plt.bar(province,province_death_ratio,linewidth=5.0,label="所有病例") 248 plt.show() 249 250 #绘制全国各个省份治愈率柱状图 251 plt.figure(figsize=(100,30)) 252 plt.xlabel("日期") 253 plt.ylabel("人数") 254 plt.bar(province,province_cure_ratio,linewidth=5.0,label="所有病例") 255 plt.show() 256 257 #各个省的确诊人数所占比重 258 fig = plt.figure() 259 plt.pie(province_confirmed,labels=province,autopct=\'%1.2f%%\') #画饼图(数据,数据对应的标签,百分数保留两位小数点) 260 plt.title("各个省的确诊人数所占比重") 261 262 plt.show() 263 264 #接下来分析世界疫情情况 265 266 df_index_date = df.set_index(\'date\')#将时间作为标签 267 268 date20201208 = df_index_date[\'2020-12-08\':\'2020-12-08\']#取出该数据集最后一日的数据(2020年12月8日) 269 270 world_data = date20201208[date20201208[\'region_class\'] == 0]#提取以国家为单位的数据 271 272 world_data.drop(\'province\',axis=1,inplace=True)#删除省份列 273 world_data.drop(\'city\',axis=1,inplace=True)#删除城市列 274 world_data.drop(\'region_class\',axis=1,inplace=True)#删除地域级别列 275 276 world_data.head(10) 277 278 world_country = np.array(world_data[\'country\'])#提取城市 279 world_confirmed = np.array(world_data[\'confirmed\'])#提取所有病例 280 world_cured = np.array(world_data[\'cured\'])#提取治愈病例 281 world_dead = np.array(world_data[\'dead\'])#提取死亡病例 282 world_now = np.array(world_data[\'now\'])#提取现存病例 283 world_death_ratio = np.array(world_data[\'death_ratio\'])#提取死亡率 284 world_cure_ratio = np.array(world_data[\'cure_ratio\'])#提取治愈率 285 286 #水平柱状图 287 plt.figure(figsize=(13,50)) #图像大小 288 plt.barh(world_country,world_confirmed, label="全世界记录的确诊人数") 289 plt.legend() 290 plt.show() 291 292 #此图看起来非常不美观,没有预想的效果,先将确诊人数进行排序 293 294 world_data_order = world_data.sort_index(axis = 0,by = \'confirmed\',ascending = True) 295 296 world_country_order = np.array(world_data_order[\'country\'])#提取国家 297 world_confirmed_order = np.array(world_data_order[\'confirmed\'])#提取所有病例 298 299 #水平柱状图 300 plt.figure(figsize=(13,50)) #图像大小 301 plt.barh(world_country_order,world_confirmed_order, label="全世界记录的确诊人数") 302 plt.legend() 303 plt.show() 304 305 world_country_order = np.array(world_data_order[\'country\'])#提取国家 306 world_death_ratio = np.array(world_data[\'death_ratio\'])#提取死亡率 307 308 plt.figure(figsize=(13,50)) #图像大小 309 plt.barh(world_country_order,world_death_ratio, label="全世界记录的死亡率") 310 plt.legend() 311 plt.show()
四、总结
1.一直都在说我们国家的抗疫是世界楷模,是世界上闭卷的情况下做的最好的。通过本次的实验,我深深的感受到了我们国家和人民对待疫情时的万众一心,快一年的时间就把疫情几乎扼杀,为疫苗的研发腾出了时间。我自认为这次实验并没有达到预期的目标,可能是因为我得到的数据集不是很完善,少了很多我想调查的数据。
2.通过这学期的python学习,让我窥见了强大的python一个角落。python的众多库可以实现众多的功能,不局限于python本身。每当接触一个库相当于重新学习代码,但是总体框架不变,类似于学完c语言后再学习java一样,内核都相同,学起来也不会很难。