Python高级应用课程设计作业——疫情大数据分析与可视化

时间:2024-02-21 19:55:40

一、选题背景

  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一样,内核都相同,学起来也不会很难。