使用Python挖掘GitHub的流行趋势(上)

  • 来源 | 愿码(ChainDesk.CN)内容编辑
  • 愿码Slogan | 链接每一个程序员的故事
  • 网站 | http://chaindesk.cn
  • 愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优点创造睡后收入。
  • 官方公众号 | 愿码 | 愿码服务号 | 区块链部落
  • 免费加入愿码全思惟工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码

本文阅读时长:10minhtml

在本文中,咱们将探讨如何利用Python的强大功能来收集和处理来自GitHub的数据并使其准备好分析。git

GitHub采用普遍使用的版本控制方法,经过在编程领域实现社交网络功能,将编码提高到最高水平。GitHub容许您建立代码存储库并提供多种协做功能,错误跟踪,功能请求,任务管理和维基。它拥有大约2000万用户和5700万个代码库(来源:维基百科)。这些统计数据很容易证实这是程序员最具表明性的平台。它也是几个开源项目的平台,这些项目为软件开发领域作出了巨大贡献。假设GitHub使用了最新的编程工具和技术,分析GitHub能够帮助咱们检测最流行的技术。存储库在GitHub上的受欢迎程度是经过它从社区收到的提交数量来评估的。咱们将在本文中使用GitHub API来收集具备最多提交数量的存储库的数据,而后发现其中最流行的技术。程序员

范围和流程


GitHub API容许咱们获取有关用户提交的公共代码存储库的信息。它涵盖了许多开源,教育和我的项目。咱们的重点是找到过去几个月的趋势技术和编程语言,并与过去几年的存储库进行比较。咱们将收集有关存储库的全部元信息,例如:github

  • Name:存储库的名称
  • Description:存储库的描述
  • Watchers:人们关注存储库并得到有关其活动的通知
  • Forks :用户将存储库克隆到本身的账户
  • Open Issues:提交的有关存储库的问题

咱们将使用这些数据,定性和定量信息的组合,来识别最新趋势和微弱信号。该过程能够经过下图中显示的步骤表示:
web

获取数据


在使用API以前,咱们须要设置受权。API容许您访问全部公开可用的数据,但某些端点须要用户权限。您可使用应用程序设置建立具备某些特定范围访问权限的新令牌。范围取决于您的应用程序的需求,例如访问用户电子邮件,更新用户配置文件等。 密码受权仅在某些状况下须要,例如用户受权的应用程序访问。在这种状况下,您须要提供用户名或电子邮件以及密码。
全部API访问均经过HTTPS进行,并可从https://api.github.com/ 域访问。全部数据都以JSON的形式发送和接收。数据库

速率限制


GitHub Search API旨在帮助查找特定项(存储库,用户等)。速率限制策略容许每次搜索最多1,000个结果。对于使用基自己份验证,OAuth或客户端ID和密钥的请求,您每分钟最多能够发出30个请求。对于未经身份验证的请求,速率限制容许您每分钟最多发出10个请求。编程

链接到GitHub


GitHub提供了一个搜索端点,它返回与查询匹配的全部存储库。随着咱们的进展,在分析的不一样步骤中,咱们将更改变量q(查询)的值。在第一部分中,咱们将检索自2017年1月1日以来建立的全部存储库,而后咱们将比较前几年的结果。json

首先,咱们初始化一个空列表结果,该结果存储有关存储库的全部数据。其次,咱们使用API所需的参数构建get请求。咱们每一个请求只能得到100个结果,所以咱们必须使用分页技术来构建完整的数据集。api

results = []

q = "created:>2017-01-01"

def search_repo_paging(q):

url = 'https://api.github.com/search/repositories'

params = {'q' : q, 'sort' : 'forks', 'order': 'desc', 'per_page' : 100}

while True:

res = requests.get(url,params = params)

result = res.json()

results.extend(result['items'])

params = {}

try:

url = res.links['next']['url']

except:

break

在第一个请求中,咱们必须将全部参数传递给请求中的方法。而后,咱们为每一个下一页建立一个新请求,能够在连接中找到包含全部其余参数的资源的完整连接。这就是咱们清空params词典的缘由。
GET res.links'next'. res. 网络

重复该操做,直到字典中没有下一页键。对于其余数据集,咱们修改搜索查询的方式是从前几年检索存储库。例如,要从2015年获取数据,咱们定义如下查询:res.links 

q = "created:2015-01-01..2015-12-31"

为了找到合适的存储库,API提供了大量的查询参数。使用限定符系统能够高精度地搜索存储库。从主搜索参数q开始,咱们有如下选项:

  • sort:设置为forks,由于咱们有兴趣找到具备最大数量的分支的存储库(您还能够按星数或更新时间排序)
  • order:设置为降序
  • per_page:设置为返回的最大存储库数量

固然,搜索参数q 能够包含多个限定符组合。

数据拉动


咱们经过GitHub API收集的数据量使其适合内存。咱们能够直接在pandas数据帧中处理它。若是须要更多数据,咱们建议将其存储在数据库中,例如MongoDB。
咱们使用JSON工具将结果转换为干净的JSON并建立数据帧。

from pandas.io.json import json_normalize

import json

import pandas as pd

import bson.json_util as json_util

sanitized = json.loads(json_util.dumps(results))

normalized = json_normalize(sanitized)

df = pd.DataFrame(normalized)

数据框df 包含与GitHub API返回的全部结果相关的列。咱们能够经过输入如下内容列出它们:

Df.columns

