【Python数据分析】新冠肺炎数据--分析二

2、疫情数据分析(二)

Δ本篇主要知识点:(1)pandas一阶差分、重采样、数据重塑、分组、数据合并、isin函数、空DataFrame循环添加行;(2)seaborn绘图。

1 import pandas as pd
2 import matplotlib.pyplot as plt
3 import seaborn as sns
4 from datetime import datetime
1 #将matplotlib的默认字体改为仿宋,以在图形中显示中文。
2 plt.rcParams['font.sans-serif']=['fangsong']
3 #在多语种情形下正确显示负号
4 plt.rcParams['axes.unicode_minus']=False
5 #解决matplotlib抛出的max_open_warning
6 plt.rcParams.update({'figure.max_open_warning': 0})
1 covid_cases_cumsum=pd.read_csv(r'C:\Users\92342\Desktop\python\Python数据分析学习之路\1、疫情数据\covid_cases_cumsum.csv',\
2                                parse_dates=[0],index_col=[0])
3 print(covid_cases_cumsum.head())
               全国  北京  天津  河北  山西  内蒙古  辽宁  吉林  黑龙江   上海  ...  重庆  四川  贵州  云南  \
2020-01-16    NaN NaN NaN NaN NaN  NaN NaN NaN  NaN  NaN  ... NaN NaN NaN NaN   
2020-01-17    NaN NaN NaN NaN NaN  NaN NaN NaN  NaN  NaN  ... NaN NaN NaN NaN   
2020-01-18    NaN NaN NaN NaN NaN  NaN NaN NaN  NaN  NaN  ... NaN NaN NaN NaN   
2020-01-19    NaN NaN NaN NaN NaN  NaN NaN NaN  NaN  0.0  ... NaN NaN NaN NaN   
2020-01-20  291.0 NaN NaN NaN NaN  NaN NaN NaN  NaN  2.0  ... NaN NaN NaN NaN   

            西藏  陕西  甘肃  青海  宁夏   新疆  
2020-01-16 NaN NaN NaN NaN NaN  NaN  
2020-01-17 NaN NaN NaN NaN NaN  NaN  
2020-01-18 NaN NaN NaN NaN NaN  NaN  
2020-01-19 NaN NaN NaN NaN NaN  0.0  
2020-01-20 NaN NaN NaN NaN NaN  0.0  

[5 rows x 32 columns]

  

问题3:每日确诊病例数据走势如何?

使用一阶差分函数pandas.diff(),由累计值转变为单日值。

1 covid_cases_everyday=covid_cases_cumsum.diff(periods=1,axis=0)
1 #使用seaborn.lineplot()绘制全国确诊病例每日数据的变化
2 fig,ax=plt.subplots()
3 ax=sns.lineplot(data=covid_cases_everyday['全国'])
4 ax.set_title('新冠肺炎每日确诊病例:全国')
5 ax.set_ylabel('确诊病例')
6 fig.tight_layout()
7 plt.show()

1 #查看新冠肺炎确诊病例日均值
2 covid_cases=covid_cases_everyday['全国'].sum()
3 covid_cases
85381.0

 

从每日数据变化图看,新冠肺炎每日确诊病例迅速上升再迅速下降,可见疫情发展之猛烈、防控力度之大。

 

问题4:各月确诊病例最多的省份是哪里?

1 #按月重采样,采样方式为汇总
2 covid_cases_by_month=covid_cases_everyday.resample('M').sum()

注意到数据集是“宽数据”(并非每列都是变量,与疫情病例相关的值按地区分布在多列中),可将数据重塑为“长数据”,即进行逆透视/融合/聚合处理。

