Task2 论文作者统计

# 加载需要的包
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' in x
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值