第一次数据分析作业

导⼊所需的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(r"D:\arxiv-metadata-oai-snapshot.json", ‘r’) as f:
for idx, line in enumerate(f): #enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列

    # 读取前100行,如果读取所有数据需要8G内存
    if idx >= 100:
        break
    
    data.append(json.loads(line)) #json.loads将已编码的 JSON 字符串解码为 Python 对象

data = pd.DataFrame(data) #将list变为dataframe格式,方便使用pandas进行分析
data.shape #显示数据大小

data.head() #显示数据的前五行

在这里插入图片描述
def readArxivFile(path, columns=[‘id’, ‘submitter’, ‘authors’, ‘title’, ‘comments’, ‘journal-ref’, ‘doi’,
‘report-no’, ‘categories’, ‘license’, ‘abstract’, ‘versions’,
‘update_date’, ‘authors_parsed’], count=None): #通过对none值的修改可以控制读取的行数
‘’’
定义读取文件的函数
path: 文件路径
columns: 需要选择的列
count: 读取行数
‘’’

data  = []
with open(path, 'r') as f: 
    for idx, line in enumerate(f): 
        if idx == count:
            break
            
        d = json.loads(line)  #loads只能将字典形式的json解码成字典
        dd = {col : d[col] for col in columns}
        data.append(dd)

data = pd.DataFrame(data)
return data

data = readArxivFile(r"D:\arxiv-metadata-oai-snapshot.json", [‘id’, ‘categories’, ‘update_date’])

data[“categories”].describe()#返回不同的统计信息,例如值的计数,唯一值,出现次数的最高值和发生频率

在这里插入图片描述
unique_categories = set([i for l in [x.split(’ ') for x in data[“categories”]] for i in l]) #set可以把重复的删除
len(unique_categories)
unique_categories

print(len(unique_categories))

176

data[“year”] = pd.to_datetime(data[“update_date”]).dt.year #将update_date从例如2019-02-20的str变为datetime格式,并提取处year
#datetime日期格式:yyyyMMdd HH:mm:ss(注意此字符串的字母大小写很严格)
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 #查看结果

在这里插入图片描述
在这里插入图片描述
数据爬取

#爬取所有的类别
website_url = requests.get(‘https://arxiv.org/category_taxonomy’).text #获取网页的文本数据
soup = BeautifulSoup(website_url,‘lxml’) #爬取数据,这里使用lxml的解析器,加速
root = soup.find(‘div’,{‘id’:‘category_taxonomy_list’}) #找出 BeautifulSoup 对应的标签入口
tags = root.find_all([“h2”,“h3”,“h4”,“p”], recursive=True) #读取 tags

#Q:为什么还要爬取数据 ? A:做一下关联 类似一个维表 进行一下数据筛选

#find 那句没读懂 还有为什么要读 h2h3h4p

#初始化 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 = []

#这里1 2 3 的name和code都是什么意思?
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格式的数据
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”])
df_taxonomy
在这里插入图片描述
对爬取的数据进行分组

#按照 “group_name” 进行分组,在组内使用 “archive_name” 进行排序
df_taxonomy.groupby([“group_name”,“archive_name”])
df_taxonomy

_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()在这里插入图片描述在这里插入图片描述

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=“category_name”, columns=“year”,values=“id”)
在这里插入图片描述
统计在计算机各个子领域2019年后的paper数量,我们同样使用 merge 函数,对于两个dataframe 共同的特征 categories 进行合并并且进行查询。然后我们再对于数据进行统计和排序

结论我们可以从结果看出,Computer Vision and Pattern Recognition(计算机视觉与模式识别)类是CS中paper数量最多的子类,遥遥领先于其他的CS子类,并且paper的数量还在逐年增加;另外,Computation and Language(计算与语言)、Cryptography and Security(密码学与安全)以及 Robotics(机器人学)的2019年paper数量均超过1000或接近1000,这与我们的认知是一致的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值