DataWhale组队数据分析 TASK 01-论文数据统计

1 任务主题

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

2 数据集

2.1 数据集来源

数据源

2.2 数据集的格式

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

2.3 arxiv论文类别

具体类别论文分类
在这里插入图片描述

3 数据处理

3.1 数据导入

3.1.1 导入库

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 #画图⼯工具

3.1.2 读入数据

data = [] #初始化
#使⽤用with语句句优势: 1.自动关闭⽂文件句句柄; 2.自动显示(处理理)⽂文件读取数据异常
with open("arxiv-metadata-oai-2019.json", 'r') as f:
    for line in f:
        data.append(json.loads(line))
data = pd.DataFrame(data) #将list变为dataframe格式,方便使用pandas进行分析
data.shape #显示数据大小

3.1.3 查看前五行数据

data.head()

3.2 数据预处理

3.2.1粗略统计论文的种类信息

  • count:一列数据的元素个数;
  • unique:一列数据中元素的种类;
  • top:一列数据中出现频率最高的元素;
  • freq:一列数据中出现频率最高的元素的个数。
data["categories"].describe()

3.2.2 独立的数据集

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

3.2.3 2019年以后的所有种类的论文

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 #查看结果

3.2.4 计算机领域内的所有文章

#爬取所有的类别
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
  • pattern : 正则中的模式字符串。
  • repl : 替换的字符串,也可为一个函数。
  • string : 要被查找替换的原始字符串。 count : 模式匹配后替换的最大次数,默认 0 表示替换所有的匹配。
  • flags : 编译时用的匹配模式,数字形式。
  • 其中pattern、repl、string为必选参数

3.3数据分析和可视化

3.3.1 统计结果

#使用merge函数,以两个dataframe共同的属性 “categories” 进行合并
#以 “group_name” 作为类别进行统计,统计结果放入 “id” 列中并排序。
_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

3.3.2可视化

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

3.3.3 计算机各个子领域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")

4 小结

最近在忙论文,任务完成的很仓促,有空还需要再仔细研究下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值