【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
现在采用另一种方法获取每周病例最多的省份。
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月中旬的新疆疫情较严重。
浙公网安备 33010602011771号