天池比赛总结——2019年学术数据分析
能力有限,且数据集分析不足,没想着能做完5个任务,现针对:
任务1:论文数量统计(数据统计任务):统计2019年全年,计算机各个方向论文数量;
任务2:论文作者统计(数据统计任务):统计所有论文作者出现评率Top10的姓名;
--------------任务1
直接上代码
# 导入所需的package
import seaborn as sns #用于画图
from bs4 import BeautifulSoup #用于爬取arxiv的数据
import re #用于正则表达式,匹配字符串的模式
import requests #用于网络连接,发送网络请求,使用域名获取对应信息
import json #读取数据,我们的数据为json格式的
import pandas as pd #数据处理,数据分析
import matplotlib.pyplot as plt #画图工具
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('C:/Users/George/Desktop/pre_paper_analyse/arxiv-metadata-oai-2019.json', ['id', 'categories', 'authors','title','update_date'])
#爬取所有的类别
website_url = requests.get('https://arxiv.org/category_taxonomy').text #获取网页的文本数据
soup = BeautifulSoup(website_url,'lxml') #爬取数据,这里使用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
})
df_taxonomy.head()
#存储转换后的原始数据
data.to_csv('D:\\All_Code_Project\\spyder\\data.csv',index = False)
df_taxonomy.to_csv('D:\\All_Code_Project\\spyder\\categories.csv',index = False)
data['categories'] = data.categories.str.split(' ',expand=True)[0]
df_taxonomy = df_taxonomy[df_taxonomy['group_name'].isin(['Computer Science'])]#提取指定列中特定元素的所有行,也就是把计算机方向的行全部提取
data_merge = data.merge(df_taxonomy,how='left',on='categories').sort_values(by = "update_date").drop_duplicates(['id','group_name'],keep = 'first')
data_merge.dropna(how='any',subset=['categories'],inplace=True)
data_merge.to_csv('D:\\All_Code_Project\\spyder\\data_subset_merge.csv',index = False)
#根据'category_name'字段针对计算机不同方向统计并可视化
data_merge.groupby('category_name')['id'].agg('count').sort_values(ascending = False).plot(kind = 'barh')
上面的代码画图,下面的代码形成csv
import pandas as pd
import numpy as np
import sys
import csv
address = pd.read_csv('D:\\All_Code_Project\\spyder\\data_subset_merge.csv')#usecols=[8]
# address.to_csv("D:\\All_Code_Project\\spyder\\d.csv") #文件输出
# df2=pd.read_csv('D:\\All_Code_Project\\spyder\\d.csv')
address = address[address['group_name'].isin(['Computer Science'])]
df3=np.unique(str(address)) #调用unique函数对该列数据分组,返回每一组的组名
ts = pd.Series(address['category_name'].values, index=address['category_name']) #分组后计数返回该组的组名和每一个名称的数量
ts.describe()
ts.value_counts()
category=ts.value_counts() #格式转换加文件输出,series无法直接输出为csv
category_name_count=pd.DataFrame(ts.value_counts())
category_name_count.to_csv('D:\\All_Code_Project\\spyder\\e.csv') #输出文件是包含组名以及个数的csv文件
--------任务2
这里存在的问题是原始数据集作者是已经分析好的,但是,还是有些问题,因为我没有见过“\\”的作者,因此我取得前25,其次,dataframe关于作者这一列,里面都是字符串,虽然看着是list,所以,得一步步分析能满足所有字符串的名字的去杂过程:
#容易出错的地方,去杂开始
x = author1.loc[indexs].values[-1].replace(", '']","").replace('[','').replace(']','').split(", '']")
x = str(x)
x = x.replace('["','').replace('"]','').strip().replace("'","").strip().split(', ')
代码如下:
# -*- coding: utf-8 -*-
"""
Created on Sat Jan 16 19:11:40 2021
@author: George
"""
import pandas as pd
import numpy as np
import sys
import csv
import seaborn as sns #用于画图
from bs4 import BeautifulSoup #用于爬取arxiv的数据
import re #用于正则表达式,匹配字符串的模式
import requests #用于网络连接,发送网络请求,使用域名获取对应信息
import json #读取数据,我们的数据为json格式的
import pandas as pd #数据处理,数据分析
import matplotlib.pyplot as plt #画图工具
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('C:/Users/George/Desktop/pre_paper_analyse/arxiv-metadata-oai-2019.json', ['authors_parsed'])
#以dict方式统计作者以及数量
author={}
data.to_csv('D:\\All_Code_Project\\spyder\\auther.csv',index = False)
author1 = pd.read_csv("D:\\All_Code_Project\\spyder\\auther.csv")
#从dataframe中取auther_parsed
for indexs in author1.index:
#容易出错的地方,去杂开始
x = author1.loc[indexs].values[-1].replace(", '']","").replace('[','').replace(']','').split(", '']")
x = str(x)
x = x.replace('["','').replace('"]','').strip().replace("'","").strip().split(', ')
#按照{‘名字’:数量}方式存入字典
for j in x:
if (j not in author.keys()) and j!='':
author[j] = 1
if j in author.keys():
author[j]= author[j]+1
print(j)
print(x)
#降序排序
def dict2list(dic:dict):
''' 将字典转化为列表 '''
keys = dic.keys()
vals = dic.values()
lst = [(key, val) for key, val in zip(keys, vals)]
return lst
author_top10 = sorted(dict2list(author), key=lambda x:x[1], reverse=True)#按照value大小降序排列
# author_top10[]
with open("top25.txt",'w') as f: # 写文件
for i in author_top10[:25]:
f.write(str(i))
总结
总结在于某些dataframe的语法,取某一列指定元素的所有行,以及去杂,repalce,split,list和str的转换,dict写入txt,从代码角度,掌握的就是这几点,还有就是,在发现数据输出和预期不同时,及时查看数据的type,节省时间。
数据集在阿里云https://tianchi.aliyun.com/competition/entrance/531866/information