Index(['archive_url', 'assignees_url', 'blobs_url', 'branches_url',

'clone_url', 'collaborators_url', 'comments_url', 'commits_url',

'compare_url', 'contents_url', 'contributors_url', 'default_branch',

'deployments_url', 'description', 'downloads_url', 'events_url',

'Fork',

'forks', 'forks_count', 'forks_url', 'full_name', 'git_commits_url',

'git_refs_url', 'git_tags_url', 'git_url', 'has_downloads',

'has_issues', 'has_pages', 'has_projects', 'has_wiki', 'homepage',

'hooks_url', 'html_url', 'id', 'issue_comment_url',

'Issue_events_url',

'issues_url', 'keys_url', 'labels_url', 'language', 'languages_url',

'merges_url', 'milestones_url', 'mirror_url', 'name',

'notifications_url', 'open_issues', 'open_issues_count',

'owner.avatar_url', 'owner.events_url', 'owner.followers_url',

'owner.following_url', 'owner.gists_url', 'owner.gravatar_id',

'owner.html_url', 'owner.id', 'owner.login',

'Owner.organizations_url',

'owner.received_events_url', 'owner.repos_url', 'owner.site_admin',

'owner.starred_url', 'owner.subscriptions_url', 'owner.type',

'owner.url', 'private', 'pulls_url', 'pushed_at', 'releases_url',

'score', 'size', 'ssh_url', 'stargazers_count', 'stargazers_url',

'statuses_url', 'subscribers_url', 'subscription_url', 'svn_url',

'tags_url', 'teams_url', 'trees_url', 'updated_at', 'url',

'Watchers',

'watchers_count', 'year'],

dtype='object')

而后,咱们选择将用于进一步分析的变量子集。咱们跳过与URL、全部者信息或ID 相关的全部技术变量  。其他列包含的信息极可能有助于咱们识别新的技术趋势:

  • description:存储库的用户描述
  • watchers_count:观察者人数
  • size:存储库的大小(以KB为单位)
  • forks_count:叉的数量
  • open_issues_count:未解决的问题数量
  • language:编写存储库的编程语言

咱们选择了衡量存储库流行度的标准。此数字表示有多少人对该项目感兴趣。 可是,咱们也可使用它给咱们提供有关流行度的略有不一样的信息。后者表示实际使用代码的人数,所以它与不一样的组相关。watchers_count forks_count 

数据处理


在上一步中,咱们构建了原始数据,如今能够进行进一步分析。 咱们的目标是分析两种类型的数据:

  • 描述中的文字数据
  • 其余变量的数值数据

它们中的每个都须要不一样的预处理技术。让咱们看一下Detail 中的每种类型。

文本数据


对于第一种,咱们必须建立一个包含已清理字符串的新变量。咱们将分三个步骤完成,这些步骤已在前几章中介绍过:

  • 选择英文说明
  • 符号化
  • 停用词

因为咱们只处理英语数据,所以咱们应该删除全部用其余语言编写的描述。这样作的主要缘由是每种语言都须要不一样的处理和分析流程。若是咱们留下俄语或中文的描述,咱们会获得很是嘈杂的数据,而这些数据是咱们没法解释的。所以,能够说咱们正在分析英语世界的趋势。

首先,咱们删除description列中的全部空字符串。

df = df.dropna(subset=['description'])

为了删除非英语描述,咱们必须首先检测每一个文本中使用的语言。为此,咱们使用了一个名为langdetect 的库,该库基于  Google语言检测项目。

from langdetect import detect

df['lang'] = df.apply(lambda x: detect(x['description']),axis=1)

咱们建立一个包含全部预测的新列。咱们看到不一样的语言,  例如en (英语),zh-cn (中文),vi (越南语)或ca (加泰罗尼亚语)。

df['lang']

0 en

1 en

2 en

3 en

4 en

5 zh-cn

在咱们的数据集中,en占全部存储库的78.7%。咱们如今只选择那些带有英文描述的存储库:

df = df[df['lang'] == 'en']

在下一步中,咱们将使用预处理的文本数据建立一个新的clean列。咱们执行如下代码来执行标记化并删除停用词:

import nltk

from nltk import word_tokenize

from nltk.corpus import stopwords

def clean(text = '', stopwords = []):



#tokenize

tokens = word_tokenize(text.strip())

#lowercase

clean = [i.lower() for i in tokens]

#remove stopwords

clean = [i for i in clean if i not in stopwords]

#remove punctuation

punctuations = list(string.punctuation)

clean = [i.strip(''.join(punctuations)) for i in clean if i not in punctuations]

return " ".join(clean)



df['clean'] = df['description'].apply(str) #make sure description is a string

df['clean'] = df['clean'].apply(lambda x: clean(text = x, stopwords = stopwords.words('english')))

Finally, we obtain a clean column which contains cleaned English descriptions, ready for analysis:

df['clean'].head(5)

0 roadmap becoming web developer 2017

1 base repository imad v2 course application ple…

2 decrypted content eqgrp-auction-file.tar.xz

3 shadow brokers lost translation leak

4 learn design large-scale systems prep system d...

数值数据


对于数值数据,咱们将统计检查值的分布以及是否存在任何缺失值:

df[['watchers_count','size','forks_count','open_issues']].describe()


咱们看到在全部四个变量中没有缺失值:watchers_count、size、forks_count和open_issues。watchers_count的值从0到20,792不等,而最小的fork数是33,并上升到2,589。前四分之一的存储库没有开放问题,而前25%的存储库有超过12个问题。值得注意的是,在咱们的数据集中,有一个包含458个开放问题的存储库。

一旦咱们完成了数据的预处理,咱们的下一步就是分析它,以便从中得到可操做的看法。

相关文章
相关标签/搜索