台灣水庫水量機器人 @TWRelervoir_bot

作者:   發佈於: ,更新於:   #bot #沒有要戰南北

幾天前將 @TWRelervoir_bot 做好放上線了(程式碼: taiwan-reservoir-bot.git)。這是一個定時(一天一次)呈現各水庫水量的推特機器人。每天早上自經濟部水利署提供的資料取得水情,做成適合放在一則推文中的小型圖表(一般稱呼為 sparkline chart)。

經濟部水利署網站首頁中名為「水庫水情資訊」的一小區,是以互動式地圖的介面,讓人可以在點選某個縣市之後,呈現出該縣市內各大小水庫與集水區的容量與目前蓄水率。這個蓄水率的數字是我想要拿來利用的。

另外就是也有一些其他人做的視覺化:如台灣水庫即時水情 https://water.taiwanstat.com/,把所有水庫區分為北中南,能讓人看出區域狀況。或如台灣水庫蓄水情況 https://ioi.tw/reservoir/,以不同大小的圓形呈現出各水庫不同的容積與蓄水量,同時提供全台灣島地圖以及各水庫所在位置。都是很讚的作品。

我主要只想大致上呈現出水量分佈(是北部水多,還是南部水多),以及利用推特時間線的特性,可簡單看出近幾天的變化。

在政府開放資料網站中搜尋,可找到到兩份資料集,一是水庫水情資料,另一是水庫每日營運狀況。從欄位名及描述看來,蓄水率並不是直接有提供出來的數字,而是這資料的使用者得從當時觀測的水量與水庫容量兩個數字去計算而得出的。

試了幾次之後得知,蓄水量的欄位名是 EffectiveWaterStorageCapacity,在水庫水情資料集裡面。而水庫容量數字的欄位名是 EffectiveCapacity,在水庫每日營運狀況資料集中。水庫名稱只有在水庫每日營運狀況資料集裡面有出現,但這兩個資料集能用 ReservoirIdentifier 這個欄位結合起來。

雖然不知拆成兩份資料的主要理由為何,但總之湊起來之後的蓄水率數字( EffeciveWaterStorageCapacity / EffectiveCapacity )與水利署網站的數字相同。看來就是這個算法沒錯。反正就讓機器人去兩處取得數字,然後相除就好。

Sparkline 的作圖方式,這次是決定使用 Unicode Block Elements 來處理。也就是直接是用字符而不生圖檔。能用來製作直條圖的有這八個填色字符:

U+2581  ▁  Lower one eighth block
U+2582  ▂  Lower one quarter block
U+2583  ▃  Lower three eighths block
U+2584  ▄  Lower half block
U+2585  ▅  Lower five eighths block
U+2586  ▆  Lower three quarters block
U+2587  ▇  Lower seven eighths block
U+2588  █  Full block

由低到高水平擺起來如:▁▂▃▄▅▆▇█

也就是說,只要能將 0%...100% 分成八段,每一段對應到一個字符就可以有個簡單的視覺呈現。不過試做時立刻發現 U+2584 ▄ Lower half blockU+2588 █ Full block 與其他六個字符的底部是沒有對齊的,或者說,不是所有的電腦字型都有將這八個字符底部對齊。多測幾次之後發現手機字型有將其底部對齊,但在電腦上則未必,至少是 twitter Web UI 所指定字型而定。最後決定不用這兩個可能會有問題的填色字符,只用六個。

在目前實作裡,0%..100% 畫起來是這樣:▁▂▃▅▅▆▆▇▇▇

做法是先把 0..100% 分成 0..10%, 10%..20%, 20%..30%, ... 90%..100% 這十組。再把每一組對應到一個填色方塊。若把每組底限與其直條水平擺在一起,看來就像這樣:

0▁ 10▂ 20▃ 30▅ 40▅ 50▆ 60▆ 70▇ 80▇ 90▇ 

可看到在 70%..100% 所對應到的高度就全部相同,無法區分。且 30%..50% 同高,50%..70% 也同高。

比起平均分配(0..17%, 17%...33%, ...),這種對應法的好處是能強調出在水量偏少時的變化。通常水量多就代表比較沒有問題(只要沒有多到滿出來),所以不太需要去仔細區分出 70% 與 80% 在圖表上的差別。但 10% 與 20% 的差別或許會之間影響到用水與限水政策,所以就區別出來似乎比較好些。

原本只顯示十大水庫,後來發現推特介面的寬度可排到十五個字,就決定充分利用了。前十五大水庫由南到北排序好,可讓人大致上看出南北哪裡蓄水率高。最後提示出蓄水率最高的水庫名與數字作為參考基準。呈現出來如下(推文: TWReservoir_bot/status/1401305137793097730):

▅▃▂▅▁▃▅▅▅▁▂▁▃▃▇
牡阿南烏曾仁湖日霧德鯉永寶石翡

翡翠水庫: 81%

沒想到剛做完上線後沒多久就來了個颱風給各水庫澆了不少水,在這幾天的推文當中立刻就有水量變化可以呈現出來。連氣候這麼給面子,這機器人也未免太強運了(笑)

總之... 請大家多多追蹤: @TWRelervoir_bot