数据分析---论文作者统计

目录

1.1任务说明

1.2数据集介绍

1.3数据集中选取所需要的数据字段

1.4数据处理步骤

1.5字符串处理

1.6代码实现过程及说明

1.6.1读取数据

1.6.2数据统计

总结

1.1任务说明

  • 任务主题:论文作者统计,统计所有论文作者出现频率Top10的姓名;
  • 任务内容:论文作者的统计、使用 Pandas 读取数据并使用字符串操作;
  • 任务成果:学习 Pandas 的字符串操作;

1.2数据集介绍

  • 数据集来源: https://www.kaggle.com/Cornell-University/arxiv
    -链接:https://pan.baidu.com/s/1OqUl13fZvLw6Jd49UdDM_Q
    提取码:bmd8
  • 数据集的格式如下
    • 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.3数据集中选取所需要的数据字段

由于本次的任务是对论文作者进行统计,我们并不需要数据集中的所有数据。我们选取与作者有关的数据,将选取数据集中三个字段作为本次数据分析对象。
分别为:
1、authors :论文作者;
2、categories :论文在 arXiv 系统的所属类别或标签;
3、authors_parsed :作者的信息;

1.4数据处理步骤

在原始arxiv数据集中论文作者authors字段是一个字符串格式,其中每个作者使用逗号进行分隔分,所以我们我们首先需要完成以下步骤:

  • 使用逗号对作者进行切分;
  • 剔除单个中非常规的字符;
    具体操作可以参考以下例子:
C. Bal\\'azs, E. L. Berger, P. M. Nadolsky, C.-P. Yuan

# 切分为,其中\\为转义符

C. Ba'lazs
E. L. Berger
P. M. Nadolsky
C.-P. Yuan

当然在原始数据集中authors_parsed字段已经帮我们处理好了作者信息,可以直接使用该字段完成后续统计。
原始数据集中的categories 字段也可以直接使用该字段完成后续的统计。

1.5字符串处理

