Datawhale-学术前沿趋势分析-Task01

Datawhale-学术前沿趋势分析-Task01

任务说明

任务主题:论文数量统计,即统计2019年全年计算机各个方向论文数量;
任务内容:赛题的理解、使用 Pandas 读取数据并进行统计;
任务成果:学习 Pandas 的基础操作。

数据集介绍

数据集来源:数据集来源.
数据集的格式如下:
id:arXiv ID,可用于访问论文;
submitter:论文提交者;
authors:论文作者;
title:论文标题;
comments:论文页数和图表等其他信息;
journal-ref:论文发表的期刊的信息;
doi:数字对象标识符,https://www.doi.org;
report-no:报告编号;
categories:论文在 arXiv 系统的所属类别或标签;
license:文章的许可证;
abstract:论文摘要;
versions:论文版本;
authors_parsed:作者的信息。

具体代码实现

导入所需的package

#导入所需的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 open("E:\\Python\\DateWhale\\Task-01\\DataSet\\arxiv-metadata-oai-snapshot.json",'r') as f:
    for idx , line in enumerate(f):
        if idx >=100 :
            break
        data.append(json.loads(line))
data = pd.DataFrame(data)
print(data.shape)

输出结果
在这里插入图片描述
读取数据前5行

print(data.head())

输出结果
在这里插入图片描述

定义读取文件的函数

def readArxivFile(path, columns = ['id', 'submitter', 'authors', 'title', 'comments', 'journal-ref', 'doi', 
        'report-no', 'categories', 'license', 'abstract', 'versions', 'update_date', 'authors_parsed'],count = None):
    data = []
    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
data = readArxivFile('E:\\Python\\DateWhale\\Task-01\\DataSet\\arxiv-metadata-oai-snapshot.json', ['id', 'categories', 'update_date'])

对时间特征进行预处理

data['year'] = pd.to_datetime(data['update_date']).dt.year
del data['update_date']
data = data[data['year']>= 2019]
data.reset_index(drop=True,inplace=True)
print(data)

输出结果
Datawhale-学术前沿趋势分析-Task01_第1张图片

爬取所有类别的论文数据

website_url = requests.get('https://arxiv.org/category_taxonomy').text
soup = BeautifulSoup(website_url,'lxml')
root = soup.find('div',{
     'id':'category_taxonomy_list'})
tags = root.find_all(['h2','h3','h4','p'],recursive=True)
level_1_name = ''
level_2_name = ''
level_2_code= ''
level_1_names = []
level_2_codes = []
level_2_names = []
level_3_codes = []
level_3_names = []
level_3_notes = []

for t in tags :
    if t.name =='h2':
        level_1_name = t.text 
        level_2_code = t.text 
        level_2_name = t.text 
    elif t.name =='h3':
        raw = t.text 
        level_2_code = re.sub(r"(.*)\((.*)\)",r"\2",raw)
        level_2_name = re.sub(r"(.*)\((.*)\)",r"\1",raw)
    elif t.name =='h4':
        raw =t.text 
        level_3_code = re.sub(r"(.*) \((.*)\)",r"\1",raw)
        level_3_name = re.sub(r"(.*) \((.*)\)",r"\2",raw)
    elif t.name == 'p':
        notes = t.text 
        level_1_names.append(level_1_name)
        level_2_names.append(level_2_name)
        level_2_codes.append(level_2_code)
        level_3_names.append(level_3_name)
        level_3_codes.append(level_3_code)
        level_3_notes.append(notes)
df_taxonomy = pd.DataFrame({
     
    'group_name':level_1_names,
    'archive_name':level_2_names,
    'archive_id':level_2_codes,
    'category_name':level_3_names,
    'categories':level_3_codes,
    'category_description':level_3_notes 

})
df_taxonomy.groupby(['group_name','archive_name'])
print(df_taxonomy)

输出结果
Datawhale-学术前沿趋势分析-Task01_第2张图片

数据分析与可视化

统计各类别论文数量

_df = data.merge(df_taxonomy, on="categories", how="left").drop_duplicates(["id","group_name"]).groupby("group_name").agg({
     "id":"count"}).sort_values(by="id",ascending=False).reset_index()
print(_df)

输出结果
Datawhale-学术前沿趋势分析-Task01_第3张图片

使用饼图进行上图结果的可视化

fig = plt.figure(figsize = (15,12))
explode = (0,0,0,0.2,0.3,0.3,0.2,0.1)
plt.pie(_df['id'], labels = _df['group_name'],autopct = '%1.2f%%',startangle = 160, explode = explode)
plt.tight_layout()
plt.show()

输出结果

Datawhale-学术前沿趋势分析-Task01_第4张图片

对数据进行统计和排序

group_name = 'Computer Science'
cats = data.merge(df_taxonomy, on = 'categories').query('group_name == @group_name')
cats.groupby(['year','category_name']).count().reset_index().pivot(index = 'category_name',columns='year',values = 'id')
print(cats)

输出结果
Datawhale-学术前沿趋势分析-Task01_第5张图片

结论

我们可以从结果看出,Computer Vision and Pattern Recognition(计算机视觉与模式识别)类是CS中paper数量最多的子类,遥遥领先于其他的CS子类,并且paper的数量还在逐年增加;另外,Computation and Language(计算与语言)、Cryptography and Security(密码学与安全)以及 Robotics(机器人学)的2019年paper数量均超过1000或接近1000,这与我们的认知是一致的。

你可能感兴趣的:(NoFear的数据分析之路,python,数据分析)