Datawhale 12月组队学习笔记(一): 数据分析Task1

  1. 准备
    seaborn(画图)、BeautifulSoup(爬取arxiv)、re(正则表达式)、requests(网络连接)、json(读json格式的数据)、pandas、matplotlib.pyplot(画图)
import seaborn as sns 
from bs4 import BeautifulSoup 
import re 
import requests 
import json 
import pandas as pd 
import matplotlib.pyplot as plt 
  1. 使用with语句读入数据:
data  = [] #初始化
with open("arxiv-metadata-oai-snapshot.json", 'r') as f: 
    for idx, line in enumerate(f): 
        if idx >= 100:
            break
        data.append(json.loads(line))

注:
由于数据太大,只读取前100行
使用with语句优势:1.自动关闭文件句柄;2.自动显示(处理)文件读取数据异常

  1. 数据预处理
data = pd.DataFrame(data) #将list变为dataframe格式,方便使用pandas进行分析
data.shape #显示数据大小
data["categories"].describe() #查看论文种类信息
# 输出结果如下:
count      1778381
unique       61371
top       astro-ph
freq         86914
Name: categories, dtype: object
unique_categories = set([i for l in [x.split(' ') for x in data["categories"]] for i in l]) #没弄明白,应该是根据data["categories"]构建一个不重复元素集
  1. 提取年份
data["year"] = pd.to_datetime(data["update_date"]).dt.year 
del data["update_date"] #删除 update_date 
data = data[data["year"] >= 2019] #找出 year 中2019年以后的数据,并将其他数据删除
data.groupby(['categories','year']) #按categories, year排序
data.reset_index(drop=True, inplace=True) #重新编号
print(data) #查看结果

注:一定要先变为datetime格式才可提取年份信息

  1. 爬取所有的类别
    正则表达式回顾
    在这里插入图片描述
    在这里插入图片描述
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)
  1. 生成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. 可视化
_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) #爆炸第4-8块饼,到中心距离分别为 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()

group_name="Computer Science"
cats = data.merge(df_taxonomy, on="categories").query("group_name == @group_name")
cats.groupby(["year","category_name"]).count().reset_index().pivot(index="category_name", columns="year",values="id") #定义label

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值