数据分析—论文数据统计
目录
1.1任务说明
1.2数据集介绍
1.3arxiv论文类别介绍
1.4具体代码实现
1.4.1导入package并读取原始数据
1.4.2数据预处理
1.4.3数据分析及可视化
1.1任务说明
- 任务主题:论文数量统计,即统计2019年全年计算机各方向论文数量
- 赛题的理解、使⽤ Pandas 读取数据并进⾏统计;
- 学习 Pandas 的基础操作;
1.2数据集介绍
-
数据集来源:: https://www.kaggle.com/Cornell-University/arxiv
-
数据集的格式如下:
- id :arXiv ID,可⽤于访问论⽂;
- submitter :论⽂提交者;
- authors :论⽂作者;
- title :论⽂标题;
- comments :论⽂⻚数和图表等其他信息;
- journal-ref :论⽂发表的期刊的信息;
- doi :数字对象标识符,https://www.doi.org;
- report-no :报告编号;
- categories :论⽂在 arXiv 系统的所属类别或标签;
- license :⽂章的许可证;
- abstract :论⽂摘要;
- versions :论⽂版本;
- authors_parsed :作者的信息。
-
数据集实例:
"root":{ "id":string"0704.0001" "submitter":string"Pavel Nadolsky" "authors":string"C. Bal\'azs, E. L. Berger, P. M. Nadolsky, C.-P. Yuan" "title":string"Calculation of prompt diphoton production cross sections at Tevatron and LHC energies" "comments":string"37 pages, 15 figures; published version" "journal-ref":string"Phys.Rev.D76:013009,2007" "doi":string"10.1103/PhysRevD.76.013009" "report-no":string"ANL-HEP-PR-07-12" "categories":string"hep-ph" "license":NULL "abstract":string" A fully differential calculation in perturbative quantum chromodynamics is presented for the production of massive photon pairs at hadron colliders. All next-to-leading order perturbative contributions from quark-antiquark, gluon-(anti)quark, and gluon-gluon subprocesses are included, as well as all-orders resummation of initial-state gluon radiation valid at next-to-next-to leading logarithmic accuracy. The region of phase space is specified in which the calculation is most reliable. Good agreement is demonstrated with data from the Fermilab Tevatron, and predictions are made for more detailed tests with CDF and DO data. Predictions are shown for distributions of diphoton pairs produced at the energy of the Large Hadron Collider (LHC). Distributions of the diphoton pairs from the decay of a Higgs boson are contrasted with those produced from QCD processes at the LHC, showing that enhanced sensitivity to the signal can be obtained with judicious selection of events." "versions":[ 0:{ "version":string"v1" "created":string"Mon, 2 Apr 2007 19:18:42 GMT" } 1:{ "version":string"v2" "created":string"Tue, 24 Jul 2007 20:10:27 GMT" }] "update_date":string"2008-11-26" "authors_parsed":[ 0:[ 0:string"Balázs" 1:string"C." 2:string""] 1:[ 0:string"Berger" 1:string"E. L." 2:string""] 2:[ 0:string"Nadolsky" 1:string"P. M." 2:string""] 3:[ 0:string"Yuan" 1:string"C. -P." 2:string""]] }
1.31.3arxiv论文类别介绍
我们从arxiv官⽹,查询到论⽂的类别名称以及其解释如下。 链接:https://arxiv.org/help/api/user-manual 的 5.3 ⼩节的 Subject Classifications 的部分,或 https://arxiv.org/category_taxonomy, 具体的153种paper的类别部分如下:
'astro-ph': 'Astrophysics',
'astro-ph.CO': 'Cosmology and Nongalactic Astrophysics',
'astro-ph.EP': 'Earth and Planetary Astrophysics',
'astro-ph.GA': 'Astrophysics of Galaxies',
'cs.AI': 'Artificial Intelligence',
'cs.AR': 'Hardware Architecture',
'cs.CC': 'Computational Complexity',
'cs.CE': 'Computational Engineering, Finance, and Science',
'cs.CV': 'Computer Vision and Pattern Recognition',
'cs.CY': 'Computers and Society',
'cs.DB': 'Databases',
'cs.DC': 'Distributed, Parallel, and Cluster Computing',
'cs.DL': 'Digital Libraries',
'cs.NA': 'Numerical Analysis',
'cs.NE': 'Neural and Evolutionary Computing',
'cs.NI': 'Networking and Internet Architecture',
'cs.OH': 'Other Computer Science',
'cs.OS': 'Operating Systems',
1.4具体代码实现以及讲解
1.4.1导入package并读取原始数据
这⾥使⽤的package的版本如下(python 3.7.4):
- seaborn:0.9.0
- BeautifulSoup:4.8.0
- requests:2.22.0
- json:0.8.5
- pandas:0.25.1
- matplotlib:3.1.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("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 #显示数据⼤⼩
data.head()#显示数据的前五行
结果为: (1778381, 14)
其中的1778381表示数据总量,14表示特征数,对应我们1.2节说明的论⽂的14种信息。
前五行数据为:
1.4.2数据预处理
⾸先我们先来粗略统计论⽂的种类信息:
'''
count:⼀列数据的元素个数;
unique:⼀列数据中元素的种类;
top:⼀列数据中出现频率最⾼的元素;
freq:⼀列数据中出现频率最⾼的元素的个数;
'''
data["categories"].describe()
结果为:
count 1778381
unique 61371
top astro-ph
freq 86914
Name: categories, dtype: object
以上的结果表明:共有1778381个数据,有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])
len(unique_categories)
unique_categories
-
python的内置函数set(),创建一个无序不重复的元素集
-
split 函数将多类别使⽤ “ ”(空格)分开
这⾥使⽤了 split 函数将多类别使⽤ “ ”(空格)分开,组成list,并使⽤ for 循环将独⽴出现的类别找出 来,并使⽤ set 类别,将重复项去除得到最终所有的独⽴paper种类。
结果为:
176
{'acc-phys',
'adap-org',
'alg-geom',
'ao-sci',
'astro-ph',
'astro-ph.CO',
'astro-ph.EP',
'astro-ph.GA',
'astro-ph.HE',
'astro-ph.IM',
'astro-ph.SR',
'atom-ph',
'bayes-an',
'chao-dyn',
'chem-ph',
'cmp-lg',
'comp-gas',
'cond-mat',
'cond-mat.dis-nn',
'cond-mat.mes-hall',
'cond-mat.mtrl-sci',
'cond-mat.other',
'cond-mat.quant-gas',
'cond-mat.soft',
'cond-mat.stat-mech',
'cond-mat.str-el',
'cond-mat.supr-con',
'cs.AI',
'cs.AR',
'cs.CC',
'cs.CE',
'cs.CG',
'cs.CL',
'cs.CR',
'cs.CV',
'cs.CY',
'cs.DB',
'cs.DC',
'cs.DL',
'cs.DM',
'cs.DS',
'cs.ET',
'cs.FL',
'cs.GL',
'cs.GR',
'cs.GT',
'cs.HC',
'cs.IR',
'cs.IT',
'cs.LG',
'cs.LO',
'cs.MA',
'cs.MM',
'cs.MS',
'cs.NA',
'cs.NE',
'cs.NI',
'cs.OH',
'cs.OS',
'cs.PF',
'cs.PL',
'cs.RO',
'cs.SC',
'cs.SD',
'cs.SE',
'cs.SI',
'cs.SY',
'dg-ga',
'econ.EM',
'econ.GN',
'econ.TH',
'eess.AS',
'eess.IV',
'eess.SP',
'eess.SY',
'funct-an',
'gr-qc',
'hep-ex',
'hep-lat',
'hep-ph',
'hep-th',
'math-ph',
'math.AC',
'math.AG',
'math.AP',
'math.AT',
'math.CA',
'math.CO',
'math.CT',
'math.CV',
'math.DG',
'math.DS',
'math.FA',
'math.GM',
'math.GN',
'math.GR',
'math.GT',
'math.HO',
'math.IT',
'math.KT',
'math.LO',
'math.MG',
'math.MP',
'math.NA',
'math.NT',
'math.OA',
'math.OC',
'math.PR',
'math.QA',
'math.RA',
'math.RT',
'math.SG',
'math.SP',
'math.ST',
'mtrl-th',
'nlin.AO',
'nlin.CD',
'nlin.CG',
'nlin.PS',
'nlin.SI',
'nucl-ex',
'nucl-th',
'patt-sol',
'physics.acc-ph',
'physics.ao-ph',
'physics.app-ph',
'physics.atm-clus',
'physics.atom-ph',
'physics.bio-ph',
'physics.chem-ph',
'physics.class-ph',
'physics.comp-ph',
'physics.data-an',
'physics.ed-ph',
'physics.flu-dyn',
'physics.gen-ph',
'physics.geo-ph',
'physics.hist-ph',
'physics.ins-det',
'physics.med-ph',
'physics.optics',
'physics.plasm-ph',
'physics.pop-ph',
'physics.soc-ph',
'physics.space-ph',
'plasm-ph',
'q-alg',
'q-bio',
'q-bio.BM',
'q-bio.CB',
'q-bio.GN',
'q-bio.MN',
'q-bio.NC',
'q-bio.OT',
'q-bio.PE',
'q-bio.QM',
'q-bio.SC',
'q-bio.TO',
'q-fin.CP',
'q-fin.EC',
'q-fin.GN',
'q-fin.MF',
'q-fin.PM',
'q-fin.PR',
'q-fin.RM',
'q-fin.ST',
'q-fin.TR',
'quant-ph',
'solv-int',
'stat.AP',
'stat.CO',
'stat.ME',
'stat.ML',
'stat.OT',
'stat.TH',
'supr-con'}
从以上结果发现,共有176种论⽂种类,⽐我们直接从 https://arxiv.org/help/api/user-manual 的 5.3 ⼩节的 Subject Classifications 的部分或 https://arxiv.org/category_taxonomy中的到的类别少,这说 明存在⼀些官⽹上没有的类别,这是⼀个⼩细节。不过对于我们的计算机⽅向的论⽂没有影响,依然是 以下的40个类别,我们从原数据中提取的和从官⽹的到的种类是可以⼀⼀对应的。
'cs.AI': 'Artificial Intelligence',
'cs.AR': 'Hardware Architecture',
'cs.CC': 'Computational Complexity',
'cs.CE': 'Computational Engineering, Finance, and Science',
'cs.CG': 'Computational Geometry',
'cs.CL': 'Computation and Language',
'cs.CR': 'Cryptography and Security',
'cs.CV': 'Computer Vision and Pattern Recognition',
'cs.CY': 'Computers and Society',
'cs.DB': 'Databases',
'cs.DC': 'Distributed, Parallel, and Cluster Computing',
'cs.DL': 'Digital Libraries',
'cs.DM': 'Discrete Mathematics',
'cs.DS': 'Data Structures and Algorithms',
'cs.ET': 'Emerging Technologies',
'cs.FL': 'Formal Languages and Automata Theory',
'cs.GL': 'General Literature',
'cs.GR': 'Graphics',
'cs.GT': 'Computer Science and Game Theory',
'cs.HC': 'Human-Computer Interaction',
'cs.IR': 'Information Retrieval',
'cs.IT': 'Information Theory',
'cs.LG': 'Machine Learning',
'cs.LO': 'Logic in Computer Science',
'cs.MA': 'Multiagent Systems',
'cs.MM': 'Multimedia',
'cs.MS': 'Mathematical Software',
'cs.NA': 'Numerical Analysis',
'cs.NE': 'Neural and Evolutionary Computing',
'cs.NI': 'Networking and Internet Architecture',
'cs.OH': 'Other Computer Science',
'cs.OS': 'Operating Systems',
'cs.PF': 'Performance',
'cs.PL': 'Programming Languages',
'cs.RO': 'Robotics',
'cs.SC': 'Symbolic Computation',
'cs.SD': 'Sound',
'cs.SE': 'Software Engineering',
'cs.SI': 'Social and Information Networks',
'cs.SY': 'Systems and Control',
任务要求对于2019年以后的paper进行分析,所以首先对于时间特征进行预处理,从而得到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 #查看结果
结果为:
这⾥我们就已经得到了所有2019年以后的论⽂,下⾯我们挑选出计算机领域内的所有⽂章:
代码如下:
import pandas as pd
import requests
import re
from bs4 import BeautifulSoup
headers ={
'User-Agent':'Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100'
}
url = 'https://arxiv.org/category_taxonomy'
r = requests.get(url,headers = headers).text
# print(r.text)
soup = BeautifulSoup(r,'lxml',from_encoding='utf-8') #爬取数据,这⾥使⽤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格式的数据
# pd.set_option('display.max_columns', None)
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"])
print(df_taxonomy)
结果为:
下面说一下上面代码
1.从上面的结果看:我们得到的数据并不完整
解决方法:
#显示所有列
pd.set_option('display.max_columns', None)
#显示所有行
pd.set_option('display.max_rows', None)
#设置value的显示长度为100,默认为50
pd.set_option('max_colwidth',100)
在源代码中补充代码就行了
注:我是在pycharm中运行的程序,在jupyter notebook中运行代码效果更佳
2.说明⼀下上⾯代码中的正则操作,这⾥我们使⽤re.sub来⽤于替换字符串中的匹配项
'''
pattern : 正则中的模式字符串。
repl : 替换的字符串,也可为⼀个函数。
string : 要被查找替换的原始字符串。
count : 模式匹配后替换的最⼤次数,默认 0 表示替换所有的匹配。
flags : 编译时⽤的匹配模式,数字形式。
其中pattern、repl、string为必选参数
'''
re.sub(pattern, repl, string, count=0, flags=0)
例子:
import re
phone = "2004-959-559 # 这是⼀个电话号码"
# 删除注释
num = re.sub(r'#.*$', "", phone)
print ("电话号码 : ", num)
# 移除⾮数字的内容
num = re.sub(r'\D', "", phone)
print ("电话号码 : ", num)
import re
phone = "2004-959-559 # 这是⼀个电话号码"
# 删除注释
num = re.sub(r'#.*$', "", phone)
print ("电话号码 : ", num)
# 移除⾮数字的内容
num = re.sub(r'\D', "", phone)
print ("电话号码 : ", num)
运行结果如下:
电话号码 : 2004-959-559
电话号码 : 2004959559
详细了解可以参考:https://www.runoob.com/python3/python3-reg-expressions.html
对于我们的代码来说:
re.sub(r"(.*)\((.*)\)",r"\2",raw)
#raw = Astrophysics(astro-ph)
#output = astro-ph
-
对应的参数 正则中的模式字符串 pattern 的格式为 “任意字符” + “(” + “任意字符” + “)”。
-
替换的字符串 repl 为第2个分组的内容。
-
要被查找替换的原始字符串 string 为原始的爬取的数据。
这⾥推荐⼤家⼀个在线正则表达式测试的⽹站:https://tool.oschina.net/regex/
1.4.3数据分析及可视化
接下来我们⾸先看⼀下所有⼤类的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
我们使⽤merge函数,以两个dataframe共同的属性 “categories” 进⾏合并,并以 “group_name” 作为 类别进⾏统计,统计结果放⼊ “id” 列中并排序。
结果如下:
下⾯我们使⽤饼图进⾏上图结果的可视化:
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()
结果如下:
下⾯统计在计算机各个⼦领域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="categ
ory_name", columns="year",values="id")
我们同样使用 merge 函数,对于两个dataframe 共同的特征 categories 进⾏合并并且进行查询。然后我们再对于数据进行统计和排序从而得到以下的结果:
我们可以从结果看出,Computer Vision and Pattern Recognition(计算机视觉与模式识别)类是CS中paper数量最多的子类,遥遥领先于其他的CS⼦类,并且paper的数量还在逐年增加;另外,Computation and Language(计算与语⾔)、Cryptography and Security(密码学与安全)以及Robotics(机器⼈学)的2019年paper数量均超过1000或接近1000,这与我们的认知是⼀致的。
总结以及反思
通过本次学习,通过读取数据,对数据进行处理,最后对处理后的数据进行可视化。在整个项目中,自己能够对数据分析有一个更深的理解。下面我将对本次知识点进行总结。
1、json.loads():json数据处理函数
【拓展】
①json.dumps和json.loads():都是json数据处理函数,但二者存在区别
1)json.dumps()将json数据转换为字符串
2)json.loads() 将json数据转化为字典
②json.dump()和json.load():主要用来写读json文件函数
③res=json.loads(var) var为变量
res=json.load(file) file为文件路径
res都为字典类型
2、python的内置函数set(),创建一个无序不重复的元素集
3、pandas的pd.to_datetime()函数,选取某一时间段数据的函数
4、用 BeautifulSoup()进行爬虫
5、正则表达式:re.sub来用于替换字符串中的匹配项
re.sub(pattern, repl, string, count=0, flags=0)
6、pandas基本操作