如何优雅的把CSMAR(国泰安)数据导入R和Python

前言

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

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

因此把CSMAR数据导入R就变成了两个问题:

  1. 批量导入excel数据文件。
  2. 为每个变量添加标签。(因为许多变量名并不能直观的知道它的意思,而Rstudio里面显示每个变量标签就方便多了)

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

一步一步来

安装两个packages:

install.packages(c("tidyverse", "readxl"))

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

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

读取xls文件的list:

library(tidyverse)
library(readxl)
filepath <- "~/基金表现/"
list <- list.files(filepath, 
                    full.names = TRUE, # 读取完整路径
                    recursive = T, # 读取所有的子文件夹
                    pattern = "\\.xls" # 只读取 .xls文件,也可以改成 .xlsx
                    )

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

每个excel的文件如下:

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

先读取数据

# 数据部分
data <- list %>% as_tibble() %>%
    mutate(DF = map(value,
                    ~ read_excel(., skip = 3, 
                                            col_names = F))) %>%
    select(-value) %>%
    unnest()

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

names <- read_excel(list[1],col_names = T) %>% names()

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

labels <- read_excel(list[1],skip = 1) %>% names() 

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

# 先写一个加label的函数 

addlabel <- function(dat, vlist, labellist) {
    for (v in vlist) {
        attr(dat[[v]], 'label') <- labellist[which(vlist == v)]
    }
    dat
}

# 给数据加变量名字
names(data) <- names

# 给变量加labels
data <- addlabel(data, names(data), labels)

其实你只需要下面这个函数!

当然你看完这篇文章就不需要这么麻烦了,直接复制下面的函数就可以了!

# 读取文件夹里的,包括子文件夹的所有xls 

CSMARxlsDF <- function(filepath){ 
    library(tidyverse) 
    library(readxl)
    
    list <- list.files(filepath,full.names = TRUE, recursive = T,
                       pattern = "\\.xls")

    names <- read_excel(list[1],col_names = T) %>% names()

    # generate labels
    
    labels <- read_excel(list[1],skip = 1) %>% names() 

    data <- list %>% as_tibble() %>%
        mutate(DF = map(value,
                        ~ read_excel(., skip = 3, 
                                                col_names = F))) %>%
        select(-value) %>%
        unnest()
    
    # 先写一个加label的函数 
    addlabel <- function(dat, vlist, labellist) {
        for (v in vlist) {
        attr(dat[[v]], 'label') <- labellist[which(vlist == v)]
            }
            dat
        }
    # 给数据加变量名字
    names(data) <- names

    # 给变量加labels
    data <- addlabel(data, names(data), labels)
    return(data)
}

如果只有一个excel文件,那就更简单了

# 读取文件夹里的,包括子文件夹的所有xls 
CSMARxlsDFone <- function(onefilepath){ 
    library(tidyverse) 
    library(readxl)
    names <- read_excel(onefilepath,col_names = T) %>% names()
    labels <- read_excel(onefilepath,skip = 1) %>% names() 
    data <- read_excel(onefilepath, skip = 3, col_names = F)
    
    # 先写一个加label的函数 
    addlabel <- function(dat, vlist, labellist) {
        for (v in vlist) {
        attr(dat[[v]], 'label') <- labellist[which(vlist == v)]
            }
            dat
        }
        
    # 给数据加变量名字
    names(data) <- names

    # 给变量加labels
    data <- addlabel(data, names(data), labels)
    return(data)
}

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

导入python

其实,如果用Rstudio的话可以直接在里面运行python代码会更快速:

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

在Rstudio里面添加python chunk就可以直接运行了

python和R之间进行数据沟通的时候,一个好用的格式是feather, python里面安装可以通过 pip install feather-format 完成。


path = "~/基金表现/"

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')
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容

  • 工欲善其事,必先利其器。总结一下,方便多了。R语言还是很牛逼的,可以干很多事情。有一把顺手的刀还是很重要的。 0....
    Liam_ml阅读 4,605评论 1 60
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,719评论 0 10
  • 林辰躲在一个储物室里休息,天快要黑了,这次的比赛场地这么大林辰估计最少也要有7天时间,看了看定位器,比赛剩余人数还...
    生活爱问人阅读 1,063评论 0 2
  • 大 葱 炒 腊 肉 1.将腊肉洗净后放入锅中,加入适量的水,煮至用筷子可以从腊肉皮上插进去的时候将其捞出,切成薄片...
    昕昕的幸福阅读 161评论 0 1
  • 慢慢来,一步一个脚印的去努力,属于我的终将会到来!
    一步一个脚印儿阅读 133评论 0 0