1. 程式人生 > 實用技巧 >Datawhale 資料分析 Task3

Datawhale 資料分析 Task3

前言:今上午本來想一口氣做完這三個Task(說是自己做好像有點誇張,就像是再看他人的AV程式碼題解一樣),但由於期末出了成績考的有點離譜,81分,打電話和老師聊了聊,老師和我說了很多話使我收穫很大,我們從智慧小車聊到人與人之間的信任,數電老師身體有恙的情況下還堅持帶病上課,住院改卷子,這真的很打動我。只能說一分耕耘一分收穫吧。今天凌晨七點多起床趕這兩個Task,邊看邊學,但是Apply還是沒有弄懂,這個先放到之後。下午兩點要和老師說一說上次的論文(我不知道怎麼說,orz),現在先搞完Task3.

Step 1 匯入包、讀入

# 匯入所需的package
import seaborn as sns #
用於畫圖 from bs4 import BeautifulSoup #用於爬取arxiv的資料 import re #用於正則表示式,匹配字串的模式 import requests #用於網路連線,傳送網路請求,使用域名獲取對應資訊 import json #讀取資料,我們的資料為json格式的 import pandas as pd #資料處理,資料分析 import matplotlib.pyplot as plt #畫圖工具
data  = [] #初始化
#使用with語句優勢:1.自動關閉檔案控制代碼;2.自動顯示(處理)檔案讀取資料異常
with open(r path, '
r') as f: for idx, line in enumerate(f): d = json.loads(line) d = {'abstract': d['abstract'], 'categories': d['categories'], 'comments': d['comments']} data.append(d) data = pd.DataFrame(data) #將list變為dataframe格式,方便使用pandas進行分析 這是挺關鍵的一步的

Step 2 正則表示式匹配及統計

#
使用正則表示式匹配,XX pages data['pages'] = data['comments'].apply(lambda x: re.findall('[1-9][0-9]* pages', str(x))) # 篩選出有pages的論文 data = data[data['pages'].apply(len) > 0] # 由於匹配得到的是一個list,如['19 pages'],需要進行轉換 data['pages'] = data['pages'].apply(lambda x: float(x[0].replace(' pages', '')))

統計頁數(對pages進行統計,統計結果如下:論文平均的頁數為17頁,75%的論文在22頁以內,最長的論文有11232頁。)

data['pages'].describe().astype(int)

選取了論文的第一個類別的主要類別

# 選擇主要類別
data['categories'] = data['categories'].apply(lambda x: x.split(' ')[0])
data['categories'] = data['categories'].apply(lambda x: x.split('.')[0])

# 每類論文的平均頁數
plt.figure(figsize=(12, 6))
data.groupby(['categories'])['pages'].mean().plot(kind='bar')

接下來對論文圖表個數進行抽取(資料處理):

data['figures'] = data['comments'].apply(lambda x: re.findall('[1-9][0-9]* figures', str(x)))
data = data[data['figures'].apply(len) > 0]
data['figures'] = data['figures'].apply(lambda x: float(x[0].replace(' figures', '')))

篩選,包含github的論文

# 篩選包含github的論文
data_with_code = data[(data.comments.str.contains('github')==True)|(data.abstract.str.contains('github')==True)]
data_with_code['text'] = data_with_code['abstract'].fillna('') + data_with_code['comments'].fillna('')
 
# 使用正則表示式匹配論文
pattern = '[a-zA-z]+://github[^\s]*'
data_with_code['code_flag'] = data_with_code['text'].str.findall(pattern).apply(len)

並對論文按照類別進行繪圖:

data_with_code = data_with_code[data_with_code['code_flag'] == 1]
plt.figure(figsize=(12, 6))
data_with_code.groupby(['categories'])['code_flag'].count().plot(kind='bar')

就先寫到這,很多內容沒有展開。

等之後再回頭補充。

orz