一、數(shù)據(jù)下載和查看
使用python中urllib.request模塊中的urlretrieve函數(shù)下載此文件
from urllib.request import urlretrieve
urlretrieve('https://hub.jovian.ml/wp-content/uploads/2020/09/italy-covid-daywise.csv',
'italy-covid-daywise.csv')
import pandas as pd
covid_df = pd.read_csv('italy-covid-daywise.csv')
#covid_df.info() 基本信息 covid_df.describe() 基本統(tǒng)計(jì)信息描述
#covid_df.columns表頭信息 covid_df.shape 行數(shù)和列數(shù)
##獲取表中的date和new_cases列
cases_df = covid_df[['date', 'new_cases']]
##covid_df.loc[243] 獲取第243行 covid_df.loc[108:113] 獲取108到113行
二、分析數(shù)據(jù)
問:在意大利,與Covid-19相關(guān)的報(bào)告病例和死亡總數(shù)是多少?死亡率是多少?
total_cases = covid_df.new_cases.sum()
total_deaths = covid_df.new_deaths.sum()
print('報(bào)告病例是 {} 和死亡人數(shù)是 {}.'.format(int(total_cases), int(total_deaths)))
#死亡率是報(bào)告的死亡人數(shù)與報(bào)告的病例數(shù)之比
death_rate = covid_df.new_deaths.sum() / covid_df.new_cases.sum()
print("死亡率是 {:.2f} %.".format(death_rate*100))
問:哪些天病例超過了1000?
high_cases_df = covid_df[covid_df.new_cases > 1000]
問:排序找出案例數(shù)和死亡人數(shù)最多的日子?
covid_df.sort_values('new_cases', ascending=False).head(10)
covid_df.sort_values('new_deaths', ascending=False).head(10)
看起來三月的最后兩個(gè)星期的每日病例數(shù)最多,而在新病例中,似乎每日死亡人數(shù)在高峰后約一周就達(dá)到高峰。
問:數(shù)據(jù)中是否有異常數(shù)據(jù)?如何處理?
covid_df.sort_values('new_cases').head(10)

微信截圖_20210301134701.png
通過排序我們發(fā)現(xiàn)第172行數(shù)據(jù)有異常,新案例數(shù)為負(fù)數(shù),我們可以通過這幾種方法處理異常數(shù)據(jù):1.替換為0;2.將其替換為整個(gè)列的平均值;3.將其替換為上一個(gè)和下一個(gè)日期的平均值;4.完全舍棄該行。
這里采用第三種方法,替換為上下列的平均值。
covid_df.at[172, 'new_cases'] = (covid_df.at[171, 'new_cases'] + covid_df.at[173, 'new_cases'])/2
三、處理日期
通過covid_df.date看出date的數(shù)據(jù)類型是object,pandas不好分析,使用pd.to_datetime方法將其轉(zhuǎn)化數(shù)據(jù)類型datetime64。增加年月日周末這四列。
covid_df['date'] = pd.to_datetime(covid_df.date)
covid_df['year'] = pd.DatetimeIndex(covid_df.date).year
covid_df['month'] = pd.DatetimeIndex(covid_df.date).month
covid_df['day'] = pd.DatetimeIndex(covid_df.date).day
covid_df['weekday'] = pd.DatetimeIndex(covid_df.date).weekday
看下5月份的總體指標(biāo)。然后使用該sum方法匯總每個(gè)選定列的值。
covid_df[covid_df.month == 5][['new_cases', 'new_deaths', 'new_tests']].sum()
一個(gè)簡單的例子:
看下周日報(bào)告的病例數(shù)是否高于每天報(bào)告的平均病例數(shù)。
covid_df.new_cases.mean()
#1096.6149193548388
covid_df[covid_df.weekday == 6].new_cases.mean()
#1247.2571428571428
與其他日子相比,星期天似乎有更多的病例報(bào)告。
四、分組和匯總
我們按月創(chuàng)建一個(gè)組,用sum,mean進(jìn)行匯總他們。
covid_month_df = covid_df.groupby('month')[['new_cases', 'new_deaths', 'new_tests']].sum()
covid_month_mean_df = covid_df.groupby('month')[['new_cases', 'new_deaths', 'new_tests']].mean()