数据分析入门(基于python)——学术前沿趋势分析——Task1:论文数据统计

Task1:论文数据统计

  • 任务背景
  • 任务描述
  • 数据集介绍
  • 具体思路以及代码实现
    • 导入package并读取原始数据
    • 数据预处理
    • 数据分析及可视化

任务背景

本任务的背景为使用公开的arXiv论文完成相应的数据分析操作,并且完成具体的可视化分析。

任务描述

论文数量统计,即统计2019年以后的计算机各个方向论文数量。

数据集介绍

数据集来源:数据集链接
数据集的各个特征的含义如下:
在这里插入图片描述
通过以上字段含义信息,可以发现,在本任务中,我们关心的字段有’categories’(即文章类别),以及上文中遗漏的字段’update_date’(即文章发布时间)。

具体思路以及代码实现

导入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语句优势:1.自动关闭文件句柄;2.自动显示(处理)文件读取数据异常
with open("arxiv-metadata-oai-snapshot.json", 'r') as f: 
    for line in f: 
        data.append(json.loads(line))
        
data = pd.DataFrame(data) #将list变为dataframe格式,方便使用pandas进行分析
data.shape #显示数据大小

数据分析入门(基于python)——学术前沿趋势分析——Task1:论文数据统计_第1张图片
可以发现,有1796911个样本,每个样本含14个特征。
可以进一步查看样本的特征列表以及前五个样本:

data.columns.to_list()

数据分析入门(基于python)——学术前沿趋势分析——Task1:论文数据统计_第2张图片

data.head() #显示数据的前五行

数据分析入门(基于python)——学术前沿趋势分析——Task1:论文数据统计_第3张图片

数据预处理

首先粗略统计论文的种类信息:

'''
count:一列数据的元素个数;
unique:一列数据中元素的种类;
top:一列数据中出现频率最高的元素;
freq:一列数据中出现频率最高的元素的个数;
'''

data["categories"].describe()

数据分析入门(基于python)——学术前沿趋势分析——Task1:论文数据统计_第4张图片
以上的结果表明:共有1796911个数据,有61371个子类(因为有论文的类别是多个,例如一篇paper的类别是CS.AI & CS.MM和一篇paper的类别是CS.AI & CS.OS属于不同的子类别,这里仅仅是粗略统计),其中最多的种类是astro-ph,即Astrophysics(天体物理学),共出现了86914次。
由于部分论文的类别不止一种,所以下面我们判断在本数据集中共出现了多少种独立的数据集。

# 所有的种类(独立的)

unique_categories = set([i for l in [x.split(' ') for x in data["categories"]] for i in l])
print(len(unique_categories))
unique_categories

数据分析入门(基于python)——学术前沿趋势分析——Task1:论文数据统计_第5张图片
首先看结果,共有176种论文种类。
再来简单分析一下代码,这里使用列表推导式来得到想要的论文种类集合,以上列表推导式等价于:

l1 = [] 
for l in [x.split(' ') for x in data["categories"]]:
    for i in l:
        l1.append(i)
unique_categories = set(l1)

其中set的功能是去重,因为set这个数据类型是满足互异性的,即没有重复的元素。
考虑到任务需求为对2019年以后的计算机各个方向的论文数量,先利用“update_date”字段进行筛选。这里是的思路是利用“update_date”字段获取论文发布年份,并将“year”特征加入到数据中,将“update_date”字段删除,至此,就完成了第一步有关时间的筛选。

data["year"] = pd.to_datetime(data["update_date"]).dt.year #将update_date从例如2019-02-20的str变为datetime格式,并提取处year
del data["update_date"] #删除 update_date特征,其使命已完成
data = data[data["year"] >= 2019] #找出 year 中2019年以后的数据,并将其他数据删除
# data.groupby(['categories','year']) #以 categories 进行排序,如果同一个categories 相同则使用 year 特征进行排序
data.reset_index(drop=True, inplace=True) #重新编号
data #查看结果

数据分析入门(基于python)——学术前沿趋势分析——Task1:论文数据统计_第6张图片
接下来,需要获取计算机各个方向的字段列表,这里使用爬虫获取计算机领域内的所有文章:

#爬取所有的类别
website_url = requests.get('https://arxiv.org/category_taxonomy').text #获取网页的文本数据
soup = BeautifulSoup(website_url,'lxml') #爬取数据,这里使用lxml的解析器,加速
root = soup.find('div',{
     'id':'category_taxonomy_list'}) #找出 BeautifulSoup 对应的标签入口
tags = root.find_all(["h2","h3","h4","p"], recursive=True) #读取 tags

#初始化 str 和 list 变量
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) #正则表达式:模式字符串:(.*)\((.*)\);被替换字符串"\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)

#根据以上信息生成dataframe格式的数据
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
    
})

#按照 "group_name" 进行分组,在组内使用 "archive_name" 进行排序
df_taxonomy.groupby(["group_name","archive_name"])
df_taxonomy```
```javascript
// 创建数据库
CREATE DATABASE <数据库名称>;

结果如下:
数据分析入门(基于python)——学术前沿趋势分析——Task1:论文数据统计_第7张图片

数据分析及可视化

接下来我们首先看一下所有大类的paper数量分布:

_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()
_df

结果如下:
数据分析入门(基于python)——学术前沿趋势分析——Task1:论文数据统计_第8张图片
下面我们使用饼图进行上图结果的可视化:

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()

结果如下:
数据分析入门(基于python)——学术前沿趋势分析——Task1:论文数据统计_第9张图片
下面统计在计算机各个子领域2019年后的paper数量:

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")

结果如下:
数据分析入门(基于python)——学术前沿趋势分析——Task1:论文数据统计_第10张图片

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