2020年“泰迪杯”数据分析职业技能大赛B题疫情数据分析
一、背景
2020年1月新型冠状病毒(以下简称新冠)肺炎在极短时间内就在全球范围内大规模流行,据美国约翰斯·霍普金斯大学11月8日发布的新冠疫情最新统计数据显示,截至美国东部时间11月8日11时24分全球累计确诊人数超过5000万,死亡人数超过125万。由于新冠病毒的传播速度快、致死率较高,世界卫生组织称新冠是百年一遇的人类公敌。自新冠肺炎爆发以来,面对社会对疫情信息的迫切需求,各级政府部门通过多种渠道及时发布第一手相关数据,许多组织和个人也迅速行动,利用多种分析手段为公众提供疫情数据的解读分析,以消除公众的恐慌情绪,提高人们的自我防护意识,配合政府的防疫措施,为我国最终打赢疫情防控阻击战发挥了巨大的推动作用。
本赛题提供收集自网络并经过适当处理的有关新冠疫情的数据,仅供本次竞赛使用,并不确保数据的真实性和准确性。
二、目标
对疫情数据进行简单的统计。
设计可视化数字大屏展示新冠疫情的时空变化情况。
使用可视化工具绘制城市疫情风险图。
对国内的疫情变化情况进行分析。
三、任务
为统一分析标准,假设国内的新冠确诊病人都入院收治,被传染者有5天的潜伏期,被传染3天后具备传染性。例如:2月1日被传染,2月6日开始出现症状,并被确诊,2月4日开始具备传染性。
请根据附件1中提供的数据,自行选择分析工具完成以下任务,并撰写报告。
任务1数据的基本处理:
任务1.1
根据附件1“城市疫情”中的数据统计各城市自首次通报确诊病例后至6月30日的每日累计确诊人数、累计治愈人数和累计死亡人数,将结果保存为“task1_1.csv”,第一行为字段名,按城市、日期、累计确诊人数、累计治愈人数、累计死亡人数的次序分别放在A列~E列。在论文中给出实现方法的相关描述,并列表给出武汉、深圳、保定每月10、25日的统计结果。
我们发现城市疫情数据表中并不是每一天都有对应的数据,有些天数的数据是缺失的。通过观察数据表,我们判断得到结论:缺失的数据行是因为该区域当天无新增的确诊、死亡或是治愈病例。因此要对缺失数据进行补充
import pandas as pd
import numpy as np
from datetime import datetime#xlrd 1.2以上的版本不能读取xlsx格式的文件,只能读取xls,设置engine='openpyxl'即可打开
data=pd.ExcelFile('D:/Python数据分析与挖掘实战/赛题B-新冠疫情数据分析/附件1.xlsx',engine='openpyxl')
#提取‘城市疫情’表
city_pan=data.parse('城市疫情')
#查看前5行数据
print(city_pan.head())out:日期 城市 新增确诊 新增治愈 新增死亡
0 2020-01-10 武汉 41 2 1
1 2020-01-11 武汉 0 4 0
2 2020-01-12 武汉 0 1 0
3 2020-01-15 武汉 0 5 1
4 2020-01-16 武汉 4 3 0#查看数据信息,及每列的数据格式print(city_pan.info())out:<class 'pandas.core.frame.DataFrame'>
RangeIndex: 10245 entries, 0 to 10244
Data columns (total 5 columns):# Column Non-Null Count Dtype
--- ------ -------------- ----- 0 日期 10245 non-null datetime64[ns]1 城市 10245 non-null object 2 新增确诊 10245 non-null int64 3 新增治愈 10245 non-null int64 4 新增死亡 10245 non-null int64
dtypes: datetime64[ns](1), int64(3), object(1)
memory usage: 400.3+ KBend_date=datetime(2020,6,30)
#根据城市分组,找到每个城市首次出现病例的开始日期
start_date=city_pan.groupby('城市')['日期'].min()
start_date=start_date.reset_index(drop=False)
print(start_date)out:城市 日期
0 七台河 2020-01-26
1 万宁 2020-01-22
2 万州区 2020-01-21
3 万盛经开区 2020-02-06
4 三亚 2020-01-22
.. ... ...
439 黔南州 2020-01-22
440 黔江区 2020-01-27
441 黔西南州 2020-01-25
442 齐齐哈尔 2020-01-25
443 龙岩 2020-01-28city_len = start_date.shape[0]
df_inter=pd.DataFrame()lis4=[]
lis3=[]
for index,row in start_date.iterrows():#生成开始日期到6-30之间的所有日期lis1=pd.date_range(row['日期'],end_date)lis2=[row['城市']]*len(lis1)lis4.extend(lis2)lis3.extend(lis1)df_inter['日期']=lis3
df_inter['城市']=lis4
print(df_inter.head(5))out:日期 城市
0 2020-01-26 七台河
1 2020-01-27 七台河
2 2020-01-28 七台河
3 2020-01-29 七台河
4 2020-01-30 七台河#计算累计确诊人数
city_pan['累计确诊人数']=city_pan['新增确诊'].groupby(city_pan['城市']).cumsum()
city_pan['累计自愈人数']=city_pan['新增治愈'].groupby(city_pan['城市']).cumsum()
city_pan['累计死亡人数']=city_pan['新增死亡'].groupby(city_pan['城市']).cumsum()
col=['城市','日期','累计确诊人数','累计自愈人数','累计死亡人数']
task=city_pan.loc[:,col]
print(task)out:城市 日期 累计确诊人数 累计自愈人数 累计死亡人数
0 武汉 2020-01-10 41 2 1
1 武汉 2020-01-11 41 6 1
2 武汉 2020-01-12 41 7 1
3 武汉 2020-01-15 41 12 2
4 武汉 2020-01-16 45 15 2#将两张表左连接,生成全量日期的数据
task=df_inter.merge(task,on=['日期','城市'],how='left')
#缺失值填充为距离最近日期的非缺失数据
task.fillna(method='ffill',inplace=True)
print(task.info())out:<class 'pandas.core.frame.DataFrame'>
Int64Index: 68578 entries, 0 to 68577
Data columns (total 5 columns):# Column Non-Null Count Dtype
--- ------ -------------- ----- 0 日期 68578 non-null datetime64[ns]1 城市 68578 non-null object 2 累计确诊人数 68578 non-null float64 3 累计自愈人数 68578 non-null float64 4 累计死亡人数 68578 non-null float64
dtypes: datetime64[ns](1), float64(3), object(1)
memory usage: 3.1+ MB#输出保存为csv格式
task.to_csv('task1_1.csv')
df=task.loc[task['城市'].isin(['武汉','深圳','保定'])]
#切片找到日期以10,25结束的日期
df['temp']=df['日期'].apply(lambda x :1 if str(x)[8:10] in ['10','25'] else 0)
df=df.loc[df['temp']==1]
df=df.reset_index(drop=True)
#删除临时列
df=df.drop('temp',axis=1)
print(df)out:日期 城市 累计确诊人数 累计自愈人数 累计死亡人数
0 2020-01-25 保定 3.0 0.0 0.0
1 2020-02-10 保定 30.0 9.0 0.0
2 2020-02-25 保定 32.0 32.0 0.0
3 2020-03-10 保定 32.0 32.0 0.0
4 2020-03-25 保定 32.0 32.0 0.0
5 2020-04-10 保定 32.0 32.0 0.0
6 2020-04-25 保定 32.0 32.0 0.0
7 2020-05-10 保定 32.0 32.0 0.0
8 2020-05-25 保定 32.0 32.0 0.0
9 2020-06-10 保定 32.0 32.0 0.0
10 2020-06-25 保定 45.0 33.0 0.0
11 2020-01-10 武汉 41.0 2.0 1.0
12 2020-01-25 武汉 618.0 40.0 45.0
13 2020-02-10 武汉 18454.0 1173.0 748.0
14 2020-02-25 武汉 47441.0 12026.0 2085.0
15 2020-03-10 武汉 49978.0 33264.0 2423.0
16 2020-03-25 武汉 50006.0 44020.0 2531.0
17 2020-04-10 武汉 50008.0 46154.0 2577.0
18 2020-04-25 武汉 50333.0 46452.0 3869.0
19 2020-05-10 武汉 50339.0 46464.0 3869.0
20 2020-05-25 武汉 50340.0 46465.0 3869.0
21 2020-06-10 武汉 50340.0 46471.0 3869.0
22 2020-06-25 武汉 50340.0 46471.0 3869.0
23 2020-01-25 深圳 27.0 2.0 0.0
24 2020-02-10 深圳 375.0 56.0 0.0
25 2020-02-25 深圳 417.0 262.0 3.0
26 2020-03-10 深圳 417.0 387.0 3.0
27 2020-03-25 深圳 417.0 414.0 3.0
28 2020-04-10 深圳 419.0 414.0 3.0
29 2020-04-25 深圳 422.0 414.0 3.0
30 2020-05-10 深圳 423.0 414.0 3.0
31 2020-05-25 深圳 423.0 414.0 3.0
32 2020-06-10 深圳 423.0 414.0 3.0
33 2020-06-25 深圳 423.0 414.0 3.0df.to_csv('武汉,深圳,保定每月10,25统计.csv')
- 任务1.2
根据任务1.1的结果,并结合附件1“城市省份对照表”统计各省级行政单位按日新增和累计数据,将结果保存为“task1_2.csv”,第一行为字段名,按省份、日期、新增确诊人数、新增治愈人数、新增死亡人数、累计确诊人数、累计治愈人数、累计死亡人数的次序分别放在A列~H列。在论文中给出实现方法的相关描述,并列表给出湖北、广东、河北每月15日的统计结果。
import pandas as pd
import numpy as np
from datetime import datetime
#有中文,用gbk打开不会乱码
task1 = pd.read_csv('task1_1.csv', encoding='gbk')
data = pd.ExcelFile('附件1.xlsx', engine='openpyxl')
# 提取‘城市疫情’表
city_pan = data.parse('城市疫情')
province_city = data.parse('城市省份对照表')
print(task1.head())out:Unnamed: 0 日期 城市 累计确诊人数 累计自愈人数 累计死亡人数
0 0 2020/1/26 七台河 1 0 0
1 1 2020/1/27 七台河 2 0 0
2 2 2020/1/28 七台河 2 0 0
3 3 2020/1/29 七台河 2 0 0
4 4 2020/1/30 七台河 3 0 0#将task1任务表和城市省份对照表左连接
task2 = task1.merge(province_city, on='城市', how='left')
print(task2.head())out:Unnamed: 0 日期 城市 累计确诊人数 累计自愈人数 累计死亡人数 省份
0 0 2020/1/26 七台河 1 0 0 黑龙江
1 1 2020/1/27 七台河 2 0 0 黑龙江
2 2 2020/1/28 七台河 2 0 0 黑龙江
3 3 2020/1/29 七台河 2 0 0 黑龙江
4 4 2020/1/30 七台河 3 0 0 黑龙江#由于task2日期是obeject类型,city_pan中日期是datetime类型,不能连接,因此要统一成datetime类型
task2['日期'] = task2['日期'].apply(lambda x: pd.to_datetime(x))result = task2.merge(city_pan, on=['城市', '日期'], how='left')
#左连接之后,有些日期没有新增确诊,新增治愈,新增死亡,需要填充为0
result = result.fillna(value=0)
result = result.drop('Unnamed: 0', axis=1)
#根据省份分类求和
total = result.groupby(['省份', '日期']).sum()
# 将索引改变为正常的列名
total.reset_index(drop=False, inplace=True)
#输出文件
total.to_csv('task1.2.csv')part = total.loc[total['省份'].isin(['湖北', '广东', '河北'])]
#设置临时变量,找到每个月的15号
part['temp'] = part['日期'].apply(lambda x: 1 if str(x)[8:10] in ['15'] else 0)
part=part.loc[part['temp'] == 1]
#按照指定顺序输出
col_name=['省份','日期','新增确诊','新增治愈','新增死亡','累计确诊人数','累计治愈人数','累计死亡人数']
part=part.loc[:,col_name]
print(part)out:省份 日期 新增确诊 新增治愈 新增死亡 累计确诊人数 累计治愈人数 累计死亡人数
1970 广东 2020-02-15 22.0 50.0 0.0 1316 434 2
1999 广东 2020-03-15 4.0 5.0 0.0 1361 1292 8
2030 广东 2020-04-15 5.0 0.0 0.0 1571 1392 8
2060 广东 2020-05-15 0.0 0.0 0.0 1589 1392 8
2091 广东 2020-06-15 3.0 0.0 0.0 1628 1394 8
2775 河北 2020-02-15 9.0 14.0 0.0 300 100 3
2804 河北 2020-03-15 0.0 0.0 0.0 318 310 6
2835 河北 2020-04-15 1.0 1.0 0.0 328 314 6
2865 河北 2020-05-15 0.0 0.0 0.0 328 319 6
2896 河北 2020-06-15 4.0 0.0 0.0 332 320 6
3403 湖北 2020-01-15 0.0 5.0 1.0 41 12 2
3434 湖北 2020-02-15 1839.0 849.0 139.0 56197 5860 1596
3463 湖北 2020-03-15 4.0 816.0 14.0 67798 55247 3099
3494 湖北 2020-04-15 0.0 33.0 0.0 67803 63477 3222
3524 湖北 2020-05-15 0.0 0.0 0.0 68134 63616 4512
3555 湖北 2020-06-15 0.0 0.0 0.0 68135 63623 4512
- 任务1.3
根据任务1.2的结果,统计各省级行政单位每天新冠病人的住院人数,将结果保存为“task1_3.csv”,第一行为字段名,按省份、日期、住院人数的次序分别放在A列~C列。在论文中给出实现方法的相关描述,并列表给出湖北、广东、上海每月20日的统计结果。
import pandas as pd
import numpy as np
from datetime import datetime
task3 = pd.read_csv('task1.2.csv',encoding='utf-8')task3['住院人数']=task3['累计确诊人数']-task3['累计治愈人数']-task3['累计死亡人数']
print(task3.head())out:Unnamed: 0 省份 日期 累计确诊人数 累计治愈人数 累计死亡人数 新增确诊 新增治愈 新增死亡 住院人数
0 0 上海 2020-01-20 1 0 0 1.0 0.0 0.0 1
1 1 上海 2020-01-21 1 0 0 0.0 0.0 0.0 1
2 2 上海 2020-01-22 1 0 0 0.0 0.0 0.0 1
3 3 上海 2020-01-23 1 0 0 0.0 0.0 0.0 1
4 4 上海 2020-01-24 1 1 0 0.0 1.0 0.0 0col=['省份','日期','住院人数']
task=task3.loc[:,col]
print(task)out:省份 日期 住院人数
0 上海 2020-01-20 1
1 上海 2020-01-21 1
2 上海 2020-01-22 1
3 上海 2020-01-23 1
4 上海 2020-01-24 0
... ... ... ...
5490 黑龙江 2020-06-26 0
5491 黑龙江 2020-06-27 0
5492 黑龙江 2020-06-28 0
5493 黑龙江 2020-06-29 0
5494 黑龙江 2020-06-30 0[5495 rows x 3 columns]task['temp']=task['日期'].apply(lambda x : 1 if str(x)[8:10] in ['20'] else 0)
task=task.loc[task['temp']==1]
task=task.loc[:,col]
part=task.loc[task['省份'].isin (['湖北','广东','上海'])]
print(part)out:省份 日期 住院人数
0 上海 2020-01-20 1
31 上海 2020-02-20 135
60 上海 2020-03-20 55
91 上海 2020-04-20 115
121 上海 2020-05-20 30
152 上海 2020-06-20 38
1944 广东 2020-01-20 14
1975 广东 2020-02-20 665
2004 广东 2020-03-20 89
2035 广东 2020-04-20 182
2065 广东 2020-05-20 191
2096 广东 2020-06-20 232
3408 湖北 2020-01-20 239
3439 湖北 2020-02-20 48725
3468 湖北 2020-03-20 5602
3499 湖北 2020-04-20 102
3529 湖北 2020-05-20 7
3560 湖北 2020-06-20 0
- 任务1.4
假设新冠病人的传播半径为1 km,根据附件1“A市涉疫场所”在平面图中分别绘制该市第6天和第10天的疫情传播风险区域,并在论文中给出分析和实现过程。
我们以第 6 天为例,讨论如何确定疫情传播风险区域。结合被传染者有 5 天潜伏期,被传染后第 4 天开始具有传染性。 A 市第 6 日的疫情传播风险区域应该是前 6 日发生疫情场所的疫情传播风险区域再加上 7日、 8 日发生疫情场所的疫情传播风险区域。这是因为 7 日确诊的患者从 5 日开始已经具有了传染性,而 8 日确诊的患者从 6 日开始已经具有了传染性。根据此,我们绘制出了 A 市第 6 日疫情传播风险区域示意图
同理可以确定 A 市第 10 日的疫情传播风险区域,并且此时的距离 1 日并不满足大于两个周期的条件,因此不需要考虑疫情传播风险区域解除。由此绘制出了 A 市第 10 日疫情传播风险区域示意图
任务2数字大屏设计:
任务2.1设计数字大屏,展示国内新冠疫情汇总概要信息、时空变化情况、重点关注区域等。在论文中附上截图,并给出相关的设计思路。
任务2.2设计数字大屏,展现并分析国际疫情态势和发展变化。在论文中附上截图,并给出相关的分析和设计思路。
2020年“泰迪杯”数据分析职业技能大赛B题疫情数据分析相关推荐
- 记第一次Python数据分析练习——2018年“泰迪杯”数据分析职业技能大赛B题(2021/5/20)
文章目的 本人目前是应用统计专业大二(2021/5/20)的本科生,上学期上过Python课,但说实话讲的不深,过了一个学期也基本上忘光了. 最近深刻地觉得计算机专业真是好啊,以后我也要当程序员.JP ...
- 2020年泰迪杯C题智慧政务中的文本数据挖掘应用--论文+全部源码分享
5.2问题二模型的建立与求解 本题要求针对热点问题进行挖掘,主要目的是从群众留言中挖掘出热点问题.也就是给每一条留言都量化一个热度指数.并且根据热度指数进行排序,从而获取热度较高的评价问题.对于问题热 ...
- 【2023年第十一届泰迪杯数据挖掘挑战赛】B题:产品订单的数据分析与需求预测 23页论文及实现代码
[2023年第十一届泰迪杯数据挖掘挑战赛]B题:产品订单的数据分析与需求预测 23页论文及实现代码 相关链接 (1)建模方案 [2023年第十一届泰迪杯数据挖掘挑战赛]B题:产品订单的数据分析与需求预 ...
- 【2023年第十一届泰迪杯数据挖掘挑战赛】B题:产品订单的数据分析与需求预测 建模及python代码详解 问题一
相关链接 [2023年第十一届泰迪杯数据挖掘挑战赛]B题:产品订单的数据分析与需求预测 建模及python代码详解 问题一 [2023年第十一届泰迪杯数据挖掘挑战赛]B题:产品订单的数据分析与需求预测 ...
- 【2023年第十一届泰迪杯数据挖掘挑战赛】B题:产品订单的数据分析与需求预测 建模及python代码详解 问题二
相关链接 [2023年第十一届泰迪杯数据挖掘挑战赛]B题:产品订单的数据分析与需求预测 建模及python代码详解 问题一 [2023年第十一届泰迪杯数据挖掘挑战赛]B题:产品订单的数据分析与需求预测 ...
- 【第十一届泰迪杯数据挖掘挑战赛】A 题:新冠疫情防控数据的分析 思路+代码(持续更新)
[第十一届泰迪杯数据挖掘挑战赛]A 题:新冠疫情防控数据的分析 思路+代码(持续更新) 问题背景 解决问题 代码下载 数据分析 Task1 Task2 Task 3 问题背景 自 2019 年底至今, ...
- 【2023年第十一届泰迪杯数据挖掘挑战赛】A题:新冠疫情防控数据的分析 32页和40页论文及实现代码
[2023年第十一届泰迪杯数据挖掘挑战赛]A题:新冠疫情防控数据的分析 32页和40页论文及实现代码 相关链接 (1)建模方案 [2023年第十一届泰迪杯数据挖掘挑战赛]A题:新冠疫情防控数据的分析 ...
- 【第十届“泰迪杯”数据挖掘挑战赛】B题:电力系统负荷预测分析 31页省一等奖论文及代码
相关链接 (1)[第十届"泰迪杯"数据挖掘挑战赛]B题:电力系统负荷预测分析 问题一Baseline方案 (2)[第十届"泰迪杯"数据挖掘挑战赛]B题:电力系统 ...
- 【2023年第十一届泰迪杯数据挖掘挑战赛】C题:泰迪内推平台招聘与求职双向推荐系统构建 建模及python代码详解 问题一
相关链接 [2023年第十一届泰迪杯数据挖掘挑战赛]C题泰迪内推平台招聘与求职双向推荐系统构建 建模及python代码详解 问题一 [2023年第十一届泰迪杯数据挖掘挑战赛]C题泰迪内推平台招聘与求职 ...
最新文章
- 在Ubuntu 14.04 64bit上使用JBL Charge2+无线蓝牙音箱听歌指南
- Android提醒:Dialog,Toast,Snackbar
- 我眼中的Linux设备树(四 中断)
- 168. Excel Sheet Column Title
- Kibana远程代码执行漏洞攻击方法和漏洞原理分析
- 移动端前端常见的触摸相关事件touch、tap、swipe等整理
- long类型python_Python如何管理int和long?
- vba动态二维数组_VBA实战技巧05: 动态调整数组以存储所需数据
- SAP Spartacus里的WindowRef对象
- pip与conda简述
- WPF 界面提示加载出错
- Hiberbate中的一对多关联查询
- Dapper and Repository Pattern in MVC
- 你做不到对企业真正有价值,下一个裁员就是你
- static,inline,volatile的作用
- 从程序员到项目经理(9):程序员加油站 -- 再牛也要合群
- 尔雅 2017大学计算机基础答案,2018超星尔雅大学计算机基础答案
- excel怎么合并同类项数据并求和(去除重复项)
- CAT分布式监控系统(一):CAT功能介绍 CAT监控系统是什么、能做什么?
- c语言共阴极数码管数字6,共阴数码管 显示数字 C语言程序