建立新環境
(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
CSSE at Johns Hopkins University:由約翰霍普金斯大學系統科學與工程中心(CSSE)整理,涵蓋全球每日確診、死亡與康復人數等統計。
Johns Hopkins University COVID-19 Website:由約翰霍普金斯大學治理研究中心(GovEx)提供,包含疫苗接種與公共衛生相關數據。
資料分為 每日報告 與 時間序列資料 兩個部分:
['Province/State', 'Country/Region', 'Date'])。資料庫正規化(Normalization):
統一欄位名稱、資料型態與日期格式,確保後續合併與彙總正確。
每日報告 處理:03-09-2023.csv,內容涵蓋各國與地區在 2023-03-09 的疫情統計。
全球確診資料(寬→長):time_series_covid19_confirmed_global.csv
1/22/20 → 2020-01-22全球死亡資料(寬→長):time_series_covid19_deaths_global.csv
1/22/20 → 2020-01-22全球疫苗資料(長表格):time_series_covid19_vaccine_global.csv
float64 → object、Doses_admin float64 → int64曾出現溢位(overflow)問題,改用 astype(‘int64’)。
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