pandas、matplotlib和seaborn提前安装了,所以只安装下面两个:
data = []
with open("./data/arxiv-metadata-oai-2019.json", 'r') as f:
for idx, line in enumerate(f):
#只读取前500行
if idx >= 500:
break
data.append(json.loads(line))
data = pd.DataFrame(data)
data.shape
(500, 14)
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):
data = []
with open(path, 'r') as f:
for idx, line in enumerate(f):
if idx == count:
break
d = json.loads(line)
d = {
col : d[col] for col in columns}
data.append(d)
data = pd.DataFrame(data)
return data
data = readArxivFile('./data/arxiv-metadata-oai-2019.json', ['id', 'categories', 'update_date'])
data
data["year"] = pd.to_datetime(data["update_date"]).dt.year
del data["update_date"]
data = data[data["year"] >= 2019]
data.reset_index(drop=True, inplace=True)
data
data["categories"].describe()
count 170618
unique 15592
top cs.CV
freq 5559
Name: categories, dtype: object
表明总数170618,种类15592,cs.CV类别的论文最多,有5559份。
unique_categories = set([i for l in [x.split(' ') for x in data["categories"]] for i in l])
len(unique_categories)
172
表示将组合类分解成小的子类,操作后发现子类共172种。
仍然没有解决,换一种方式,使用‘html.parser’代替’lxml’进行江湖救急
改了之后依然报错,解决方法:
增加重试连接次数
requests.adapters.DEFAULT_RETRIES = 5
关闭多余的连接
s = requests.session()
s.keep_alive = False
并在requests.get时将verify参数设置为False,运行:
#爬取所有的类别
requests.adapters.DEFAULT_RETRIES = 5
s = requests.session()
s.keep_alive = False
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.head()
_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
分析:以上代码分别将data和df_taxonomy进行了左合并,然后通过drop_duplicates方法对id和group_name进行去重,然后按group_name进行分组最后再对id进行count聚合,然后根据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.3f%%', startangle=0, explode=explode)
plt.tight_layout()
plt.show()
分析:explode用于突出显示部分,startangle表示饼图中的第一个部分起始的角度,经过多次试验发现是指的最小角,在3点钟方向,autopct用于设置数据显示格式。
group_name="Computer Science"
cats = data.merge(df_taxonomy, on="categories").query("group_name == @group_name")
cats
分析:在类别列合并两张数据表。
cats.groupby(["year","category_name"]).agg('count').reset_index().pivot(index="category_name", columns="year",values="id")
分析:先进行分组,然后进行count聚合,对行索引进行重置,然后将年份的长表转为宽表,值为前面求得count值,注意这里values参数设置成红框中的任意列名均可,因为他们此时的含义均为count统计量,如下:
https://www.cnblogs.com/xuchunlin/p/6774380.html