# 加载需要的包
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 #画图工具
import os
os.getcwd()
'D:\\jupyter_notebook\\Github\\datawhale数据分析_学术前沿趋势分析\\AcademicTrends'
1. 数据读取(same as task1)
def readArxivFile(path, columns=['id', 'submitter', 'authors', 'title', 'comments', 'journal-ref', 'doi',
'report-no', 'categories', 'license', 'abstract', 'versions',
'update_date', 'authors_parsed'], count=None):
'''
定义读取文件的函数
path: 文件相对路径
columns: 需要选择的列--M默认使用数据集中所有列
count: 读取行数(原数据有17万+行)
'''
data = []
with open(path,"r") as f:
for idx,line in enumerate(f):
if idx == count: # 已经到了第count+1条数据--可以停止了,不放在data的list中
break # 跳出循环--停止读取数据
d = json.loads(line) # line是字典形式,loads之后也是字典形式
d = {
col:d[col] for col in columns} # 字典生成式,提取出想要的列&对应样本的值
data.append(d) # 把字典append到list中
data = pd.DataFrame(data)
return data
data = readArxivFile('./data/arxiv-metadata-oai-2019.json', columns=['id', 'authors', 'categories', 'authors_parsed'],
count = 100000) # 读取10万条数据
data
id | authors | categories | authors_parsed | |
---|---|---|---|---|
0 | 0704.0297 | Sung-Chul Yoon, Philipp Podsiadlowski and Step... | astro-ph | [[Yoon, Sung-Chul, ], [Podsiadlowski, Philipp,... |
1 | 0704.0342 | B. Dugmore and PP. Ntumba | math.AT | [[Dugmore, B., ], [Ntumba, PP., ]] |
2 | 0704.0360 | T.V. Zaqarashvili and K Murawski | astro-ph | [[Zaqarashvili, T. V., ], [Murawski, K, ]] |
3 | 0704.0525 | Sezgin Aygun, Ismail Tarhan, Husnu Baysal | gr-qc | [[Aygun, Sezgin, ], [Tarhan, Ismail, ], [Baysa... |
4 | 0704.0535 | Antonio Pipino (1,3), Thomas H. Puzia (2,4), a... | astro-ph | [[Pipino, Antonio, ], [Puzia, Thomas H., ], [M... |
... | ... | ... | ... | ... |
99995 | 1905.00812 | Zhiyi Huang, Xue Zhu | cs.DS | [[Huang, Zhiyi, ], [Zhu, Xue, ]] |
99996 | 1905.00814 | Tuomas P. Hyt\"onen | math.AP math.CV math.FA | [[Hytönen, Tuomas P., ]] |
99997 | 1905.00815 | Morteza Baniasad Azad and Behrooz Khosravi | math.GR | [[Azad, Morteza Baniasad, ], [Khosravi, Behroo... |
99998 | 1905.00816 | Ozgur Asar, Marie-Cecile Fournier, Etienne Dantan | stat.AP | [[Asar, Ozgur, ], [Fournier, Marie-Cecile, ], ... |
99999 | 1905.00818 | Patricia Schmidt, Tanja Hinderer | gr-qc astro-ph.HE | [[Schmidt, Patricia, ], [Hinderer, Tanja, ]] |
100000 rows × 4 columns
data.info() # 这里每一列都是字符串格式
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 100000 entries, 0 to 99999
Data columns (total 4 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 id 100000 non-null object
1 authors 100000 non-null object
2 categories 100000 non-null object
3 authors_parsed 100000 non-null object
dtypes: object(4)
memory usage: 3.1+ MB
data.authors[0]
'Sung-Chul Yoon, Philipp Podsiadlowski and Stephan Rosswog'
data.authors_parsed[0]
[['Yoon', 'Sung-Chul', ''],
['Podsiadlowski', 'Philipp', ''],
['Rosswog', 'Stephan', '']]
2. 只考虑cs.CV的论文作者
2.1 提取categories中包含cs.CV的论文
# 选择类别为cs.CV下面的论文
data2 = data[data['categories'].apply(lambda x: 'cs.CV' in x)]
2.1的分解
匿名函数–关键字:lambda
- 当我们传入函数时:有些时候,不需要显式的定义函数,直接传入匿名函数即可
- lambda 函数的参数: 返回的expression
- 只能有一个表达式,不用写return
- 一般与map()/apply()/filter()函数连用
- map(函数,iterable可迭代对象):将函数作用到iterable的每一个元素上
- dataframe[column].apply(函数):将函数作用在这一列的每个值上
- filter(函数,iterable):函数的返回值必须是布尔值T/F,函数作用在iterable的每个值上,filter的结果只保留返回值=True的参数
# 可以将匿名函数赋值给一个变量,再利用变量来调用这个函数
is_odd = lambda x: x%2==1 # return的结果是T/F
print(list(map(is_odd,range(1,20))))
[True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True, False, True]
list(filter(is_odd, range(1, 20))) # is_odd匿名函数 作用在range(1,20)上,filter的结果只保留返回值=True
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
continue:
data['categories']
0 astro-ph
1 math.AT
2 astro-ph
3 gr-qc
4 astro-ph
...
99995 cs.DS
99996 math.AP math.CV math.FA
99997 math.GR
99998 stat.AP
99999 gr-qc astro-ph.HE
Name: categories, Length: 100000, dtype: object
# 因为有的论文的categories可能有多个,所以不能直接=="cs.CV",要用in 查看是否包含这个string
data['categories'].apply(lambda x: 'cs.CV' in x) # apply这个匿名函数到categories这一列的每个string(lambda里面的参数x)上
0 False
1 False
2 False
3 False
4 False
...
99995 False
99996 False
99997 False
99998 False
99999 False
Name: categories, Length: 100000, dtype: bool
data2 = data[data['categories'].apply(lambda x: 'cs.CV'