1 #先将covid_cases_by_month的DatetimeIndex设为一列,名为month
2 covid_cases_by_month['month']=covid_cases_by_month.index
3 #对covid_cases_by_month使用pd.melt()方法,month列保持原样,融合后的新列名为area,融合后新列的值名为count
4 covid_cases_by_month_long=pd.melt(covid_cases_by_month,id_vars='month',var_name='area',value_name='count')
1 #由于全国数据包含了各省数据,因此先分拆为全国数据、各省数据集2个数据集。
2 covid_month_country=covid_cases_by_month_long[covid_cases_by_month_long['area']=='全国']
3 covid_month_province=covid_cases_by_month_long[~(covid_cases_by_month_long['area']=='全国')]
1 #利用groupby方法获取各省月度的最大值,再使用pd.isin()方法筛选出月度数据最大的省份
2 max_of_month=covid_month_province.groupby('month')['count'].max()
3 covid_month_max_province=covid_month_province[covid_month_province['count'].isin(list(max_of_month))]
4 covid_month_max_province.sort_values(by='month')
    month    area    count
170    2020-01-31    湖北    7108.0
171    2020-02-29    湖北    59754.0
172    2020-03-31    湖北    895.0
83    2020-04-30    黑龙江    460.0
74    2020-05-31    吉林    44.0
15    2020-06-30    北京    329.0
316    2020-07-31    新疆    563.0
317    2020-08-31    新疆    263.0
98    2020-09-30    上海    102.0
278    2020-09-30    陕西    44.0
99    2020-10-31    上海    79.0
    month    area    count
170    2020-01-31    湖北    7108.0
171    2020-02-29    湖北    59754.0
172    2020-03-31    湖北    895.0
83    2020-04-30    黑龙江    460.0
74    2020-05-31    吉林    44.0
15    2020-06-30    北京    329.0
316    2020-07-31    新疆    563.0
317    2020-08-31    新疆    263.0
98    2020-09-30    上海    102.0
278    2020-09-30    陕西    44.0
99    2020-10-31    上海    79.0
1 #使用pd.merge()方法合并全国、各省2个数据集
2 covid_month_country_whole=covid_month_country.merge(covid_month_max_province,left_on='month',right_on='month')
3 covid_month_country_whole
    month    area_x    count_x    area_y    count_y
0    2020-01-31    全国    11499.0    湖北    7108.0
1    2020-02-29    全国    68034.0    湖北    59754.0
2    2020-03-31    全国    1730.0    湖北    895.0
3    2020-04-30    全国    1320.0    黑龙江    460.0
4    2020-05-31    全国    143.0    吉林    44.0
5    2020-06-30    全国    517.0    北京    329.0
6    2020-07-31    全国    803.0    新疆    563.0
7    2020-08-31    全国    721.0    新疆    263.0
8    2020-09-30    全国    356.0    上海    102.0
9    2020-09-30    全国    356.0    陕西    44.0
10    2020-10-31    全国    258.0    上海    79.0
1 #修改area_x、count_x、area_y、area_y等列名,并新增一列计算每月病例最多的省份占全国病例数的比重
2 covid_month_country_whole=covid_month_country_whole.rename(columns={'area_x':'country','count_x':'count_country','area_y':'max_province','count_y':'count_max_province'})
3 covid_month_country_whole['prop_maxprovince_of_country']=covid_month_country_whole['count_max_province']/covid_month_country_whole['count_country']
4 covid_month_country_whole
month    country    count_country    max_province    count_max_province    prop_maxprovince_of_country
0    2020-01-31    全国    11499.0    湖北    7108.0    0.618141
1    2020-02-29    全国    68034.0    湖北    59754.0    0.878296
2    2020-03-31    全国    1730.0    湖北    895.0    0.517341
3    2020-04-30    全国    1320.0    黑龙江    460.0    0.348485
4    2020-05-31    全国    143.0    吉林    44.0    0.307692
5    2020-06-30    全国    517.0    北京    329.0    0.636364
6    2020-07-31    全国    803.0    新疆    563.0    0.701121
7    2020-08-31    全国    721.0    新疆    263.0    0.364771
8    2020-09-30    全国    356.0    上海    102.0    0.286517
9    2020-09-30    全国    356.0    陕西    44.0    0.123596
10    2020-10-31    全国    258.0    上海    79.0    0.306202

可以看出,2020年1-3月,月病例最多的省份为湖北,湖北病例占全国的比重分别为0.45、0.88、0.51。

