使用Python挖掘GitHub的流行趨勢(下)

  • 來源 | 願碼(ChainDesk.CN)內容編輯
  • 願碼Slogan | 鏈接每一個程序員的故事
  • 網站 | http://chaindesk.cn
  • 願碼願景 | 打造全學科IT系統免費課程,助力小白用戶、初級工程師0成本免費系統學習、低成本進階,幫助BAT一線資深工程師成長並利用自身優點創造睡後收入。
  • 官方公衆號 | 願碼 | 願碼服務號 | 區塊鏈部落
  • 免費加入願碼全思惟工程師社羣 | 任一公衆號回覆「願碼」兩個字獲取入羣二維碼

本文閱讀時長:8min程序員

在本系列的第1部分中,咱們收集了GitHub數據進行分析。本文,咱們將根據咱們的要求分析這些數據,以得到關於GitHub上最熱門和流行的工具和語言的有趣看法。web

到目前爲止,咱們已經看到GitHub API提供了有關圍繞這些存儲庫的用戶活動的代碼存儲庫和元數據的有趣信息集。在接下來的部分中,咱們將分析這些數據,經過分析其描述找出哪些是最受歡迎的存儲庫。當下技術發展如此迅速,這種方法能夠幫助咱們保持在最新趨勢技術的頂端。爲了找出什麼是趨勢技術,咱們將分幾步執行分析 :編程

  1. 根據描述檢測最熱門的主題/技術
  2. 肯定全球最流行的編程語言
  3. 瞭解哪些編程語言用於頂級技術

肯定最高技術


首先,咱們將使用文本分析技術來肯定2017年與存儲庫中的技術相關的最受歡迎的短語。咱們的分析將集中在最多見的bigram。json

咱們導入一個實現n-gram搜索工具的nltk.collocation 模塊:網絡

import nltk

from nltk.collocations import *

而後,咱們將clean description列轉換爲標記列表:app

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)。此操做可能對解釋有用。

前面的分析爲咱們提供了一套有趣的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()

上圖顯示了彙編,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等方面比較不一樣的技術

相關文章
相關標籤/搜索