DataWhale——数据分析组队学习(Day3)


前言

今天是第三天了,继续淦.今天的任务是继续上一天数据预处理的内容,从数据中提取出来2019年以后的论文内容,以及数据分析和可视化的内容.


一、数据预处理

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

data["year"] = pd.to_datetime(data["update_date"]).dt.year #将update_date从例如2019-02-20的str变为datetime格式,并提取处year
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) #重新编号
print(data) #查看结果

这个时候输出的结果为:

170615    We consider a hierarchy of many-particle sys...  ...  2019
170616    Consider the evolution $$ \frac{\pl m_\iy}{\...  ...  2019
170617    A general solution to the Complex Monge-Amp\...  ...  2019

[170618 rows x 14 columns]

我们发现这个这里还是170618条信息,这个我倒是一开始的时候没注意,我下载的文件只有200多M,本来这个数据文件是经过处理的,不是原始的数据文件,原始的数据文件大概有2点几G.
这⾥我们就已经得到了所有2019年以后的论⽂,下⾯我们挑选出计算机领域内的所有⽂章:

#爬取所有的类别
website_url = requests.get('https://arxiv.org/category_taxonomy').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"])
print(df_taxonomy)

爬取的目的是因为已有的数据集不完整,所以想再爬数据集确认一下,取一个并集.

153            Statistics            Statistics  ...           stat.OT  Work in statistics that does not fit into the ...
154            Statistics            Statistics  ...           stat.TH  stat.TH is an alias for math.ST. Asymptotics, ...

[155 rows x 6 columns]

数据分析及可视化

接下来我们⾸先看⼀下所有⼤类的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)

我们使⽤merge函数,以两个dataframe共同的属性 “categories” 进⾏合并,并以 “group_name” 作为
类别进⾏统计,统计结果放⼊ “id” 列中并排序。
输出的结果如下:

group_name     id
0                                     Physics  38379
1                                 Mathematics  24495
2                            Computer Science  18087
3                                  Statistics   1802
4  Electrical Engineering and Systems Science   1371
5                        Quantitative Biology    886
6                        Quantitative Finance    352
7                                   Economics    173

下⾯我们使⽤饼图进⾏上图结果的可视化:

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()

如下图所示:

有关数据分析队名 数据分析小组_hive

下⾯统计在计算机各个⼦领域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="category_name", columns="year",values="id")

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

总结

今天在数据爬取那一块还是有很多疑问的,问题还是要想办法去解决.