2020年4-5月,月病例最多的省份分别为黑龙江、吉林,东北成为疫情最严重地区。 2020年6月,月病例最多省份为北京,且北京病例占全国的比重的比例高达0.64. 2020年7-8月,全国疫情最严重地区为新疆。2020年9-10月,全国疫情最严重地区为上海。

第9行的陕西省数据不应出现,猜测原因为陕西2020年9月病例数为44,正好与2020年5月吉林的值一样,在pd.isin()方法中也被判定为TRUE,有待进一步改进。

 

问题5:各周确诊病例最多的省份分别是哪里?

1 #按周查看新冠肺炎确诊病例汇总值
2 covid_cases_by_week=covid_cases_everyday.resample('W').sum()
3 print(covid_cases_by_week['湖北'].head())
2020-01-19      153.0
2020-01-26     1225.0
2020-02-02     9754.0
2020-02-09    18454.0
2020-02-16    28513.0
Freq: W-SUN, Name: 湖北, dtype: float64
1 covid_cases_by_week['week']=covid_cases_by_week.index
2 covid_cases_by_week=covid_cases_by_week.melt(id_vars='week',var_name='area',value_name='count')
3 covid_cases_by_week
week	area	count
0	2020-01-19	全国	0.0
1	2020-01-26	全国	2453.0
2	2020-02-02	全国	14459.0
3	2020-02-09	全国	22955.0
4	2020-02-16	全国	30392.0
...	...	...	...
1275	2020-09-20	新疆	0.0
1276	2020-09-27	新疆	0.0
1277	2020-10-04	新疆	0.0
1278	2020-10-11	新疆	0.0
1279	2020-10-18	新疆	0.0
1280 rows × 3 columns
1 #拆分为全国数据集、各省数据集。
2 covid_cases_by_week_country=covid_cases_by_week[covid_cases_by_week['area']=='全国']
3 covid_cases_by_week_province=covid_cases_by_week[~(covid_cases_by_week['area']=='全国')]
4 covid_cases_by_week_province.to_csv('./1、疫情数据/covid_cases_by_week_province.csv')
1 #获取各周病例最多的省份
2 #注意pd.isin()的参数应为列表
3 covid_cases_by_week_maxvalue=covid_cases_by_week_province.groupby('week')['count'].max()
4 covid_cases_by_week_maxprovince=covid_cases_by_week_province[covid_cases_by_week_province['count'].isin(list(covid_cases_by_week_maxvalue))]
5 covid_cases_by_week_maxprovince.sort_values(by='week')
week	area	count
680	2020-01-19	湖北	153.0
201	2020-01-26	内蒙古	10.0
521	2020-01-26	福建	55.0
321	2020-01-26	黑龙江	19.0
121	2020-01-26	河北	17.0
...	...	...	...
1118	2020-10-11	陕西	15.0
798	2020-10-11	广东	20.0
799	2020-10-18	广东	20.0
399	2020-10-18	上海	32.0
119	2020-10-18	天津	7.0
121 rows × 3 columns

周度情形下,pd.isin(list)中的list重复值很多,结果存在明显错误(如2020年1月最严重省份应为湖北)

 

现在采用另一种方法获取每周病例最多的省份。

