任务:统计包含代码的论文
本次任务的主要内容就是利用正则表达式在comments或abstract字段中取出具体的代码链接。
任务重点:正则表达式的学习和使用。
- 准备工作,取出数据中的
abstract, categories, comments
对应的内容。
import re
import json
import pandas as pd
import matplotlib.pyplot as plt
data = []
with open('arxiv-metadata-oai-snapshot.json', 'r') as f:
for idx, line in enumerate(f):
d = json.loads(line)
d = {'abstract': d['abstract'], 'categories': d['categories'], 'comments': d['comments']}
data.append(d)
data = pd.DataFrame(data)
data
- 统计论文页数,在
comments
字段中抽取出pages,
。
data['pages'] = data['comments'].apply(lambda x: re.findall("[0-9]+ pages", str(x)))
data
- 选出页数不为空的行。
data = data[data['pages'].apply(lambda x: len(x)>0) ]
data
- 修改数据中“页数”列的格式,将列表格式改为
int
数据。
data['pages'] = data['pages'].apply(lambda x: x[0].split(' ')[0])
- 选择论文的第一个类别作为主要类别。
data['categories'] = data['categories'].apply(lambda x: x.split(' ')[0]).apply(lambda x: x.split('.')[0])
- 计算每类论文的平均页数。
plt.figure(figsize=(12,6))
data.groupby(['categories'])['pages'].mean().plot(kind='bar')
报错:DataError: No numeric types to aggregate
错误原因:很可能是因为你指定的列里不能执行所对应的聚合操作,即有可能是数据类型的错误(比如目前数字列的类型的object),也有可能是该列中除了数字真的存在其他类型的数据。
在本次的例子中,是第一种情况,所以解决办法为:
data['pages'] = data['pages'].astype(int)