最近放假了,在家时无聊发现数据分析挺有意思,感觉应该也挺有用的,就想着学习一下。看到阿里云数据分析方面的任务挺多,就边学习边实践一下。赛题链接:学术前沿趋势分析
本数据集是使用arXiv在公开的论文数据集,数据集主要有一下格式
id:arXiv ID,可用于访问论文;
submitter:论文提交者;
authors:论文作者;
title:论文标题;
comments:论文页数和图表等其他信息;
journal-ref:论文发表的期刊的信息;
doi:数字对象标识符,https://www.doi.org;
report-no:报告编号;
categories:论文在 arXiv 系统的所属类别或标签;
license:文章的许可证;
abstract:论文摘要;
versions:论文版本;
authors_parsed:作者信息(处理后)
本赛题一共有5个task,如下:
任务1:论文数量统计(数据统计任务):统计2019年全年,计算机各个方向论文数量;
任务2:论文作者统计(数据统计任务):统计所有论文作者出现评率Top10的姓名;
任务3:论文代码统计(数据统计任务):统计所有论文类别下包含源代码论文的比例;
任务4:论文分类(数据建模任务):利用已有数据建模,对新论文进行类别分类;
任务5:作者关联(数据建模任务):对论文作者关系进行建模,统计最常出现的作者关系;
我本次是完成的task1,就是统计2019全年计算机各个方向的论文。通过对原始数据观察发现还多了一个updataData,不过全是2019年的就以为着我不用对数据的年份进行筛选,所有数据都是2019的,现在需要做的就是选出所有计算机方向的论文。
所以在本次task中,我只需要用到ID和categories项,categories项的格式是通过空格隔开不同学科,然后通过’.'隔开方向。如(a.x b.y)这种。本次task比较简单只需要对categories进行拆分然后统计就行了,但由于初学,还是废了一些时间的。
源码:
import pandas as pd
import matplotlib.pyplot as plt
def get_data():
df = pd.read_json('arxiv-metadata-oai-2019.json', lines=True)
statistics_categories = {}
tables = {'id': [], 'categories': []}
for i in range(len(df['id'])):
categories = df['categories'][i].split(' ')
flag = False #防止重复统计
for types in categories:
type = types.split('.')
if type[0] == 'cs':
if flag == False:
tables['id'].append(df['id'][i])
tables['categories'].append(df['categories'][i])
flag = True
if type[1] not in statistics_categories:
statistics_categories[type[1]] = 1
else:
statistics_categories[type[1]] += 1
tables = pd.DataFrame.from_dict(tables)
print(tables)
return statistics_categories
# 显示高度
def auto_label(rects):
for rect in rects:
height = rect.get_height()
plt.text(rect.get_x()+rect.get_width()/2.- 0.2, 1.03*height, '%s' % int(height))
def draw_graph(statistics_categories):
#柱状图
name_list = list(statistics_categories.keys())
name1 = name_list[:int(len(name_list) / 2)]
name2 = name_list[int(len(name_list) / 2):]
num_list = list(statistics_categories.values())
num1 = num_list[:int(len(num_list) / 2)]
num2 = num_list[int(len(num_list) / 2):]
plt.subplot(211)
auto_label(plt.bar(range(len(name1)), num1, color='rgb', tick_label=name1))
plt.subplot(212)
auto_label(plt.bar(range(len(name2)), num2, color='rgb', tick_label=name2))
plt.show()
plt.close()
#饼状图
plt.axes(aspect=1)
plt.pie(x=num_list, labels=name_list, autopct='%3.1f %%')
plt.show()
if __name__ == '__main__':
statistics_categories = get_data()
draw_graph(statistics_categories)
实验结果如下:
柱状图:
饼状图:
由于第一次具体接触数据分析这一类,所以图画得比较粗糙,还需要慢慢的学习。