台灣全民疫苗接種進度條機器人

作者:   發佈於:   #bot #COVID19 #COVID19Taiwan #CovidVaccine

某日看到在疾管署網站上發的公告:「指揮中心:政府已於特別預算編列40億,請合約醫療院所免費提供民眾接種公費COVID-19疫苗服務,自6月7日起實施 」,同時也看到蔡英文總統在臉書 / Telegram 對此事的宣傳。既然這計畫起動了,那就來配合做個進度條吧。

成品:台灣全民疫苗接種進度條機器人 @twvacprogress,是個每日定時發一則推文的機器人,請大家多多關注。其程式碼位於: gugod/taiwan-covid19-vaccination-progress-bot,也請大家指教。

這機器人發的推文模樣如下 (@twvacprogress/status/1411298089139421185):

💉第一劑 2,232,145 人
[##________________________] 9.492%

💉第二劑 46,193 人
[__________________________] 0.196%

累計至 2021-07-02,全民共接種了 2,278,338 劑
#CovidVaccine #COVID19 #COVID19Taiwan

主要重點基本上就是兩個 0%...100% 數字加上兩條進度條,呈現出接受過第一劑與第二劑的人口百分比。百分比數字的算法是人數除於台灣人口數 23514196,這數字是取自 Wikipedia 臺灣人口 這頁面,其資料源頭是行政院內政部戶政司,統計期限到 2021 年 4 月底為止。目前最新的數字是統計至 2021 年 5 月的 23499070 人,不過原則上機器人計算百分比就用 23514196 這數字了,如果以後覺得有必需要校正的話再討論。

累計劑量數字的源頭是疾管署所提供的 COVID-19 疫苗日報表 pdf 檔,但我是間接透過 Our World in Data 所做好的 CSV (Taiwan.csv) 來取得。省下拆解 PDF 的功夫。

@twvacprogress 上線發了第一則推文後約過了一個月,看來也累積了一些觀眾。如果能讓更多人去對解讀數字感到習慣,那或許各種過度解讀或虛實不清的消息就不會那麼容易地被擴散開來了吧。這種進度條機器人的發文或許或讓有些人覺得單調無聊,但或許無聊才是最好的狀態呢。

@twvacprogress 機器人也追蹤了不少其他國家、地區的 covid19 疫苗接稱進度條人,也請參考看看: @twvacprogress/following

附帶一提,用 Our World in Data 的 Taiwan.csv 雖然說是省事,不過 PDF 的解析也是一份需要維護的程式碼。疾管署看來會依目前狀態偶爾修改疫苗日報表的內容與格式。剛開始只有 AZ 疫苗時就只有一個累計數字,後來加上 Moderna 後就追加了疫苗別。約兩周前又再追加了第一劑累計與第二劑累計。為了讓 Our World In Data 端能持續從 PDF 中解析出正確的數字,結果我還是送了不少次的更新請求過去。還算是順便再次學習了一下 python、pandas、DataFrame。

如果有人想要來參與 Our World In Data 的修改,可以試著依其 scripts/scripts/vaccinations/README.md 的步驟準備一下。文件中有提到說需要 google api 用的代碼之類的。我是沒有提供,而是把那部份程式拔掉:

# git diff
diff --git a/scripts/scripts/vaccinations/src/vax/cmd/__main__.py b/scripts/scripts/vaccinations/src/vax/cmd/__main__.py
index 7d5a1bf2b..b73d418a2 100644
--- a/scripts/scripts/vaccinations/src/vax/cmd/__main__.py
+++ b/scripts/scripts/vaccinations/src/vax/cmd/__main__.py
@@ -24,7 +24,7 @@ def main():
             n_jobs=cfg.njobs,
             modules_name=cfg.countries,
             skip_countries=cfg.skip_countries,
-            gsheets_api=config.gsheets_api,
+            # gsheets_api=config.gsheets_api,
         )
     if "process" in config.mode:
         cfg = config.ProcessDataConfig()

然後依樣執行 cowid-vax 指令。

# cd scripts/scripts/vaccinations
# cowid-vax --config ./config.yaml -c taiwan get

如果過程順利的話會看到像這樣的訊息:

# cowid-vax --config ./config.yaml -c taiwan get
['get']
-- Getting data... --
2021-07-04 09:27:06 INFO     vax.incremental.taiwan: started
2021-07-04 09:27:13 WARNING  Some characters could not be decoded, and were replaced with REPLACEMENT CHARACTER.
2021-07-04 09:27:18 WARNING  Some characters could not be decoded, and were replaced with REPLACEMENT CHARACTER.
2021-07-04 09:27:23 WARNING  Some characters could not be decoded, and were replaced with REPLACEMENT CHARACTER.
2021-07-04 09:27:28 WARNING  Some characters could not be decoded, and were replaced with REPLACEMENT CHARACTER.
2021-07-04 09:27:32 INFO     vax.incremental.taiwan: SUCCESS ✅
2021-07-04 09:27:32 INFO     
---

RETRIALS (0)
----------------------------
----------------------------
----------------------------

並且,可看到 scripts/scripts/vaccinations/output/Taiwan.csv 有所更新:

# git diff output 
diff --git a/scripts/scripts/vaccinations/output/Taiwan.csv b/scripts/scripts/vaccinations/output/Taiwan.csv
index a892e3d89..8fdceb1c0 100644
--- a/scripts/scripts/vaccinations/output/Taiwan.csv
+++ b/scripts/scripts/vaccinations/output/Taiwan.csv
@@ -82,3 +82,4 @@ Taiwan,2021-06-28,"Moderna, Oxford/AstraZeneca",https://www.cdc.gov.tw/Category/
 Taiwan,2021-06-29,"Moderna, Oxford/AstraZeneca",https://www.cdc.gov.tw/Category/Page/9jFXNbCe-sFK9EImRRi2Og,2002677,1962990,39687
 Taiwan,2021-06-30,"Moderna, Oxford/AstraZeneca",https://www.cdc.gov.tw/Category/Page/9jFXNbCe-sFK9EImRRi2Og,2043218,2001418,41800
 Taiwan,2021-07-01,"Moderna, Oxford/AstraZeneca",https://www.cdc.gov.tw/Category/Page/9jFXNbCe-sFK9EImRRi2Og,2087587,2044241,43346
+Taiwan,2021-07-02,"Moderna, Oxford/AstraZeneca",https://www.cdc.gov.tw/Category/Page/9jFXNbCe-sFK9EImRRi2Og,2278338,2232145,46193

如果不順利的話就會看到又臭又長又上下顛到的 python stacktrace :-)