python读取csmar_如何优雅的把CSMAR(国泰安)数据导入R

本文介绍了如何优雅地将CSMAR数据库的Excel数据导入R,并为每个变量添加标签。通过使用`foreach`和`doParallel`包进行并行处理,结合R与Python的`read_excel`功能,解决了批量读取和处理大量带有标签的Excel文件的问题。
摘要由CSDN通过智能技术生成

前言CSMAR(国泰安)数据库是经济金融相关的科研工作者用到的最多的数据库之一。它提供了丰富全面的上市公司财务及金融数据,以及一些行业宏观层面的数据。但是,它并没有像WRDS(沃顿研究数据服务)等数据库提供丰富接口(如SAS,R等)供下载,只能在网页上下载好数据然后导入到相应的分析软件进行分析。

我在最近使用该数据库时发现,虽然CSMAR(国泰安)数据库可以提供CSV格式下载,但限制每次只能有300,000条查询,而且在导入R的过程中总是报错。另外还有其他的可以导入R的txt格式,但无一例外都出现错误,无法导入成功。最终无奈选择xls格式,而xls格式由于自身的限制,每个文件只有65,000条数据。

因此把CSMAR数据导入R就变成了两个问题:批量导入excel数据文件。

为每个变量添加标签。(因为许多变量名并不能直观的知道它的意思,而Rstudio里面利用`Hmisc`的`label( )`函数给每个变量添加标签就方便多了。)

完成之后,在Rstudio里面的样式是:

一步一步来下载数据并解压在一个文件夹里,我们以CSMAR里面基金表现数据为例:

如图,每个子文件夹里面又有很多xls文件,和标签说明的txt文件。

2. 读取xls文件的list:

filepath

list

pattern = "\\.xls")

## 读取该文件夹下面所有子文件夹的xls文件

每个excel的文件如下:

这个excel里面第一行是变量名,第二行是标签,第三行是单位,数据从第四行开始,那么读取所有excel表的数据:

library(foreach)

library(doParallel)

# 采用parallel,提高读取效率

registerDoParallel(makeCluster(detectCores()))

# 先从每个xls文件第四行读取数据,不包含变量名

data

.packages = c("readxl", "readr")) %dopar%

read_excel(list[i], skip = 3, col_names = F)

# 从一个文件中提取变量名称

names % names()

# 从文件夹的txt文件里面提取变量名

labels

pattern = "\\.txt")[1]

labels % as_data_frame() %>%

separate(value, into = c("var", "label","definition"),

sep = "\\[|\\]", extra = "merge") %>% select(label)

labels

最后把变量名和labels 加入data 中:

names(data)

Hmisc::label(data, self=FALSE)

函数化整个过程:

CSMARxlsDF

list

pattern = "\\.xls")

names % names()

# generate labels

labels

pattern = "\\.txt")[1]

labels % as_data_frame() %>%

separate(value, into = c("var", "label","definition"),

sep = "\\[|\\]", extra = "merge") %>% select(label)

labels

data

.packages = c("readxl", "readr")) %dopar%

read_excel(list[i], skip = 3, col_names = F)

names(data)

Hmisc::label(data, self=FALSE)

return(data)

}

以后只要把下载的数据放在一个文件夹里,并提供该文件夹的路径,就可以得到一个well-organized dataset.

注意:保存后重新加载带有label的dataset,必须加载`library(Hmisc)`, 否则会出现错误!

其实,如果用Rstudio的话可以直接在里面运行python代码会更快速:在R里面readxl里面的read_excel( ) 只能选择skip 几行,比如skip =3 表示忽略前三行。但是,在python里面的pandas 提供的read_excel( ) 里面的skiprows 可以给出一个list作为参数比如skiprows = [1,2] 表示忽略第二行和第三行,但仍然保留第一样的变量名称,对我们这个例子非常有用!

# 在Rstudio里面添加python chunk就可以直接运行了,非常方便!

```{python, engine.path='/Library/Frameworks/Python.framework/Versions/3.5/bin/python3.5'}

path = "Users/Sean/基金表现/"

import pandas as pd

import os

import feather

filesxls = [os.path.join(root, name)

for root, dirs, files in os.walk(path)

for name in files

if name.endswith((".xls"))]

data = [pd.read_excel(f,skiprows = [1,2]) for f in filesxls]

all_data = pd.concat(data)

labels = pd.read_excel(filesxls[0], skiprows = [0]).columns.values.tolist()

labels = pd.DataFrame(labels)

feather.write_dataframe(labels, '/Users/Sean/labels.feather')

feather.write_dataframe(all_data, '/Users/Sean/data.feather')

```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值