1. 程式人生 > 其它 >Task2|Datawhale: 論文作者統計

Task2|Datawhale: 論文作者統計

技術標籤:筆記python資料分析

Task2:論文作者統計

import os
import seaborn as sns
from bs4 import BeautifulSoup #用於爬取arxiv資料
import re #用於正則表示式,匹配字串的模式
import requests #用於網路連線,傳送網路請求,使用域名獲取對應資訊
import json
import pandas as pd
import matplotlib.pyplot as plt

os.chdir('D:/Zoey/datawhale_20210110')

def readArxivFile
(path,columns=['id', 'submitter', 'authors', 'title', 'comments', 'journal-ref', 'doi','report-no', 'categories', 'license', 'abstract', 'versions', 'update_date', 'authors_parsed'],count=None): ''' 定義讀取檔案的函式 path: 檔案路徑 columns: 需要選擇的列 count: 讀取行數 '''
data = [] #使用with語句優勢:1.自動關閉檔案控制代碼;2.自動顯示(處理)檔案讀取資料異常 with open(path, 'r') as f: for idx, line in enumerate(f): if idx == count: break d = json.loads(line) d = {col:d[col] for col in columns} data.append(
d) data = pd.DataFrame(data) return data data2 = readArxivFile('arxiv-metadata-oai-snapshot.json', ['id','authors','categories','authors_parsed','update_date']) ##### 2.1 統計所有論文作者出現頻率Top10的姓名 # 為節約時間,選擇類別為cs.CV下面的論文 data_cv = data2[data2['categories'].apply(lambda x: 'cs.CV' in x)] # 拼接所有作者 # sum將巢狀的list轉換為list,參考https://segmentfault.com/q/1010000010514370 all_authors = sum(data_cv['authors_parsed'],[]) ''' data_cv['authors_parsed'] [[姓,名],[姓,名],[姓,名]] [[姓,名],[姓,名]] sum======> all_authors [[姓,名],[姓,名],[姓,名]] join=====> authors_names ['姓 名','姓 名','姓 名'] ''' # 拼接所有作者 authors_names = [' '.join(x) for x in all_authors] authors_names = pd.DataFrame(authors_names) # 根據作者頻率繪製直方圖 plt.figure(figsize=(10, 6)) authors_names[0].value_counts().head(10).plot(kind='barh') # 修改圖配置 names = authors_names[0].value_counts().index.values[:10] _ = plt.yticks(range(0, len(names)), names) plt.ylabel('Author') plt.xlabel('Count') ##### 2.2 統計所有作者姓(姓名最後一個單詞)的出現頻率的Top10 authors_lastnames = [x[0] for x in all_authors] authors_lastnames = pd.DataFrame(authors_lastnames) plt.figure(figsize=(10, 6)) authors_lastnames[0].value_counts().head(10).plot(kind='barh') names = authors_lastnames[0].value_counts().index.values[:10] _ = plt.yticks(range(0, len(names)), names) plt.ylabel('Author') plt.xlabel('Count') ##### 2.3 統計所有作者姓第一個字元的評率 # authors_initial = [x[0:1] for x in authors_lastnames[0]] authors_initial = [x[0][0] for x in all_authors] authors_initial = pd.DataFrame(authors_initial) plt.figure(figsize=(10, 6)) authors_initial[0].value_counts().head(10).plot(kind='barh') names = authors_initial[0].value_counts().index.values[:10] _ = plt.yticks(range(0, len(names)), names) plt.ylabel('Author') plt.xlabel('Count') # cv領域論文數量隨年份走勢 data_cv['year'] = pd.to_datetime(data_cv['update_date']).dt.year data_cv_year = data_cv.groupby(['year']).agg({'id':'count'}).rename(columns={'id':'counts'}).reset_index() plt.plot(data_cv_year['year'],data_cv_year['counts']) plt.xlabel('year') plt.ylabel('counts') plt.title('Trend of papers in CV field') # 設定資料標籤 for a, b in zip(data_cv_year["year"],data_cv_year["counts"]): plt.text(a, b+1, '%.0f' % b, ha='center', va='bottom', fontsize=10, rotation=0) plt.tight_layout() plt.show()