Datawhale Team-learning 数据分析task2

任务说明

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

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 open(r"D:\python练习/数据/arxiv-metadata-oai-snapshot.json", 'r') as f: 
    for idx, line in enumerate(f): 
        d = json.loads(line)
        d = {'authors': d['authors'], 'categories': d['categories'], 'authors_parsed': d['authors_parsed']}
        data.append(d)
        
data = pd.DataFrame(data)data = []
with open(r"D:\python练习/数据/arxiv-metadata-oai-snapshot.json", 'r') as f: 
    for idx, line in enumerate(f): 
        d = json.loads(line)
        d = {'authors': d['authors'], 'categories': d['categories'], 'authors_parsed': d['authors_parsed']}
        data.append(d)
        
data = pd.DataFrame(data)

输出结果:

知识小结:

1、enumerate()函数:enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标。
实例:

`>>>seasons = ['Spring', 'Summer', 'Fall', 'Winter']
>>> list(enumerate(seasons))
[(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
>>> list(enumerate(seasons, start=1))       # 下标从 1 开始
[(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]`

2、复习json.load()函数

2、作者姓名统计

接下来我们将完成以下统计操作:

1、所有作者姓名出现频率的Top10;
2、统计所有作者姓(姓名最后一个单词)的出现频率的Top10;
3、统计所有作者姓第一个字符的评率;
为了节约计算时间,下面选择部分类别下的论文进行处理:

# 选择类别为cs.CV下面的论文
data2 = data[data['categories'].apply(lambda x: 'cs.CV' in x)]

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

这样输出的all_authors 是一个列表:在这里插入图片描述

处理完成后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()

输出结果:

知识小结:

1、apply(lambda x: ‘cs.CV’ in x)] apply 函数:Python中apply函数的格式为:apply(func,*args,**kwargs)

当然,func可以是匿名函数。

用途:当一个函数的参数存在于一个元组或者一个字典中时,用来间接的调用这个函数,并将元组或者字典中的参数按照顺序传递给参数
DataFrame中apply的用法:

#函数应用和映射
import numpy as np
import pandas as pd
df=pd.DataFrame(np.random.randn(4,3),columns=list('bde'),index=['utah','ohio','texas','oregon'])
print(df)
"""
               b         d         e
utah   -0.667969  1.974801  0.738890
ohio   -0.896774 -0.790914  0.474183
texas   0.043476  0.890176 -0.662676
oregon  0.701109 -2.238288 -0.154442
"""
 
#将函数应用到由各列或行形成的一维数组上。DataFrame的apply方法可以实现此功能
f=lambda x:x.max()-x.min()
#默认情况下会以列为单位,分别对列应用函数
t1=df.apply(f)
print(t1)
t2=df.apply(f,axis=1)
print(t2)
 
"""
b    1.597883
d    4.213089
e    1.401566
dtype: float64
utah      2.642770
ohio      1.370957
texas     1.552852
oregon    2.939397
dtype: float64
"""
 
#除标量外,传递给apply的函数还可以返回由多个值组成的Series
def f(x):
    return pd.Series([x.min(),x.max()],index=['min','max'])
t3=df.apply(f)
#从运行的结果可以看出,按列调用的顺序,调用函数运行的结果在右边依次追加
print(t3)
 
"""
            b         d         e
min -0.896774 -2.238288 -0.662676
max  0.701109  1.974801  0.738890
"""
 
#元素级的python函数,将函数应用到每一个元素
#将DataFrame中的各个浮点值保留两位小数
f=lambda x: '%.2f'%x
t3=df.applymap(f)
print(t3)
"""
            b      d      e
utah    -0.67   1.97   0.74
ohio    -0.90  -0.79   0.47
texas    0.04   0.89  -0.66
oregon   0.70  -2.24  -0.15
"""
 
#注意,之所以这里用map,是因为Series有一个元素级函数的map方法。而dataframe只有applymap。
t4=df['e'].map(f)
print(t4)
 
"""
utah     0.74
ohio     0.47
texas   -0.66
oregon  -0.15
"""



2、输出all_authors时 出现了IOPub_data_rate_limit报错
解决方法:打开anaconda prompt 输运行命令jupyter notebook --generate-config(生成配置文件jupyter_notebook_config.py路径)
修改生成的配置文件:jupyter_notebook_config.py

把默认的配置项:#c.NotebookApp.iopub_data_rate_limit = 1000000
多加好多000000改成1000000000000000000000000000000000
在这里插入图片描述
3、join()函数 :
语法:‘step’.join(sqe)

参数说明:

step分隔符,可以为空

sqe要连接的元素序列、元组、字符串或列表

返回值:返回一个以step为分隔符连接各个元素的字符串

# coding:utf-8
 
x='abc'
y='def'
z=['m1','m2','m3']
dict={'name':'lily','age':18,'city':'beijing','school':'qinghua'}
 
resp1=x.join(dict) # 对字典进行操作,连接是无序的
resp2=x.join(y) # 对字符串进行操作
resp3=x.join(z)  #列表进行操作
print resp1
print resp2
print resp2
 
# 输出结果
cityabcageabcnameabcschool
dabceabcf
dabceabcf

3、authors_lastnames[0].value_counts().head(10).plot(kind=‘barh’) pandas 的value_counts()函数可以对Series里面的每个值进行计数并且排序。

现有一个DataFrame

在这里插入图片描述

如果我们想知道,每个区域出现了多少次,可以简单如下:

在这里插入图片描述

每个区域都被计数,并且默认从最高到最低做降序排列。

如果想用升序排列,可以加参数ascending=True:
在这里插入图片描述

如果想得出的计数占比,可以加参数normalize=True:

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210116145946583.png)

3、姓的统计

接下来统计姓名姓,也就是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')`

输出结果:绘制得到的结果,从结果看出这些都是华人或者中国姓氏~

4、统计所有作者姓第一个字符

authors_lastnames_firstalpha = [x[0] for x in authors_lastnames[0]]
authors_lastnames_firstalpha = pd.DataFrame(authors_lastnames_firstalpha)
plt.figure(figsize=(10, 6))
authors_lastnames_firstalpha[0].value_counts().head(10).plot(kind='barh')

names = authors_lastnames_firstalpha[0].value_counts().index.values[:10]
_ = plt.yticks(range(0, len(names)), names)
plt.ylabel('first alpha of Author\'s lastname ')
plt.xlabel('Count')

输出结果:在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值