1 #首先获取周列表
2 week_list=list(covid_cases_by_week_province['week'].unique())
3 #week_list是一个datetime列表
4 print(week_list[0])
5 print(str(week_list[0]))
2020-01-19T00:00:00.000000000
2020-01-19T00:00:00.000000000
1 #将week_list转换为一个字符串列表。
2 week_list=[str(i)[:10] for i in week_list]
3 print(week_list)
['2020-01-19', '2020-01-26', '2020-02-02', '2020-02-09', '2020-02-16', '2020-02-23', '2020-03-01', '2020-03-08', '2020-03-15', '2020-03-22', '2020-03-29', '2020-04-05', '2020-04-12', '2020-04-19', '2020-04-26', '2020-05-03', '2020-05-10', '2020-05-17', '2020-05-24', '2020-05-31', '2020-06-07', '2020-06-14', '2020-06-21', '2020-06-28', '2020-07-05', '2020-07-12', '2020-07-19', '2020-07-26', '2020-08-02', '2020-08-09', '2020-08-16', '2020-08-23', '2020-08-30', '2020-09-06', '2020-09-13', '2020-09-20', '2020-09-27', '2020-10-04', '2020-10-11', '2020-10-18']
1 #先建立一个空的DataFrame,再遍历每一周,将该周病例最多的省份添加为新建的DataFrame的一行
2 covid_cases_by_week_maxprovince=pd.DataFrame(columns=['week','area','count'])
3 for i in week_list:
4     covid_cases_iweek=covid_cases_by_week_province[covid_cases_by_week_province['week']==i]
5     covid_cases_iweek_max=covid_cases_iweek[covid_cases_iweek['count']==covid_cases_iweek['count'].max()]
6     covid_cases_by_week_maxprovince= covid_cases_by_week_maxprovince.append(covid_cases_iweek_max,ignore_index=True)
7 
8 print(covid_cases_by_week_maxprovince)
         week area    count
0  2020-01-19   湖北    153.0
1  2020-01-26   湖北   1225.0
2  2020-02-02   湖北   9754.0
3  2020-02-09   湖北  18454.0
4  2020-02-16   湖北  28513.0
5  2020-02-23   湖北   6143.0
6  2020-03-01   湖北   2816.0
7  2020-03-08   湖北    640.0
8  2020-03-15   湖北     55.0
9  2020-03-22   北京     76.0
10 2020-03-29   上海     94.0
11 2020-04-05   广东     48.0
12 2020-04-12  黑龙江    216.0
13 2020-04-19   湖北    325.0
14 2020-04-26  黑龙江     31.0
15 2020-05-03   陕西     20.0
16 2020-05-10   吉林     15.0
17 2020-05-17   吉林     19.0
18 2020-05-24  内蒙古     14.0
19 2020-05-31   四川     11.0
20 2020-06-07   广东      7.0
21 2020-06-14   北京     79.0
22 2020-06-21   北京    157.0
23 2020-06-28   北京     82.0
24 2020-07-05   北京     17.0
25 2020-07-12  内蒙古     10.0
26 2020-07-19   新疆     47.0
27 2020-07-26   新疆    131.0
28 2020-08-02   新疆    442.0
29 2020-08-09   新疆    157.0
30 2020-08-16   新疆     49.0
31 2020-08-23   上海     52.0
32 2020-08-30   上海     23.0
33 2020-09-06   广东     28.0
34 2020-09-13   上海     25.0
35 2020-09-20   上海     27.0
36 2020-09-27   广东     19.0
37 2020-10-04   上海     30.0
38 2020-10-11   上海     31.0
39 2020-10-18   上海     32.0
1 #合并全国、各省两个数据集
2 covid_cases_week_whole=covid_cases_by_week_country.merge(covid_cases_by_week_maxprovince,left_on='week',right_on='week')
3 #重命名列
4 covid_cases_week_whole=covid_cases_week_whole.rename(columns={'area_x':'country','count_x':'count_country','area_y':'maxprovince','count_y':'count_maxprovince'})
5 #新增一列
6 covid_cases_week_whole['prop_maxprovince_of_country']=covid_cases_week_whole['count_maxprovince']/covid_cases_week_whole['count_country']
7 covid_cases_week_whole
	week	country	count_country	maxprovince	count_maxprovince	prop_maxprovince_of_country
