数据分析-(学术前沿趋势分析)-task3

数据分析-(学术前沿趋势分析)-task3

分析

论文代码统计,统计所有论文出现代码的相关统计。

在原始arxiv数据集中作者经常会在论文的comments或abstract字段中给出具体的代码链接

  • 确定数据出现的位置;
  • 使用正则表达式完成匹配;
  • 完成相关的统计

知识点

  1. 拿到数据集,先看下特征量,找到与代码相关的特征{‘abstract’,‘categories’,‘comments’};提取出来(dict)
  2. 用pandas看下数据结构(展示前几行,有个大致轮廓);
  3. 找到’pages’、‘categories’、‘figures’、含有’github’链接的数据,主要用到正则表达式,去找定性数据
  4. 可视化

个人需要补充的点

  1. 本次作业比较简单,还是熟练python中正则表达式的用法

Q&A

1正则表达式

  1. 普通字符:大写和小写字母、所有数字、所有标点符号和一些其他符号
字符 描述
[ABC] 匹配 […] 中的所有字符,例如 [aeiou] 匹配字符串 “google runoob taobao” 中所有的 e o u a 字母。
[^ABC] 匹配除了 […] 中字符的所有字符,例如 [^aeiou] 匹配字符串 “google runoob taobao” 中除了 e o u a 字母的所有字母。
[A-Z] [A-Z] 表示一个区间,匹配所有大写字母,[a-z] 表示所有小写字母。
. 匹配除换行符(\n、\r)之外的任何单个字符,相等于 [^\n\r]
[\s\S] 匹配所有。\s 是匹配所有空白符,包括换行,\S 非空白符,包括换行。
\w 匹配字母、数字、下划线。等价于 [A-Za-z0-9_]
  1. 特殊字符:有特殊含义的字符
特别字符 描述
( ) 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用 ( 和 )。
* 匹配前面的子表达式零次或多次。要匹配 * 字符,请使用 *。
+ 匹配前面的子表达式一次或多次。要匹配 + 字符,请使用 +。
. 匹配除换行符 \n 之外的任何单字符。要匹配 . ,请使用 . 。
[ 标记一个中括号表达式的开始。要匹配 [,请使用 [。
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。要匹配 ? 字符,请使用 ?。
\ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。例如, ‘n’ 匹配字符 ‘n’。’\n’ 匹配换行符。序列 ‘\’ 匹配 “”,而 ‘(’ 则匹配 “(”。
^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合。要匹配 ^ 字符本身,请使用 ^。
{ 标记限定符表达式的开始。要匹配 {,请使用 {。
| 指明两项之间的一个选择。要匹配 |,请使用 |。
  1. 限定符
字符 描述
* 匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。
+ 匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
? 匹配前面的子表达式零次或一次。例如,“do(es)?” 可以匹配 “do” 、 “does” 中的 “does” 、 “doxy” 中的 “do” 。? 等价于 {0,1}。
{n} n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
{n,} n 是一个非负整数。至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。‘o{1,}’ 等价于 ‘o+’。‘o{0,}’ 则等价于 ‘o*’。
{n,m} m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,“o{1,3}” 将匹配 “fooooood” 中的前三个 o。‘o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。

2填充fillna()函数

函数用法:

  1. 取值:True(直接修改原对象) 、False(创建一个副本,修改副本,原对象不变(缺省默认))
  2. method参数的取值 : {‘pad’, ‘ffill’,‘backfill’, ‘bfill’, None}, default None
    • pad/ffill:用前一个非缺失值去填充该缺失值
    • backfill/bfill:用下一个非缺失值填充该缺失值
    • None:指定一个值去替换缺失值(缺省默认这种方式)
  3. limit参数:限制填充个数
  4. axis参数:修改填充方向(axis=1,按行填充)
    不指定参数时:
  5. 常数填充 df1.fillna(100)(源对象不变)
  6. 字典填充 df1.fillna({0:10,1:20,2:30})(源对象不变)
  7. df1.fillna(0,inplace=True) (指定inplace参数,修改源对象)
  8. 其他参数。。。

code

#论文代码统计,统计所有论文出现代码的相关统计
#在原始arxiv数据集中作者经常会在论文的comments或abstract字段中给出具体的代码链接
#     确定数据出现的位置;
#     使用正则表达式完成匹配;
#     完成相关的统计;

import json
import pandas as pd
import re
import matplotlib.pyplot as plt

data = []
with open('arxiv-metadata-oai-2019.json','r') as f:
    for idx,line in enumerate(f):
        d = json.loads(line)
        d = {
     'abstract':d['abstract'],'categories':d['categories'],'comments':d['comments']}
        data.append(d)
data = pd.DataFrame(data)

data['pages'] = data['comments'].apply(lambda x: re.findall('[1-9][0-9]* pages', str(x)))
data = data[data['pages'].apply(len) > 0]
data['pages'] = data['pages'].apply(lambda x: float(x[0].replace(' pages', '')))
data['pages'].describe().astype(int)

#按照分类统计论文页数
data['categories'] = data['categories'].apply(lambda x :x.split(' ')[0])
data['categories'] = data['categories'].apply(lambda x :x.split('.')[0])
data['categories']

plt.figure(figsize=(12, 6))
data.groupby(['categories'])['pages'].mean().plot(kind='bar')

#对论文图表个数进行抽取
data['figures'] = data['comments'].apply(lambda x:re.findall('[1-9][0-9]* figures',str()))
data = data[data['figures'].apply(len)>0]
data['figures'] = data['figures'].apply(lambda x:float(x[0].replace(' figures', '')))

# 对论文的代码链接进行提取
data_with_code = data[(data.comments.str.contains('github')==True)|(data.abstract.str.contains('github')==True)]
data_with_code['text'] = data_with_code['abstract'].fillna('') + data_with_code['comments'].fillna('')
#fillna('')填充缺失值
# 使⽤用正则表达式匹配论⽂文
pattern = '[a-zA-z]+://github[^\s]*'
data_with_code['code_flag'] = data_with_code['text'].str.findall(pattern).apply(len)
#直观绘图
data_with_code = data_with_code[data_with_code['code_flag'] == 1]
plt.figure(figsize=(12, 6))
data_with_code.groupby(['categories'])['code_flag'].count().plot(kind='bar')

你可能感兴趣的:(数据分析,python,数据分析)