中国信通院李鲲程等:基于GitHub的ICT相关领域发展趋势的分析
The following article is from 信息通信技术与政策 Author 李鲲程,祖子月 等
自20世纪90年代以来, 信息通信技术(Information and Communication Technology,ICT)产业迅猛发展,新技术不断出现,对世界发展产生了极大影响。以ICT技术为核心的数字化变革影响着每一个人,也引起了人们的普遍关注,有必要找到一个可以定性分析ICT产业发展趋势并进行可视化展示的方法,这将有助于人们更高效地研究产业特点、分析产业发展方向并探索新需求。本文设计并实现了一个数据获取与分析系统,完成了对GitHub上指定ICT行业项目数据的获取、清洗和分析,以项目数量、关键项目的星标(Stars)数量、复刻(Forks)数量和提问(Issues)数量为依据对项目数量和关注度的变化进行多维度分析,利用百度ECharts实现数据可视化,进而分析ICT相关领域的发展趋势。
1 系统实现
GitHub上的海量ICT开源项目为行业发展趋势的研究提供了丰富的数据来源。用户可以根据自身的需求通过检索项目的About和Readme的内容从GitHub上获取所需项目数据,并对这些数据进行相关操作。在GitHub 中,项目的星标可以被直观地理解成对项目的点赞数量,复刻是为了将项目按照自己的需求进行修改而做的服务器端的复制操作,提问是对项目进行讨论的内容。这些属性都从不同侧面反映了项目的受关注程度。本文设计的数据获取与分析系统通过获取GitHub项目以及项目的星标、复刻和提问信息,并对这些信息进行清洗和处理,最终以折线图的形式将项目的星标、复刻或提问的数量信息展现出来,用于分析项目以及项目所代表的技术领域的发展趋势(见图1)。
1.1 数据获取GitHub提供的REST API[1-2]接口可以对开源数据进行查询,本文设计的数据获取与分析系统用到了其中的项目查询接口、星标(Star)信息查询接口、复刻(Fork)信息查询接口、提问(Issue)信息查询接口。每个接口的使用都包括接口地址、参数和返回结果三部分内容,其中的参数部分在上述接口中都是相同的(见表1)。
表1 GitHub REST API接口参数说明
1.1.1 数据获取使用说明(1)项目查询接口• 接口地址:https://api.github.com/search/repositories。• 返回结果:以JSON的形式返回,包含查询结果个数字段(total_count)和项目列表字段(items),项目列表中包括项目序列号(id)、项目名称(full_name)、创建时间(created_at)、星标数(stargazers_count)、复刻数(forks_count)和提问数(open_issues_count)。
(2)星标(Star)信息查询接口• 接口地址:https://api.github.com/repos/{full_name}/stargazers?per_page=100&page=1。• 返回结果:以JSON 格式返回结果,包括星标事件(starred_at)和标星人信息(user)。
(3)复刻(Fork)信息查询接口• 接口地址:https://api.github.com/repos/{ full_name}/forks?per_page=100&page=1。• 返回结果:以JSON格式返回各个复刻项目的信息,包括项目序列号(id)、项目名称(full_name)、创建时间(created_at)、星标数(stargazers_count)、复刻数(forks_count)和提问数(open_issues_count)等信息。
(4)提问(Issue)信息查询接口• 接口地址:https://api.github.com/repos/{full_name}/issues?per_page&page=1。• 返回结果:以JSON格式返回结果,包括总的问题数(total_count)和问题详细信息(items),items 包括问题序列号(id)、问题标题(title)和提问用户(user)等信息。
1.1.2 关于GitHub的REST API查询接口的几点说明(1)在开发接口中,full_name由项目所有者的loginid和项目名称(name)组成,是logind/name形式。(2)接口调用的应答Headers信息如下。Link: <https://api.github.com/search/repositories?q=star%3A100&page=2>; rel="next",<https://api. github.com/search/repositories?q=star%3A100&page=3>;rel="last"X-RateLimit-Limit:30X-RateLimit-Remaining:29X-RateLimit-Used:1
其中,通过Link信息可以知道这个查询的最大页数(每页有最多100条记录的限制)。通过X-Rate Limit-Limit、X-RateLimit-Remaining和X-RateLimitUsed可以知道当前访问频率限制情况。
(3)由于GitHub的REST API每次最多只能返回100条数据,可以通过Link包含的该请求的最后一页链接和下一页链接获得最后一页的页码。由于GetHub REST API在获得项目信息时最多能获得1000条信息,因此在获得大量数据时,需要对数据进行分段获取。例如,按照星标数或者复刻数,当请求返回数据量超过1000但小于2000时,可以增加查询排序字段,通过升序、降序分别进行查询,获取数据;当请求返回数据量超过2000时,可以通过增加筛选条件来缩小返回值的数量。
1.1.3 Python代码以项目查询接口调用为例,Python代码如下所示。import requestsrepos_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 = 300order = 'desc'page = 1url = repos_url.format(star_count, order, page)res = requests.get(url = url,headers = headers). json()
1.2 数据存储使用Mysql数据库分别存储项目信息、星标历史信息、复刻历史信息和提问历史信息,表结构按照API接口返回的JSON信息的字段进行设置。后期为了方便做数据分析,还创建了星标、复刻和提问的每月数据量表,以星标每月数据量表为例,创建数据表的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)
1.3 数据处理星标、复刻和提问的历史数据是每次标星、复刻和提问的信息,包括具体时间。可以将具体时间按照月进行分组,统计每个月的星标、复刻和提问的数据,存入数据库,生成标星、复刻和提问的月度统计数据表。例如,提取星标月度数据的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语言进行开发,所有与配置相关的参数都写在setting.py文件中,引入setting.py时设置其别名为cnf。
1.4 数据展示数据展示系统采用Django框架,前端通过Echarts[3]绘制项目的星标、复刻或提问的数量图。从Echart官网下载JS库,按照在线例子的格式配置options的内容,展示的数据由Django从数据库中读取,然后传到前端,提供给Echart的options。在此过程中,可生成以下几类图。
(1)某一项目每月星标、复刻和提问数据的总量图。图2为某项目每月星标数量图,从中可以看出该项目的关注度在持续增加。
(2)某一项目每月星标、复刻和提问数据的增量图。图3为某项目每月星标数量的增量图,从中可以看出该项目的关注度呈下降趋势。
(3)两个或多个项目每月星标、复刻和提问数据的总量对比图。图4为两个项目星标数量的对比图,从中可以看出上面那条曲线代表的项目关注度超过下面那条曲线代表的项目关注度,并且关注度的差距呈逐渐加大的趋势。
(4)两个项目每月星标、复刻和提问数量的差值图。图5为两个项目每月星标数量的差值图,从中可以看出最开始的时候项目blockchain的关注度低于项目bigchaindb的关注度,但是后来项目blockchain的关注度逐渐超越项目bigchaindb的关注度,且差距越拉越大。
1.5 基于GitHub平台的产业发展趋势评价通过对GitHub数据的分析,结合不同的可视化展示,可以分析某个ICT领域或者领域中两个有代表性的项目的关注度的变化趋势,进而以此预估整个产业的发展趋势。例如,分析某个领域的代表性项目,若其星标、复刻和提问数量每月呈现上升趋势,可以说明其所在领域的关注度正逐渐提升。再比如,同一个领域中有两种有代表性的技术,其代表性项目的星标、复刻和提问数量的差值在逐渐增大,这说明某一个技术正在逐步被更多人所关注,那么可以此预测该技术或将成为主流技术,未来可以针对这个技术进行重点关注和研究。
2 结束语
GitHub为分析ICT产业各个领域的发展趋势提供了大量的数据,很好地解决了数据源的问题。本文的数据处理和展示的方法有助于分析全球、主要国家/地区乃至某个公司在ICT特定领域的发展趋势。未来的研究可以从如何更充分地利用GitHub数据、从更多维度对GitHub进行分析入手,以更好地研究ICT产业各个领域的发展趋势。
参考文献
[1] 李云飞, 洪蕾. REST-JSON API规范研究[J]. 科技展望, 2017,27(2):7-8.[2] GitHub. GitHub Rest API document[R/OL]. [2020-11-23]. https://docs.github.com/en/free-pro-team@latest/rest.[3] Echarts. Echarts手册[R/OL]. [2020-11-23]. https://echarts.apache.org/zh/tutorial.html.
作者简介
李鲲程
中国信息通信研究院数据研究中心高级工程师,主要从事大数据相关的软件开发、系统运维和数据分析的工作。
祖子月
中国信息通信研究院数据研究中心助理工程师,主要从事ICT产业数据库建设、电信业领域研究等工作。
费军旗
中国信息通信研究院数据研究中心助理工程师,主要从事公共数据采集和数据分析等方面的技术工作。
论文引用格式:
李鲲程, 祖子月, 费军旗. 基于GitHub的ICT相关领域发展趋势的分析[J]. 信息通信技术与政策, 2021,47(4):65-70.
本文刊于《信息通信技术与政策》2021年 第4期
主办:中国信息通信研究院
《信息通信技术与政策》是工业和信息化部主管、中国信息通信研究院主办的专业学术期刊。本刊定位于“信息通信技术前沿的风向标,信息社会政策探究的思想库”,聚焦信息通信领域技术趋势、公共政策、国家/产业/企业战略,发布前沿研究成果、焦点问题分析、热点政策解读等,推动5G、工业互联网、数字经济、人工智能、区块链、大数据、云计算等技术产业的创新与发展,引导国家技术战略选择与产业政策制定,搭建产、学、研、用的高端学术交流平台。
《信息通信技术与政策》官网开通啦!
http://ictp.caict.ac.cn/
(点击“阅读原文”访问)
校 审 | 陈 力、珊 珊
编 辑 | 凌 霄
推荐阅读
《新基建》专辑