跳到主要內容

武漢肺炎強制家居檢疫趨勢圖


武漢肺炎疫情持續有一個多月了。我們身處數位時代,香港政府的資料一線通提供了滯後的「根據香港法例第 599C 章正在接受強制家居檢疫人士所居住的大廈名單」。雖為何會說滯後?因為強制家居隔離十四天,如果數據是 3 月 10 日,理應完成隔離的時間是十四天的 3 月 23 日。當然輸入資料需時,但也不用四天吧。雖然資料滯後,但還是有參考價值。

利用 Python 3.7 + Pandas 把 CSV 數據載入並以圖表顯示,能讓我們更容易了解箇中的趨勢變化:
import datetime
import pandas
import numpy

from matplotlib.font_manager import FontProperties
import matplotlib.pyplot as plot
%matplotlib inline

##  Read CSV data
dataPath = "../Dataset/Coronavirus Disease (COVID-19)/20200311_home_confinees_tier2_building_list.csv"
data = pandas.read_csv(dataPath)

##  Convert string to datetime
fieldName = data.columns[3]
data[fieldName] = pandas.to_datetime(data[fieldName], format='%d/%m/%Y')

_title = '衛生署 COVID-19 家居隔離 599C 資料'

count = data.shape[0]
_csvNote = '截至 2020 年 3 月 11 日,共 '+str(count)+' 人'

##  Prepare title
fieldName = data.columns[3]
x = data[fieldName].to_numpy()

fromDate = numpy.amin(x)
fromDateString = pandas.to_datetime(str(fromDate)).strftime('%b-%d')
toDate = numpy.amax(x)
toDateString = pandas.to_datetime(str(toDate)).strftime('%b-%d')

title = '由 '+fromDateString+' 至 '+toDateString+' 隔離人數'

##  Show chart base on finish date
fieldName = data.columns[3]
result = data.groupby([fieldName])[fieldName].count().reset_index(name='Count').sort_values([fieldName], ascending=True)

x = result[fieldName].to_numpy()
y = result['Count'].to_numpy()
height = numpy.amax(y)

x2 = [pandas.to_datetime(str(date_obj)).strftime('%b-%d') for date_obj in x]

plot.rcParams['font.sans-serif'] = ['Heiti TC'] 
plot.rcParams['axes.unicode_minus'] = False
plot.rcParams['font.size'] = 16

figure, axis = plot.subplots(figsize=(20,10))

axis.plot(x2, y, marker='o')
axis.set(xlabel=fieldName, ylabel='數量', title='所有地區隔離人數')
axis.grid()

for i, j in zip(x2, y):
    axis.annotate(str(j), xy=(i, j))

plot.xticks(rotation=80)
plot.suptitle(_title, fontsize=28)
plot.text(0, height, _csvNote, fontsize=16)
plot.show()

這個網誌中的熱門文章

After Effects 下的影片加速

Fast Forward in After Effects

很久很久沒有剪片了。今個星期接了一個項目,替客人製作兩段影片作為報告之用。雖然這個項目沒有難度,但步驟很多。總算完成了第一段。要在 iPad 中為動畫編程,然後錄下模擬器的動畫,把影片裁好後,還要將原來 2 分 17 秒的影片濃縮到 8 秒。否則看報告的人必然睡著。花了一點時間,才找到影片加速的方法。在 Composite 中點右鍵,選 Time 內的 Time Stretch 後,輸入最終想要的時間長度。

連接 PSVR 到 MacBook Pro

一兩個星期前,在 PS4 Pro 上安裝了 Littlstar 軟件去播放儲存在 USB 的立體影片。豈料今天在自動更新過後,這個免費的軟件現在只能播放兩分鐘,若要播放完整影片,則需要以訂購方式每月付費,或一次過給 US$39.9。對於 Littlstar 這個吸金方法,讀取 USB 影片要收費、官方內容又太少的情況下,很多人亦因此離開,尋找其他方法。其中一個方法是把 PSVR 連接到 macOS 上看。

方法是利用 https://github.com/emoRaivis/MacMorpheus 這個開源程式。先開著 PS4 Pro 及 PSVR,然後如上圖把線重新連接,這樣就能把 MacBook Pro 的畫面投射到 PSVR 上。

Python 按鍵檢測程式

完成了計數器程式後,接著是測試按鍵的程式。程式用來確保接線無誤之外,同時測試怎樣檢測會來得順暢,甚至是確保按鍵時的噪訊處理。以前開發遊戲程式時,在讀取搖桿訊號時會出現噪訊。例如按鍵時,從系統收到的訊號很多時候會像是 0000010101111111,而不會是 000000111111 這麼乾淨。這是硬件無法處理的情況,需要從軟件方面修正。Raspberry Pi 同樣有這種情況。

兩顆按鈕的接線非常簡單,一邊接地,另一方接 GPIO。在網上了解過後,我決定用較多人用的 BCM 作為 GPIO 的編號格式。同時選用了位於接口群右下方的 #20 及 #21 號腳;地線也選用了上兩格的 #18 號腳。它們位於外殻邊沿,能減少阻礙或鬆脫而導致接觸不良。焊接工作很快地完成了。正常來說,按鍵線路需要加入「上拉」或「下拉」設計,我曾向朋友 Peter 請教,了解兩者的分別及用法。主要都是用來確保未按鍵時的值,就像軟件中的 Initialise 一樣。然而,Raspberry Pi 已經內鍵了這兩種設計,GPIO.setup() 就是決定針腳是「上拉」或「下拉」。

我測試了兩款在 Raspberry Pi 的 Python 中的按鍵檢測方法。第一種 GPIO.wait_for_edge() 是等候按鍵時會一直停著,直到狀態成立才能繼續,套用到 #21 號腳;第二種 GPIO.add_event_detect() 是事件方式,當按鍵發生時會直接跳到已登記的程式,套用到 #20 號腳。#!/usr/bin/python ##------------------------------------------------------------ ## AMIGO Camera Button Test ## Copyright Pacess Studio, 2015. All rights reserved. ##------------------------------------------------------------ import RPi.GPIO as GPIO import time ##------------------------------------------------------------ def buttonPressed(channel):…