零基础入门数据挖掘实践(学术前沿趋势分析)之一

任务1 论文数据统计

1.1 任务说明

任务主题:论文数量统计,即统计2019年全年计算机各个方向论文数量;
任务内容:赛题的理解、使用 Pandas 读取数据并进行统计;
任务成果:学习 Pandas 的基础操作;
可参考的学习资料:开源组织Datawhale joyful-pandas项目

1.2 运行环境

先记录下安装过程,win10+Anaconda3,原本以为安装好pandas版本就合适(项目要求pandas版本不低于1.1.0),但是没想到默认的版本还是0.24.5,于是百度后conda install pandas。安装完成后在jupyter notebook中测试如下代码:

// 查看pandans的版本号
import pandas as pd
print(pd.show_versions())

pandas : 1.2.0
numpy : 1.19.2
pytz : 2018.5
dateutil : 2.7.3
pip : 20.3.3
setuptools : 40.2.0
Cython : 0.28.5
pytest : 3.8.0
hypothesis : None
sphinx : 1.7.9
blosc : None
feather : None
xlsxwriter : 1.1.0
lxml.etree : 4.2.5
html5lib : 1.0.1
pymysql : None
psycopg2 : None
jinja2 : 2.10
IPython : 6.5.0
pandas_datareader: None
bs4 : 4.6.3
bottleneck : 1.2.1
fsspec : None
fastparquet : None
gcsfs : None
matplotlib : 2.2.3
numexpr : 2.7.2
odfpy : None
openpyxl : 2.5.6
pandas_gbq : None
pyarrow : None
pyxlsb : None
s3fs : None
scipy : 1.5.2
sqlalchemy : 1.2.11
tables : 3.4.4
tabulate : None
xarray : None
xlrd : 1.1.0
xlwt : 1.3.0
numba : 0.39.0
None

1.3 数据集

数据集来源:https://www.kaggle.com/Cornell-University/arxiv

id:arXiv ID, #可用于访问论文;
submitter:论文提交者;
authors:论文作者;
title:论文标题;
comments:论文页数和图表等其他信息;
journal-ref:论文发表的期刊的信息;
doi:数字对象标识符,https://www.doi.org;
report-no:报告编号;
categories:论文在 arXiv 系统的所属类别或标签;
license:文章的许可证;
abstract:论文摘要;
versions:论文版本;
authors_parsed:作者的信息。

1.4 导入包读取数据

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 #画图工具
data  = []                      #初始化
#使用with语句优势:1.自动关闭文件句柄;2.自动显示(处理)文件读取数据异常
with open(r'I:\other\2021.01\arxiv-metadata-oai-snapshot.json', 'r') as f: 
    for idx, line in enumerate(f):       
                                # 读取前100行,如果读取所有数据需要8G内存
        if idx >= 100:			
            break
        data.append(json.loads(line))
data = pd.DataFrame(data) #将list变为dataframe格式,方便使用pandas进行分析
data.shape #显示数据大小

运行结果
在这里插入图片描述

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):
    '''
    定义读取文件的函数
        path: 文件路径
        columns: 需要选择的列
        count: 读取行数
    '''  
    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('arxiv-metadata-oai-snapshot.json', ['id', 'categories', 'update_date'])

1.5 数据预处理

首先粗略统计论文的种类信息:
count:一列数据的元素个数;
unique:一列数据中元素的种类;
top:一列数据中出现频率最高的元素;
freq:一列数据中出现频率最高的元素的个数;

data["categories"].describe()

在这里插入图片描述

unique_categories = set([i for l in [x.split(' ') for x in data["categories"]] for i in l])
len(unique_categories)
unique_categories

运行结果部分截图
在这里插入图片描述

data["year"] = pd.to_datetime(data["update_date"]).dt.year #将update_date从例如2019-02-20的str变为datetime格式,并提取处year
del data["update_date"] #删除 update_date特征,其使命已完成
data = data[data["year"] >= 2019] #找出 year 中2019年以后的数据,并将其他数据删除
# data.groupby(['categories','year']) #以 categories 进行排序,如果同一个categories 相同则使用 year 特征进行排序
data.reset_index(drop=True, inplace=True) #重新编号
data #查看结果

运行结果
在这里插入图片描述

#爬取所有的类别
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    
})

#按照 "group_name" 进行分组,在组内使用 "archive_name" 进行排序
df_taxonomy.groupby(["group_name","archive_name"])
df_taxonomy

运行结果提示报错:
在这里插入图片描述

1.6数据分析及可视化


_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

在这里插入图片描述

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.2f%%', startangle=160, explode=explode)
plt.tight_layout()
plt.show()

在这里插入图片描述

总结

1.找不到模块seaborn,百度后用
conda install seaborn
conda运行通过。但是用Python Shell 运行py文件,仍然提示找不到模块seabborn,百度原因如下:
在这里插入图片描述
好吧,再运行一下pip3 install seaborn,通过。
2. open()函数参数格式不对,百度结果:
改正的方法有两种:第一、将’\’的方向反向为’/’,即文首正确的写法;第二、在含有转义符的字符串前加‘r’表示字符串内按原始含义解释,不做转义处理。(推荐!)
3.模块未找到错误:没有模块bs4
pip3 install bs4
解决问题
4.memory error
程序里没有限定取数据的范围,内存不够报错。
代码里加进去以下两句就好了,只取前100条记录。
if idx >= 100:
break

学习参考:
1.论文数据统计
2.pandas中文网

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值