Datawhale数据分析之学术前沿分析学习笔记

学习要求

学习主题:论⽂数量统计(数据统计任务),统计2019年全年,计算机各个⽅向论⽂数量;
学习内容:赛题理解、 Pandas 读取数据、数据统计 ;
学习成果:学习 Pandas 基础;
数据集:arxiv-metadata-oai-snapshot.json
https://www.kaggle.com/Cornell-University/arxiv
数据集介绍:
id :arXiv ID,可⽤于访问论⽂;
submitter :论⽂提交者;
authors :论⽂作者;
title :论⽂标题;
comments :论⽂⻚数和图表等其他信息;
journal-ref :论⽂发表的期刊的信息;
doi :数字对象标识符,https://www.doi.org;
report-no :报告编号;
categories :论⽂在 arXiv 系统的所属类别或标签;
license :⽂章的许可证;
abstract :论⽂摘要;
versions :论⽂版本;
authors_parsed :作者的信息

step1.数据读取

导⼊所需的package

# 导⼊所需的package
from bs4 import BeautifulSoup #⽤于爬取arxiv的数据
import re #⽤于正则表达式,匹配字符串的模式
import requests #⽤于⽹络连接,发送⽹络请求,使⽤域名获取对应信息
import json #读取数据,我们的数据为json格式的
import pandas as pd #数据处理,数据分析
import matplotlib.pyplot as plt #画图⼯具

这⾥使⽤的package的版本如下(python 3.6.4):
BeautifulSoup:4.6.0
requests:2.18.4
json:2.6.0
pandas:1.0.5
matplotlib:3.2.2

data = []

with open('arxiv-metadata-oai-snapshot.json','r') as f:
    for idx,line in enumerate(f):
        if idx >= 5000: #读取部分数据用于测试,全部读取需要8G内存,看个人电脑配置
            break
        data.append(json.loads(line))

data = pd.DataFrame(data)

step2.数据预处理

⾸先我们先来粗略统计论⽂的种类信息:

'''
count:⼀列数据的元素个数;
unique:⼀列数据中元素的种类;
top:⼀列数据中出现频率最⾼的元素;
freq:⼀列数据中出现频率最⾼的元素的个数;
'''
data["categories"].describe()

由于部分论⽂的类别不⽌⼀种,所以下⾯我们判断在本数据集中共出现了多少种独⽴的数据集。

data_list = []
for l in [x.split(' ') for x in data['categories']]:
    for i in l:
        data_list.append(i)
unique_categories = set(data_list)

我们的任务要求对于2019年以后的paper进⾏分析,所以⾸先对于时间特征进⾏预处理,从⽽得到2019
年以后的所有种类的论⽂:

data['year'] = pd.to_datetime(data["update_date"]).dt.year
data = data[data['year']>=2019]
data.reset_index(drop=True,inplace=True) #重新编号

这⾥我们就已经得到了所有2019年以后的论⽂,下面用爬虫爬取计算机领域内的所有文章,实际工作中,不需要数据分析师自己取爬取数据,所以不必刻意学习,我也是复用了已有代码,里面用到了正则化,这个对于数据分析师还是需要掌握的

#爬取所有的类别
website_url = requests.get('https://arxiv.org/category_taxonomy',verify=False).text #获取⽹⻚的⽂本数据
soup = BeautifulSoup(website_url,'html.parser') #爬取数据,这⾥使⽤lxml的解析器,加速

root = soup.find('div',{'id':'category_taxonomy_list'}) #找出 BeautifulSoup 对应的标签⼊⼝
tags = root.find_all(["h2","h3","h4","p"], recursive=True) #读取 tags
#初始化 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 = []
#进⾏
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
})

step3.数据分析及可视化

⾸先看⼀下所有⼤类的paper数量分布:

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()
print(_df.head())

使⽤饼图进⾏上图结果的可视化:

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=None)
plt.tight_layout()
plt.show()

论文大类分布
统计在计算机各个⼦领域2019年后的paper数量:

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="categ
ory_name", columns="year",values="id")

总结

1、熟悉json文件格式读取,之前一直用csv比较多,没接触过json
2、练习pandas使用,常用法基本已经包含
3、熟悉matplotlib可视化,饼图画的比较少,经常画柱状图
4、熟悉正则化的基本用法,对于用pandas数据预处理锦上添花
5、根据个人能力按需学习爬虫,本人能力有限,就不准备在这部分花精力和时间了

ps:说句题外话,接触CSDN已经有好几年了,但是这是第一次发博文,简简单单这篇,也花费了我一天时间,深刻感受到发博文也是一件非常消耗时间和精力的事情,以后看博文不管写的好不好,都需要对博主的劳动成果表示尊重

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值