Data analysis

練習專案五:大疫世代 2


環境設定(Environment Setup)

  建立新環境
  (base) conda create --name covid_19_pandemic python=3.12

  進入新建立環境
  (base) conda activate covid_19_pandemic

  安裝模組
  (covid_19_pandemic) conda install pandas
  (covid_19_pandemic) conda install plotly
  (covid_19_pandemic) pip install gradio


數據準備(Data Preparation)

數據來源(Data Sources)


數據結構(Data Structure)

資料分為 每日報告時間序列資料 兩個部分:

  1. 每日報告:單日全球疫情統計,非必要欄位較多,需移除多餘欄位以利地圖視覺化。
  2. 時間序列資料確診、死亡資料寬表格疫苗資料長表格。三份資料的 欄位名稱與資料型態 略有不同,需先正規化(鍵值統一為 ['Province/State', 'Country/Region', 'Date'])。

  • 資料庫正規化(Normalization): 統一欄位名稱、資料型態與日期格式,確保後續合併與彙總正確。

  • 每日報告 處理:03-09-2023.csv,內容涵蓋各國與地區在 2023-03-09 的疫情統計。

    • 保留欄位:[‘Country_Region’, ‘Province_State’, ‘Admin2’, ‘Confirmed’, ‘Deaths’, ‘Lat’, ‘Long_’]
    • 調整名稱:[‘country’, ‘province’, ‘county’, ‘confirmed’, ‘deaths’, ’latitude’, ’longitude’]
    • 欄位介紹
      • Admin2:次級行政區名稱(主要針對美國縣市)。
      • Province_State:省份或州的名稱。
      • Country_Region:國家名稱。
      • Lat / Long_:緯度 / 經度。
      • Confirmed / Deaths:累積確診數 / 累積死亡數。

  • 時間序列資料 處理:
    • 全球確診資料(寬→長)time_series_covid19_confirmed_global.csv

      • 保留欄位:[‘Province/State’, ‘Country/Region’, ‘Date’, ‘Confirmed’]
      • Date:日期型態轉換 1/22/202020-01-22

    • 全球死亡資料(寬→長)time_series_covid19_deaths_global.csv

      • 保留欄位:[‘Province_State’, ‘Country_Region’, ‘Date’, ‘Deaths’]
      • Date:日期型態轉換 1/22/202020-01-22

    • 全球疫苗資料(長表格)time_series_covid19_vaccine_global.csv

      • 保留欄位:[‘Province_State’, ‘Country_Region’, ‘Date’, ‘Doses_admin’]
      • 調整欄位名稱:[‘Province_State’, ‘Country_Region’] → [‘Province/State’, ‘Country/Region’]
      • 調整資料型態:Province/State float64object、Doses_admin float64int64

      曾出現溢位(overflow)問題,改用 astype(‘int64’)。


數據導入(Data Import)

  • Step 1:載入與整理原始資料。

    def __init__(self, file_path, db_name):
        self.file_path = file_path
        self.db_name = db_name
        # 每日報告
        self.daily_report = pd.read_csv(f'{file_path}03-09-2023.csv')
        # 確診
        self.confirmed = pd.read_csv(f'{file_path}time_series_covid19_confirmed_global.csv')
        # 疫苗
        self.vaccine = pd.read_csv(f'{file_path}time_series_covid19_vaccine_global.csv')
        # 死亡人數
        self.deaths = pd.read_csv(f'{file_path}time_series_covid19_deaths_global.csv')
    

  • Step 2:每日資料處理。

    def create_daily_report(self):
        # 處理每日資料 03-09-2023.csv
        # 清除多餘欄位、調整欄位位置和名稱。
        daily_report = self.daily_report[['Country_Region', 'Province_State', 'Admin2', 'Confirmed', 'Deaths','Lat', 'Long_']]
        daily_report.columns = ['country', 'province', 'county', 'confirmed', 'deaths', 'latitude', 'longitude']
        print('create_daily_report pass')
        return daily_report
    

  • Step 3:時間序列資料處理。

        def create_time_series(self):
            # 合併 time_series 資料
            # 寬轉長
            melt_list = ['Province/State', 'Country/Region', 'Lat', 'Long']
            confirmed = self.confirmed.melt(id_vars=melt_list, var_name='date', value_name='Confirmed')
            deaths = self.deaths.melt(id_vars=melt_list, var_name='date', value_name='Deaths')
    
            # 調整欄位一致性
            confirmed = confirmed.rename(columns={'date':'Date'})
            deaths = deaths.rename(columns={'date':'Date'})
            vaccine = self.vaccine.rename(columns={'Province_State':'Province/State', 'Country_Region':'Country/Region'})
            vaccine['Province/State'] = vaccine['Province/State'].astype('object')
    
            # 轉換格式日期:重點 pd.to_datetime 看不懂需要補充(format=)
            confirmed['Date'] = pd.to_datetime(confirmed['Date'], format='%m/%d/%y') 
            deaths['Date'] = pd.to_datetime(deaths['Date'], format='%m/%d/%y')
            vaccine['Date'] = pd.to_datetime(vaccine['Date'])
    
            # 清除多餘欄位
            confirmed = confirmed.drop(columns=['Lat', 'Long'])
            deaths = deaths.drop(columns=['Lat', 'Long'])
            vaccine = vaccine.drop(columns=['UID', 'People_at_least_one_dose'])
    
            # 合併
            join_keys = ['Province/State', 'Country/Region', 'Date']
            time_series = confirmed.merge(deaths, left_on=join_keys, right_on=join_keys, how='left')
            time_series = time_series.merge(vaccine, left_on=join_keys, right_on=join_keys, how='left')
            time_series = time_series.groupby(['Country/Region', 'Date'])[['Confirmed',  'Deaths',  'Doses_admin']].sum().reset_index()
            time_series['Doses_admin'] = time_series['Doses_admin'].astype('int64')
            time_series.columns = ['country', 'reported_on', 'confirmed', 'deaths', 'doses_administered']
            print('create_time_series pass')
            return time_series
    


上一章

下一章