2021-01-17

天池比赛总结——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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值