在Python中字符串是最常用的数据类型,可以使用引号('或")来创建字符串。Python中所有的字符都使用字符串存储,可以使用方括号来截取字符串,如下实例:

var1 = 'Hello Datawhale!'
var2 = "Python Everwhere!"
 
print("var1[-10:]: ", var1[-10:])
print("var2[1:5]: ", var2[0:7])

结果为:

var1[-10:]:  Datawhale!
var2[1:5]:  Python 

同时在Python中还支持转义符:

(在行尾时)续行符
\反斜杠符号
单引号
"双引号
\n换行
\t横向制表符
\r回车

Python中还内置了很多内置函数,非常方便使用:

方法描述
string.capitalize()把字符串的第一个字符大写
string.isalpha()如果 string 至少有一个字符并且所有字符都是字母则返回 True,否则返回 False
string.title()返回"标题化"的 string,就是说所有单词都是以大写开始,其余字母均为小写(见 istitle())
string.upper()转换 string 中的小写字母为大写

1.6代码实现过程及说明

1.6.1读取数据

import pandas as pd
import json
import matplotlib.pyplot as plt
data = []
with open('arxiv-metadata-oai-2019.json','r') as f:
    for idx,line in enumerate(f):
        # print(idx,line)
        d = json.loads(line)
        d = {'author':d['authors'],'categories':d['categories'], 'authors_parsed': d['authors_parsed']}
        data.append(d)
        #print(d)

data = pd.DataFrame(data)
#print(data)

对我们需要的数据进行读取

1.6.1数据统计

接下来我们将进行以下任务

  • 统计所有作者姓名出现频率的Top10;
  • 统计所有作者姓(姓名最后一个单词)的出现频率的Top10;
  • 统计所有作者姓第一个字符出现的频率;
    为了节约计算时间,下面选择部分类别下的论文进行处理:
# 选择类别为cs.CV下面的论文
data2 = data[data['categories'].apply(lambda x: 'cs.CV' in x)]

# 拼接所有作者
all_authors = sum(data2['authors_parsed'], [])

处理完成后all_authors变成了所有一个list,其中每个元素为一个作者的姓名。我们首先来完成姓名频率的统计。

# 拼接所有的作者
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')
plt.show()

绘制得到的结果:
在这里插入图片描述
接下来统计姓名姓,也就是authors_parsed字段中作者第一个单词:

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

绘制得到的结果为:
在这里插入图片描述
绘制得到的结果,从结果看出这些都是华人或者中国姓氏~

统计所有作者姓第一个字符的频率:

authors_lastnames_first =[x[0] for x in authors_lastnames]
authors_lastnames_first=pd.DataFrame(authors_lastnames_first)
authors_lastnames_first[0].value_counts().head(10).plot(kind = 'barh')
# print(count)
namess = authors_lastnames_first[0].value_counts().index.values[:10]
_ = plt.yticks(range(0, len(namess)), namess)
plt.ylabel('author_first')
plt.xlabel('count')
plt.show()

结果如下:
在这里插入图片描述
从结果显示来看,作者姓名第一个字符出现频率最高的是L

总结

1、python的enumerate()函数


①描述

  • enumerate()函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。
  • Python 2.3. 以上版本可用,2.6 添加 start 参数。

②语法

enumerate(sequence, [start=0])

③参数

  • sequence–一个序列、迭代器或其他支持迭代对象。
  • start – 下标起始位置。

④返回值
返回enumerate(枚举)对象

⑤举例

>>>seq = ['one', 'two', 'three']
>>> for i, element in enumerate(seq):
...     print i, element
... 
0 one
1 two
2 three

2、python的apply()函数


①函数格式:
apply(func,*args,**kwargs)
②用途:
当一个函数的参数存在于一个元组或者一个字典中时,用来间接的调用这个函数,并肩元组或者字典中的参数按照顺序传递给参数
③解析:

  • args是一个包含按照函数所需参数传递的位置参数的一个元组,是不是很拗口,意思就是,假如A函数的函数位置为 A(a=1,b=2),那么这个元组中就必须严格按照这个参数的位置顺序进行传递(a=3,b=4),而不能是(b=4,a=3)这样的顺序
  • kwargs是一个包含关键字参数的字典,而其中args如果不传递,kwargs需要传递,则必须在args的位置留空
  • apply的返回值就是函数func函数的返回值
def function(a,b): 
     print(a,b) 
 apply(function,('good','better')) 
 apply(function,(2,3+6)) 
 apply(function,('cai','quan')) 
 apply(function,('cai',),{'b':'caiquan'}) 
 apply(function,(),{'a':'caiquan','b':'Tom'}) 

结果为:

('good', 'better')
(2, 9)
('cai', 'quan')
('cai', 'caiquan')
('caiquan', 'Tom')

3、python的sum()函数
①描述:
sum() 方法对序列进行求和计算。
②语法:

sum(iterable[, start])

③参数:

  • terable – 可迭代对象,如:列表、元组、集合。
  • start – 指定相加的参数,如果没有设置这个值,默认为0。
    ④实例
>>>sum([0,1,2])  
3  
>>> sum((2, 3, 4), 1)        # 元组计算总和后再加 1
10
>>> sum([0,1,2,3,4], 2)      # 列表计算总和后再加 2
12
data = [['a','b',' '],['c','d',' '],['f','e',' ']],[['a','b',' '],['c','d',' '],['f','e',' ']]
c =sum(data,[])
print(c)

返回的结果为:

[['a', 'b', ' '], ['c', 'd', ' '], ['f', 'e', ' '], ['a', 'b', ' '], ['c', 'd', ' '], ['f', 'e', ' ']]

4、python的join()函数


函数:string.join()
Python中有join()和os.path.join()两个函数,具体作用如下:

  • join(): 连接字符串数组。将字符串、元组、列表中的元素以指定的字符(分隔符)连接生成一个新的字符串
  • os.path.join(): 将多个路径组合后返回

①函数说明
1)join()函数
语法: ‘sep’.join(seq)
参数说明
sep:分隔符。可以为空
seq:要连接的元素序列、字符串、元组、字典
上面的语法即:以sep作为分隔符,将seq所有的元素合并成一个新的字符串
返回值:返回一个以分隔符sep连接各个元素后生成的字符串

2)os.path.join()函数
语法: os.path.join(path1[,path2[,…]])

返回值:将多个路径组合后返回

注:第一个绝对路径之前的参数将被忽略
实例如下:

1 #对序列进行操作(分别使用' '与':'作为分隔符)
 2   
 3 >>> seq1 = ['hello','good','boy','doiido']
 4 >>> print ' '.join(seq1)
 5 hello good boy doiido
 6 >>> print ':'.join(seq1)
 7 hello:good:boy:doiido
10 #对字符串进行操作
11   
12 >>> seq2 = "hello good boy doiido"
13 >>> print ':'.join(seq2)
14 h:e:l:l:o: :g:o:o:d: :b:o:y: :d:o:i:i:d:o
15   
17 #对元组进行操作   
19 >>> seq3 = ('hello','good','boy','doiido')
20 >>> print ':'.join(seq3)
21 hello:good:boy:doiido
22   
24 #对字典进行操作  
26 >>> seq4 = {'hello':1,'good':2,'boy':3,'doiido':4}
27 >>> print ':'.join(seq4)
28 boy:good:doiido:hello
31 #合并目录
33 >>> import os
34 >>> os.path.join('/hello/','good/boy/','doiido')
35 '/hello/good/boy/doiido'
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值