【Python資料分析】新冠肺炎資料--分析一
阿新 • • 發佈:2020-10-25
2、疫情資料分析
1 #匯入pandas等模組 2 import pandas as pd 3 import matplotlib.pyplot as plt 4 import seaborn as sns 5 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_warning6 plt.rcParams.update({'figure.max_open_warning': 0})
1 #載入資料時將第0列日期解析為datetime物件,並設定為行索引。 2 covid_cases_cumsum=pd.read_csv(r'C:\Users\92342\Desktop\python\Python資料分析學習之路\1、疫情資料\covid_cases_cumsum.csv',\ 3 parse_dates=[0],index_col=[0]) 4 print(covid_cases_cumsum.info())
<class 'pandas.core.frame.DataFrame'> DatetimeIndex: 276 entries, 2020-01-16 to 2020-10-17 Data columns (total 32 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 全國 272 non-null float64 1 北京 269 non-null float64 2 天津 271 non-null float643 河北 270 non-null float64 4 山西 270 non-null float64 5 內蒙古 269 non-null float64 6 遼寧 270 non-null float64 7 吉林 269 non-null float64 8 黑龍江 270 non-null float64 9 上海 273 non-null float64 10 江蘇 270 non-null float64 11 浙江 269 non-null float64 12 安徽 270 non-null float64 13 福建 270 non-null float64 14 江西 271 non-null float64 15 山東 268 non-null float64 16 河南 269 non-null float64 17 湖北 276 non-null float64 18 湖南 271 non-null float64 19 廣東 273 non-null float64 20 廣西 270 non-null float64 21 海南 270 non-null float64 22 重慶 270 non-null float64 23 四川 270 non-null float64 24 貴州 270 non-null float64 25 雲南 271 non-null float64 26 西藏 262 non-null float64 27 陝西 269 non-null float64 28 甘肅 269 non-null float64 29 青海 267 non-null float64 30 寧夏 270 non-null float64 31 新疆 273 non-null float64 dtypes: float64(32) memory usage: 71.2 KB None
問題1:全國、湖北、其他地區確診病例的發展趨勢是怎麼樣的?
1 #使用seaborn.lineplot()繪製全國確診病例累計值的走勢圖 2 fig,ax=plt.subplots() 3 ax=sns.lineplot(data=covid_cases_cumsum['全國']) 4 plt.show()
1 #前面繪製的圖形沒有標題、軸標籤、橫座標過密,現重新繪製 2 fig,ax=plt.subplots() 3 ax=sns.lineplot(data=covid_cases_cumsum['全國']) 4 ax.set_title('新冠肺炎確診病例累計值:全國') 5 ax.set_ylabel('確診病例') 6 fig.tight_layout() 7 plt.show()
1 #繪製湖北的趨勢圖 2 fig,ax=plt.subplots() 3 ax=sns.lineplot(data=covid_cases_cumsum['湖北']) 4 ax.set_title('新冠肺炎確診病例累計值:湖北') 5 ax.set_ylabel('確診病例') 6 fig.tight_layout() 7 plt.show()
1 #接下來使用迴圈語句,生成所有省份的走勢圖並儲存至本地。 2 for area in list(covid_cases_cumsum.columns): 3 fig,ax=plt.subplots() 4 ax=sns.lineplot(data=covid_cases_cumsum[f'{area}']) 5 ax.set_title(f'新冠肺炎確診病例累計值:{area}') 6 ax.set_ylabel('確診病例') 7 fig.tight_layout() 8 plt.savefig(f'C:\\Users\\92342\\Desktop\\python\\Python資料分析學習之路\\1、疫情資料\\新冠肺炎確診病例累計值走勢圖\\{area}.png') 9 plt.clf()
<Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes> <Figure size 432x288 with 0 Axes>
從確診病例走勢圖可以看出,各地疫情確診病例走勢有如下幾種:
1、自疫情爆發至2020年3月初,確診病例呈急劇增長態勢,自此之後緩慢增長。該種走勢包括全國、第2、3項以外的地區。
2、疫情爆發一度被控制,但仍存在階段性爆發。該種走勢包括北京、上海、甘肅、黑龍江、吉林、遼寧、內蒙古、山西、新疆。
3、基本未受疫情影響的地區為西藏。
問題2:各地疫情爆發先後順序
1 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]
1 #可以發現,資料是按照日期順序排列的,各地的第一個非NaN值即為當地疫情爆發首日。 2 #使用pd.Series.first_valid_index方法獲取各地的爆發首日 3 outbreak_day=covid_cases_cumsum.apply(pd.Series.first_valid_index) 4 print(outbreak_day)
全國 2020-01-20 北京 2020-01-23 天津 2020-01-21 河北 2020-01-22 山西 2020-01-22 內蒙古 2020-01-23 遼寧 2020-01-22 吉林 2020-01-23 黑龍江 2020-01-22 上海 2020-01-19 江蘇 2020-01-22 浙江 2020-01-23 安徽 2020-01-22 福建 2020-01-22 江西 2020-01-21 山東 2020-01-24 河南 2020-01-23 湖北 2020-01-16 湖南 2020-01-21 廣東 2020-01-19 廣西 2020-01-22 海南 2020-01-22 重慶 2020-01-22 四川 2020-01-22 貴州 2020-01-22 雲南 2020-01-21 西藏 2020-01-30 陝西 2020-01-23 甘肅 2020-01-23 青海 2020-01-25 寧夏 2020-01-22 新疆 2020-01-19 dtype: datetime64[ns] <class 'pandas.core.series.Series'>
1 #outbreak_day是pd.Series資料,使用min方法找出Series中的最早日期 2 earliest_day=outbreak_day.min() 3 print(earliest_day)
2020-01-16 00:00:00
1 #用每個outbreak_day減去這個最小值,得到各地區爆發首日距離最早日期的偏移天數 2 shift_day=(outbreak_day-earliest_day) 3 shift_day_sorted=shift_day.sort_values() 4 print(shift_day_sorted)
湖北 0 days 新疆 3 days 廣東 3 days 上海 3 days 全國 4 days 湖南 5 days 天津 5 days 雲南 5 days 江西 5 days 河北 6 days 江蘇 6 days 安徽 6 days 福建 6 days 重慶 6 days 寧夏 6 days 遼寧 6 days 山西 6 days 貴州 6 days 廣西 6 days 海南 6 days 黑龍江 6 days 四川 6 days 陝西 7 days 甘肅 7 days 內蒙古 7 days 河南 7 days 浙江 7 days 吉林 7 days 北京 7 days 山東 8 days 青海 9 days 西藏 14 days dtype: timedelta64[ns]
可以看出,湖北是疫情首次爆發地,3日內傳播到了新疆、廣東、上海三地,
5日內傳播到了湖南、天津、雲南、江西,10日內傳播至西藏之外的所有內地省份。