李鯤程 祖子月 費(fèi)軍旗
(中國信息通信研究院數(shù)據(jù)研究中心,北京 100191)
自20世紀(jì)90年代以來,信息通信技術(shù)(Information and Communication Technology,ICT)產(chǎn)業(yè)迅猛發(fā)展,新技術(shù)不斷出現(xiàn),對世界發(fā)展產(chǎn)生了極大影響。以ICT技術(shù)為核心的數(shù)字化變革影響著每一個人,也引起了人們的普遍關(guān)注,有必要找到一個可以定性分析ICT產(chǎn)業(yè)發(fā)展趨勢并進(jìn)行可視化展示的方法,這將有助于人們更高效地研究產(chǎn)業(yè)特點(diǎn)、分析產(chǎn)業(yè)發(fā)展方向并探索新需求。
本文設(shè)計(jì)并實(shí)現(xiàn)了一個數(shù)據(jù)獲取與分析系統(tǒng),完成了對GitHub上指定ICT行業(yè)項(xiàng)目數(shù)據(jù)的獲取、清洗和分析,以項(xiàng)目數(shù)量、關(guān)鍵項(xiàng)目的星標(biāo)(Stars)數(shù)量、復(fù)刻(Forks)數(shù)量和提問(Issues)數(shù)量為依據(jù)對項(xiàng)目數(shù)量和關(guān)注度的變化進(jìn)行多維度分析,利用百度ECharts實(shí)現(xiàn)數(shù)據(jù)可視化,進(jìn)而分析ICT相關(guān)領(lǐng)域的發(fā)展趨勢。
GitHub上的海量ICT開源項(xiàng)目為行業(yè)發(fā)展趨勢的研究提供了豐富的數(shù)據(jù)來源。用戶可以根據(jù)自身的需求通過檢索項(xiàng)目的About和Readme的內(nèi)容從GitHub上獲取所需項(xiàng)目數(shù)據(jù),并對這些數(shù)據(jù)進(jìn)行相關(guān)操作。
在GitHub中,項(xiàng)目的星標(biāo)可以被直觀地理解成對項(xiàng)目的點(diǎn)贊數(shù)量,復(fù)刻是為了將項(xiàng)目按照自己的需求進(jìn)行修改而做的服務(wù)器端的復(fù)制操作,提問是對項(xiàng)目進(jìn)行討論的內(nèi)容。這些屬性都從不同側(cè)面反映了項(xiàng)目的受關(guān)注程度。
本文設(shè)計(jì)的數(shù)據(jù)獲取與分析系統(tǒng)通過獲取GitHub項(xiàng)目以及項(xiàng)目的星標(biāo)、復(fù)刻和提問信息,并對這些信息進(jìn)行清洗和處理,最終以折線圖的形式將項(xiàng)目的星標(biāo)、復(fù)刻或提問的數(shù)量信息展現(xiàn)出來,用于分析項(xiàng)目以及項(xiàng)目所代表的技術(shù)領(lǐng)域的發(fā)展趨勢(見圖1)。
GitHub提供的REST API[1-2]接口可以對開源數(shù)據(jù)進(jìn)行查詢,本文設(shè)計(jì)的數(shù)據(jù)獲取與分析系統(tǒng)用到了其中的項(xiàng)目查詢接口、星標(biāo)(Star)信息查詢接口、復(fù)刻(Fork)信息查詢接口、提問(Issue)信息查詢接口。每個接口的使用都包括接口地址、參數(shù)和返回結(jié)果三部分內(nèi)容,其中的參數(shù)部分在上述接口中都是相同的(見表1)。
圖1 數(shù)據(jù)獲取與分析系統(tǒng)數(shù)據(jù)處理流程
表1 GitHub REST API接口參數(shù)說明
1.1.1 數(shù)據(jù)獲取使用說明
(1)項(xiàng)目查詢接口
? 接口地址:https://api.github.com/search/repositories。
? 返回結(jié)果:以JSON的形式返回,包含查詢結(jié)果個數(shù)字段(total_count)和項(xiàng)目列表字段(items),項(xiàng)目列表中包括項(xiàng)目序列號(id)、項(xiàng)目名稱(full_name)、創(chuàng)建時間(created_at)、星標(biāo)數(shù)(stargazers_count)、復(fù)刻數(shù)(forks_count)和提問數(shù)(open_issues_count)。
(2)星標(biāo)(Star)信息查詢接口
? 接口地址:https://api.github.com/repos/{full_name}/stargazers?per_page=100&page=1。
? 返回結(jié)果:以JSON格式返回結(jié)果,包括星標(biāo)事件(starred_at)和標(biāo)星人信息(user)。
(3)復(fù)刻(Fork)信息查詢接口
? 接口地址:https://api.github.com/repos/{full_name}/forks?per_page=100&page=1。
? 返回結(jié)果:以JSON格式返回各個復(fù)刻項(xiàng)目的信息,包括項(xiàng)目序列號(id)、項(xiàng)目名稱(full_name)、創(chuàng)建時間(created_at)、星標(biāo)數(shù)(stargazers_count)、復(fù)刻數(shù)(forks_count)和提問數(shù)(open_issues_count)等信息。
(4)提問(Issue)信息查詢接口
? 接口地址:https://api.github.com/repos/{full_name}/issues?per_page&page=1。
? 返回結(jié)果:以JSON格式返回結(jié)果,包括總的問題數(shù)(total_count)和問題詳細(xì)信息(items),items包括問題序列號(id)、問題標(biāo)題(title)和提問用戶(user)等信息。
1.1.2 關(guān)于GitHub的REST API查詢接口的幾點(diǎn)說明
(1)在開發(fā)接口中,full_name由項(xiàng)目所有者的loginid和項(xiàng)目名稱(name)組成,是logind/name形式。
(2)接口調(diào)用的應(yīng)答Headers信息如下。
Link:
X-RateLimit-Limit: 30
X-RateLimit-Remaining: 29
X-RateLimit-Used: 1
其中,通過Link信息可以知道這個查詢的最大頁數(shù)(每頁有最多100條記錄的限制)。通過X-Rate Limit-Limit、X-RateLimit-Remaining和X-RateLimit-Used可以知道當(dāng)前訪問頻率限制情況。
(3)由于GitHub的REST API每次最多只能返回100條數(shù)據(jù),可以通過Link包含的該請求的最后一頁鏈接和下一頁鏈接獲得最后一頁的頁碼。由于GetHub REST API在獲得項(xiàng)目信息時最多能獲得1000條信息,因此在獲得大量數(shù)據(jù)時,需要對數(shù)據(jù)進(jìn)行分段獲取。例如,按照星標(biāo)數(shù)或者復(fù)刻數(shù),當(dāng)請求返回?cái)?shù)據(jù)量超過1000但小于2000時,可以增加查詢排序字段,通過升序、降序分別進(jìn)行查詢,獲取數(shù)據(jù);當(dāng)請求返回?cái)?shù)據(jù)量超過2000時,可以通過增加篩選條件來縮小返回值的數(shù)量。
1.1.3 Python代碼
以項(xiàng)目查詢接口調(diào)用為例,Python代碼如下所示。
import requests
repos_url = "https://api.github.com/search/repositories?q=stars:{}&sort=forks&order={}&per_page=100&page={}"
headers = {
'Authorization': 'token asfasewfa23t34t3fsafswef',
'Accept': 'application/vnd.github.v3.star+json',
}
star_count = 300
order = 'desc'
page = 1
url = repos_url.format(star_count, order, page)
res = requests.get(url=url, headers=headers).json()
使用Mysql數(shù)據(jù)庫分別存儲項(xiàng)目信息、星標(biāo)歷史信息、復(fù)刻歷史信息和提問歷史信息,表結(jié)構(gòu)按照API接口返回的JSON信息的字段進(jìn)行設(shè)置。后期為了方便做數(shù)據(jù)分析,還創(chuàng)建了星標(biāo)、復(fù)刻和提問的每月數(shù)據(jù)量表,以星標(biāo)每月數(shù)據(jù)量表為例,創(chuàng)建數(shù)據(jù)表的SQL語句如下。
CREATE TABLE 'starred_info' (
'auto_id' bigint(11) NOT NULL AUTO_INCREMENT,
'repo_id' bigint(20) NULL DEFAULT NULL,
'date_str' varchar(6) NULL DEFAULT NULL,
'starred_count' int(11) NULL DEFAULT NULL,
PRIMARY KEY ('auto_id') USING BTREE,
UNIQUE INDEX 'repo_id_starred_date'('repo_id', 'date_str') USING BTREE,
INDEX 'repo_id'('repo_id') USING BTREE,
CONSTRAINT 'repo_id2' FOREIGN KEY ('repo_id') REFERENCES 'repository' ('id') ON DELETE CASCADE ON UPDATE RESTRICT
)
星標(biāo)、復(fù)刻和提問的歷史數(shù)據(jù)是每次標(biāo)星、復(fù)刻和提問的信息,包括具體時間??梢詫⒕唧w時間按照月進(jìn)行分組,統(tǒng)計(jì)每個月的星標(biāo)、復(fù)刻和提問的數(shù)據(jù),存入數(shù)據(jù)庫,生成標(biāo)星、復(fù)刻和提問的月度統(tǒng)計(jì)數(shù)據(jù)表。例如,提取星標(biāo)月度數(shù)據(jù)的SQL如下所示。
sql = "select repo_id,substr({},1,7) as y_m,count(auto_id) as cnt from {} where processed=0 group by repo_id,y_m order by repo_id, y_m".format('created_at', cnf.starred_history_table)
注:筆者使用python語言進(jìn)行開發(fā),所有與配置相關(guān)的參數(shù)都寫在setting.py文件中,引入setting.py時設(shè)置其別名為cnf。
數(shù)據(jù)展示系統(tǒng)采用Django框架,前端通過Echarts[3]繪制項(xiàng)目的星標(biāo)、復(fù)刻或提問的數(shù)量圖。從Echart官網(wǎng)下載JS庫,按照在線例子的格式配置options的內(nèi)容,展示的數(shù)據(jù)由Django從數(shù)據(jù)庫中讀取,然后傳到前端,提供給Echart的options。在此過程中,可生成以下幾類圖。
(1)某一項(xiàng)目每月星標(biāo)、復(fù)刻和提問數(shù)據(jù)的總量圖。圖2為某項(xiàng)目每月星標(biāo)數(shù)量圖,從中可以看出該項(xiàng)目的關(guān)注度在持續(xù)增加。
(2)某一項(xiàng)目每月星標(biāo)、復(fù)刻和提問數(shù)據(jù)的增量圖。圖3為某項(xiàng)目每月星標(biāo)數(shù)量的增量圖,從中可以看出該項(xiàng)目的關(guān)注度呈下降趨勢。
圖2 某項(xiàng)目每月星標(biāo)數(shù)量圖
圖3 某項(xiàng)目當(dāng)月和上月星標(biāo)數(shù)量差值圖
(3)兩個或多個項(xiàng)目每月星標(biāo)、復(fù)刻和提問數(shù)據(jù)的總量對比圖。圖4為兩個項(xiàng)目星標(biāo)數(shù)量的對比圖,從中可以看出上面那條曲線代表的項(xiàng)目關(guān)注度超過下面那條曲線代表的項(xiàng)目關(guān)注度,并且關(guān)注度的差距呈逐漸加大的趨勢。
(4)兩個項(xiàng)目每月星標(biāo)、復(fù)刻和提問數(shù)量的差值圖。圖5為兩個項(xiàng)目每月星標(biāo)數(shù)量的差值圖,從中可以看出最開始的時候項(xiàng)目blockchain的關(guān)注度低于項(xiàng)目bigchaindb的關(guān)注度,但是后來項(xiàng)目blockchain的關(guān)注度逐漸超越項(xiàng)目bigchaindb的關(guān)注度,且差距越拉越大。
圖4 兩個項(xiàng)目星標(biāo)數(shù)量的對比圖
圖5 兩個項(xiàng)目星標(biāo)數(shù)量的差值圖
通過對GitHub數(shù)據(jù)的分析,結(jié)合不同的可視化展示,可以分析某個ICT領(lǐng)域或者領(lǐng)域中兩個有代表性的項(xiàng)目的關(guān)注度的變化趨勢,進(jìn)而以此預(yù)估整個產(chǎn)業(yè)的發(fā)展趨勢。例如,分析某個領(lǐng)域的代表性項(xiàng)目,若其星標(biāo)、復(fù)刻和提問數(shù)量每月呈現(xiàn)上升趨勢,可以說明其所在領(lǐng)域的關(guān)注度正逐漸提升。再比如,同一個領(lǐng)域中有兩種有代表性的技術(shù),其代表性項(xiàng)目的星標(biāo)、復(fù)刻和提問數(shù)量的差值在逐漸增大,這說明某一個技術(shù)正在逐步被更多人所關(guān)注,那么可以此預(yù)測該技術(shù)或?qū)⒊蔀橹髁骷夹g(shù),未來可以針對這個技術(shù)進(jìn)行重點(diǎn)關(guān)注和研究。
GitHub為分析ICT產(chǎn)業(yè)各個領(lǐng)域的發(fā)展趨勢提供了大量的數(shù)據(jù),很好地解決了數(shù)據(jù)源的問題。本文的數(shù)據(jù)處理和展示的方法有助于分析全球、主要國家/地區(qū)乃至某個公司在ICT特定領(lǐng)域的發(fā)展趨勢。未來的研究可以從如何更充分地利用GitHub數(shù)據(jù)、從更多維度對GitHub進(jìn)行分析入手,以更好地研究ICT產(chǎn)業(yè)各個領(lǐng)域的發(fā)展趨勢。