使用Python挖掘GitHub的流行趋势(下)
- 来源 | 愿码(ChainDesk.CN)内容编辑
- 愿码Slogan | 连接每个程序员的故事
- 网站 | http://chaindesk.cn
- 愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。
- 官方公众号 | 愿码 | 愿码服务号 | 区块链部落
- 免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码
本文阅读时长:8min
在本系列的第1部分中,我们收集了GitHub数据进行分析。本文,我们将根据我们的要求分析这些数据,以获得关于GitHub上最热门和流行的工具和语言的有趣见解。
到目前为止,我们已经看到GitHub API提供了有关围绕这些存储库的用户活动的代码存储库和元数据的有趣信息集。在接下来的部分中,我们将分析这些数据,通过分析其描述找出哪些是最受欢迎的存储库。当下技术发展如此迅速,这种方法可以帮助我们保持在最新趋势技术的顶端。为了找出什么是趋势技术,我们将分几步执行分析 :
-
根据描述检测最热门的主题/技术
-
确定全球最流行的编程语言
-
了解哪些编程语言用于顶级技术
确定最高技术
首先,我们将使用文本分析技术来确定2017年与存储库中的技术相关的最受欢迎的短语。我们的分析将集中在最常见的bigram。
我们导入一个实现n-gram搜索工具的nltk.collocation 模块:
import nltk
from nltk.collocations import *
然后,我们将clean description列转换为标记列表:
list_documents = df['clean'].apply(lambda x: x.split()).tolist()
当我们对文档执行分析时,我们将使用方法from_documents而不是默认的from_words 。这两种方法的区别在于输入的数据格式不同。在我们的案例中使用的那个用作参数列表,并且以文档方式而不是语料库方式搜索n-gram。它防止检测由一份文件的最后一个单词和另一份文件的第一个单词组成的双字符:
bigram_measures = nltk.collocations.BigramAssocMeasures()
bigram_finder = BigramCollocationFinder.from_documents(list_documents)
我们只考虑在文档集中出现至少三次的二元组:
bigram_finder.apply_freq_filter(3)
我们可以使用不同的关联度量来找到最佳的bi-gram,例如原始频率,pmi,学生t或chi sq。我们将主要关注原始频率测量,这是我们案例中最简单和最方便的指标。
根据raw_freq 测量,我们得到前20个big:
bigrams = bigram_finder.nbest(bigram_measures.raw_freq,20)
我们也可以通过应用score_ngrams 方法获得他们的分数:
scores = bigram_finder.score_ngrams(bigram_measures.raw_freq)
所有其他措施都是作为BigramCollocationFinder的方法实现的。可以分别用pmi、student_t和chi_sq替换raw_freq。但是,要创建可视化,我们需要实际的出现次数而不是分数。我们使用ngram_fd.items()方法创建一个列表,然后按降序对其进行排序。
ngram = list(bigram_finder.ngram_fd.items())
ngram.sort(key=lambda item: item[-1], reverse=True)
它返回一个包含嵌入元组及其频率的元组字典。我们将它转换为一个简单的元组列表,加入bigram标记:
frequency = [(" ".join(k), v) for k,v in ngram]
For simplicity reasons we put the frequency list into a dataframe:
df=pd.DataFrame(frequency)
And then, we plot the top 20 technologies in a bar chart:
import matplotlib.pyplot as plt
plt.style.use('ggplot')
df.set_index([0], inplace = True)
df.sort_values(by = [1], ascending = False).head(20).plot(kind = 'barh')
plt.title('Trending Technologies')
plt.ylabel('Technology')
plt.xlabel('Popularity')
plt.legend().set_visible(False)
plt.axvline(x=14, color='b', label='Average', linestyle='--', linewidth=3)
for custom in [0, 10, 14]:
plt.text(14.2, custom, "Neural Networks", fontsize = 12, va = 'center',
bbox = dict(boxstyle='square', fc='white', ec='none'))
plt.show()
增加一条额外的线,帮助我们汇总与神经网络相关的所有技术。在这种情况下,通过索引选择元素,手动完成(0,10,14)。此操作可能对解释有用。
image前面的分析为我们提供了一套有趣的GitHub上最流行的技术。它包括软件工程,编程语言和人工智能的主题 。需要注意的一件重要事情是神经网络周围的技术不止一次出现,特别是深度学习,TensorFlow和其他特定项目。这并不奇怪,因为神经网络是人工智能领域的重要组成部分,在过去几年中已被大量使用和实践过。所以,如果你是一个有抱负的程序员,对人工智能和机器学习感兴趣,这是一个可以投入的领域!
编程语言
我们分析的下一步是比较不同编程语言之间的流行度。它将基于年度前1000个最受欢迎的存储库的样本 。
首先,我们得到过去三年的数据:
queries = ["created:>2017-01-01", "created:2015-01-01..2015-12-31",
"created:2016-01-01..2016-12-31"]
我们重用search_repo_paging 函数从GitHub API收集数据,并将结果连接到新的数据帧。
df = pd.DataFrame()
for query in queries:
data = search_repo_paging(query)
data = pd.io.json.json_normalize(data)
df = pd.concat([df, data])
我们将数据帧转换为基于create_at 列的时间序列
df['created_at'] = df['created_at'].apply(pd.to_datetime)
df = df.set_index(['created_at'])
然后,我们使用聚合方法groupby 按语言和年份重构数据,并按语言计算出现次数:
dx = pd.DataFrame(df.groupby(['language',
df.index.year])['language'].count())
我们在条形图上表示结果:
fig, ax = plt.subplots()
dx.unstack().plot(kind='bar', title = 'Programming Languages per Year', ax= ax)
ax.legend(['2015', '2016', '2017'], title = 'Year')
plt.show()
image
上图显示了汇编,C,C#中的多种编程语言 ,
Java,Web和移动语言,以及Python,Ruby和 Scala等现代语言 。通过三年的比较,我们看到了一些有趣的趋势。我们注意到HTML,这是所有Web开发的基石,在过去三年中一直保持稳定。Ruby曾经非常流行,但现在流行度下降了。Python的流行度,也是我们本文选择的语言,正在上升。最后,跨设备编程语言 Swift最初由Apple 创建,但现在是开源的,随着时间的推移越来越受欢迎。这可能很有趣在未来几年看,如果这些趋势改变或持续很长时间。
顶级技术中使用的编程语言
现在我们知道了储存库描述中引用的顶级编程语言和技术。在本节中,我们将尝试组合这些信息,并找出每种技术的主要编程语言。
我们从前一部分中选择了四种技术并打印相应的编程语言。我们查找包含已清理的存储库描述的列,并创建一组与该技术相关的语言。使用集合将确保我们具有唯一的值。
technologies_list = ['software engineering', 'deep learning', 'open source', 'exercise practice']
for tech in technologies_list:
print(tech)
print(set(df[df['clean'].str.contains(tech)]['language']))
software engineering
{'HTML', 'Java'}
deep learning
{'Jupyter Notebook', None, 'Python'}
open source
{None, 'PHP', 'Java', 'TypeScript', 'Go', 'JavaScript', 'Ruby', 'C++'}
exercise practice
{'CSS', 'JavaScript', 'HTML'}
在对顶级技术的描述进行文本分析,然后为它们提取编程语言后,我们注意到以下内容:
· 我们将None 视为结果之一,因为某些技术是使用多种编程语言开发的 。
· 远程学习是最受欢迎的,它使用Python作为主要的编程语言。它可能与TensorFlow相关联, TensorFlow是Google发布的一种流行的神经网络模块,在Python中大量使用。
· 开源是最受欢迎的存储库之一,它与几乎每种编程语言都有关联,而且很有趣的是,开源是如此的多样化和流行。
· 我们还注意到人们学习和实践几种与web相关的技术。在选择更复杂的方法之前,这可能是一个简单而有趣的方法。
· 最后,Java是软件工程项目的首选,HTML是工程web页面必不可少的。
您还可以使用此GitHub数据进行更多分析,例如:
· 按技术确定顶级存储库
· 在forks, watchers, open issues等方面比较不同的技术