【Task01】前沿学术数据分析AcademicTrends

一、准备工作

1.安装包

pandas、matplotlib和seaborn提前安装了,所以只安装下面两个:

【Task01】前沿学术数据分析AcademicTrends_第1张图片
【Task01】前沿学术数据分析AcademicTrends_第2张图片

验证成功:
【Task01】前沿学术数据分析AcademicTrends_第3张图片

二、查看数据

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

【Task01】前沿学术数据分析AcademicTrends_第4张图片

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

【Task01】前沿学术数据分析AcademicTrends_第5张图片

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

【Task01】前沿学术数据分析AcademicTrends_第6张图片

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种。

1.爬虫

【Task01】前沿学术数据分析AcademicTrends_第7张图片
在这里插入图片描述
仍然没有解决,换一种方式,使用‘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()

【Task01】前沿学术数据分析AcademicTrends_第8张图片

2.数据处理

_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

【Task01】前沿学术数据分析AcademicTrends_第9张图片

分析:以上代码分别将data和df_taxonomy进行了左合并,然后通过drop_duplicates方法对id和group_name进行去重,然后按group_name进行分组最后再对id进行count聚合,然后根据id的列进行降序排列,最后将原来的行索引移除到列中。

3.可视化展现

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

【Task01】前沿学术数据分析AcademicTrends_第10张图片
分析:explode用于突出显示部分,startangle表示饼图中的第一个部分起始的角度,经过多次试验发现是指的最小角,在3点钟方向,autopct用于设置数据显示格式。

group_name="Computer Science"
cats = data.merge(df_taxonomy, on="categories").query("group_name == @group_name")
cats

【Task01】前沿学术数据分析AcademicTrends_第11张图片

分析:在类别列合并两张数据表。

cats.groupby(["year","category_name"]).agg('count').reset_index().pivot(index="category_name", columns="year",values="id") 

【Task01】前沿学术数据分析AcademicTrends_第12张图片

分析:先进行分组,然后进行count聚合,对行索引进行重置,然后将年份的长表转为宽表,值为前面求得count值,注意这里values参数设置成红框中的任意列名均可,因为他们此时的含义均为count统计量,如下:

【Task01】前沿学术数据分析AcademicTrends_第13张图片

【Task01】前沿学术数据分析AcademicTrends_第14张图片

参考文献

1.HTTPSConnectionPool(host=‘xxxxx’, port=443): Max retries exceeded with url:xxxxxxxx (Caused by NewConnectionError(’

https://www.cnblogs.com/xuchunlin/p/6774380.html

你可能感兴趣的:(#,python,数据分析,可视化,大数据,datawhale)