0	2020-01-19	全国	0.0	湖北	153.0	inf
1	2020-01-26	全国	2453.0	湖北	1225.0	0.499389
2	2020-02-02	全国	14459.0	湖北	9754.0	0.674597
3	2020-02-09	全国	22955.0	湖北	18454.0	0.803921
4	2020-02-16	全国	30392.0	湖北	28513.0	0.938175
5	2020-02-23	全国	6600.0	湖北	6143.0	0.930758
6	2020-03-01	全国	2876.0	湖北	2816.0	0.979138
7	2020-03-08	全国	709.0	湖北	640.0	0.902680
8	2020-03-15	全国	125.0	湖北	55.0	0.440000
9	2020-03-22	全国	233.0	北京	76.0	0.326180
10	2020-03-29	全国	377.0	上海	94.0	0.249337
11	2020-04-05	全国	238.0	广东	48.0	0.201681
12	2020-04-12	全国	452.0	黑龙江	216.0	0.477876
13	2020-04-19	全国	587.0	湖北	325.0	0.553663
14	2020-04-26	全国	83.0	黑龙江	31.0	0.373494
15	2020-05-03	全国	50.0	陕西	20.0	0.400000
16	2020-05-10	全国	38.0	吉林	15.0	0.394737
17	2020-05-17	全国	36.0	吉林	19.0	0.527778
18	2020-05-24	全国	31.0	内蒙古	14.0	0.451613
19	2020-05-31	全国	32.0	四川	11.0	0.343750
20	2020-06-07	全国	23.0	广东	7.0	0.304348
21	2020-06-14	全国	141.0	北京	79.0	0.560284
22	2020-06-21	全国	215.0	北京	157.0	0.730233
23	2020-06-28	全国	116.0	北京	82.0	0.706897
24	2020-07-05	全国	45.0	北京	17.0	0.377778
25	2020-07-12	全国	45.0	内蒙古	10.0	0.222222
26	2020-07-19	全国	80.0	新疆	47.0	0.587500
27	2020-07-26	全国	209.0	新疆	131.0	0.626794
28	2020-08-02	全国	537.0	新疆	442.0	0.823091
29	2020-08-09	全国	240.0	新疆	157.0	0.654167
30	2020-08-16	全国	181.0	新疆	49.0	0.270718
31	2020-08-23	全国	118.0	上海	52.0	0.440678
32	2020-08-30	全国	81.0	上海	23.0	0.283951
33	2020-09-06	全国	86.0	广东	28.0	0.325581
34	2020-09-13	全国	60.0	上海	25.0	0.416667
35	2020-09-20	全国	97.0	上海	27.0	0.278351
36	2020-09-27	全国	81.0	广东	19.0	0.234568
37	2020-10-04	全国	98.0	上海	30.0	0.306122
38	2020-10-11	全国	108.0	上海	31.0	0.287037
39	2020-10-18	全国	94.0	上海	32.0	0.340426
 1 #将week列转为datetime类型,以正确显示日期坐标轴
 2 covid_cases_week_whole['week_datetime']=covid_cases_week_whole['week'].dt.strftime('%Y-%m-%d')
 3 #设置较大的图形尺寸,否则坐标轴会重叠
 4 fig=plt.figure(figsize=(20,10))
 5 ax=fig.add_subplot(1,1,1)
 6 #着色参数hue设置为按省份着色
 7 ax=sns.scatterplot(x='week_datetime',y='prop_maxprovince_of_country',hue='maxprovince',s=200,data=covid_cases_week_whole)
 8 #使日期坐标轴自适应显示(否则全部横排也会重叠在一起)
 9 fig.autofmt_xdate()
10 #显示网格线,并设置为虚线
11 plt.grid(linestyle='--')
12 #设置图例为最大
13 plt.legend(fontsize='xx-large')
14 ax.set_title('周度确诊病例最多的省份占全国病例的比重',size=20)
15 ax.set_xlabel('')
16 ax.set_ylabel('')
17 plt.savefig(r'./1、疫情数据/周度确诊病例最多的省份.png')
18 plt.show()

通过上图,我们可以得出结论:

1、从疫情爆发至2020年3月15日,每周确诊病例最多的省份均为湖北,湖北病例占全国的比重先是急剧攀升,然后维持在很高的水平,直到2020年3月中旬比重才迅速下降。

2、2020年3月15日起,确诊病例最多的省份更替频繁,且占比都不是很高,例外情况是北京、新疆,6月中旬至7月初的北京、7月中旬到8月中旬的新疆疫情较严重。

posted @ 2020-10-25 10:19  隐岐  阅读(613)  评论(0)    收藏  举报