查看原文
其他

问答|如何将从 Wind 数据库下载的数据转换成面板?

RStata RStata 2022-05-17

这是培训班的一个小伙伴遇到的一个问题,她从 Wind 数据库下载了一个企业应付账款股本资本公积数据:demo1203.xlsx(下载链接:https://mdniceczx.oss-cn-beijing.aliyuncs.com/demo1203.xlsx),但是她不知道如何将这个数据转换成面板数据。我们来一起学习下这个数据的转换和合并,首先我们把这个数据读取进来:

import excel using "demo1203.xlsx", clear first
save 企业应付账款股本资本公积, replace

我们怎么把这个数据转换成面板数据呢?

这个数据中有这些变量:

  • 证券代码
  • 证券简称
  • 实收资本或股本报告期2012一季报表类型
  • 实收资本或股本报告期2012中报报表类型 ...
  • 实收资本或股本报告期2020年报报表类型
  • 资本公积金报告期2012一季报表类型合并报表
  • 资本公积金报告期2012中报报表类型合并报表 ...
  • 资本公积金报告期2020年报报表类型合并报表
  • 应付账款报告期2012一季报表类型合并报表
  • 应付账款报告期2012中报报表类型合并报表 ...
  • 应付账款报告期2020年报报表类型合并报表

中间我省略了很多,很容易发现,这些变量可以分 3 组,实收资本或股本、资本公积金和应付账款,我们可以分别处理这三组数据然后再合并,首先我们保留实收资本或股本组的变量:

use 企业应付账款股本资本公积, clear
keep 证券代码 证券简称 实收资本或股本报告期2012一季报表类型 - 实收资本或股本报告期2020年报报表类型

这是一个宽面板,我们可以用 gather 命令将其转为长面板:

gather 实收资本或股本报告期2012一季报表类型 - 实收资本或股本报告期2020年报报表类型

现在只剩下 4 个变量了:证券代码 证券简称 variable value

我们再做一些处理:

drop if missing(证券代码)
ren var quarter
ren val 实收资本或股本
replace quarter = subinstr(quarter, "实收资本或股本报告期", "", .)
replace quarter = subinstr(quarter, "报表类型", "", .)
replace quarter = subinstr(quarter, "一季", "-q1", .)
replace quarter = subinstr(quarter, "中报", "-q2", .)
replace quarter = subinstr(quarter, "三季", "-q3", .)
replace quarter = subinstr(quarter, "年报", "-q4", .)
gen date = quarterly(quarter, "YQ")
format date %tq
keep 证券代码 date 实收资本或股本
replace 证券代码 = subinstr(证券代码, ".SZ", "", .)
replace 证券代码 = subinstr(证券代码, ".SH", "", .)
drop if 证券代码 == "数据来源:Wind"
destring, replace
xtset 证券代码 date

*> panel variable: 证券代码 (strongly balanced)
*> time variable: date, 2012q1 to 2020q4
*> delta: 1 quarter

成功了!保存下:

save 实收资本或股本, replace

同样的方法再处理下另外两组变量:

use 企业应付账款股本资本公积, clear
keep 证券代码 证券简称 资本公积金*
gather 资本公积金*
drop if missing(证券代码)
ren var quarter
ren val 资本公积金
replace quarter = subinstr(quarter, "资本公积金报告期", "", .)
replace quarter = subinstr(quarter, "报表类型合并报表", "", .)
replace quarter = subinstr(quarter, "一季", "-q1", .)
replace quarter = subinstr(quarter, "中报", "-q2", .)
replace quarter = subinstr(quarter, "三季", "-q3", .)
replace quarter = subinstr(quarter, "年报", "-q4", .)
gen date = quarterly(quarter, "YQ")
format date %tq
keep 证券代码 date 资本公积金
replace 证券代码 = subinstr(证券代码, ".SZ", "", .)
replace 证券代码 = subinstr(证券代码, ".SH", "", .)
drop if 证券代码 == "数据来源:Wind"
destring, replace
xtset 证券代码 date
save 资本公积金, replace

注意这里我使用了另外一种表示变量列表的方法:资本公积金*,这表示所有以 资本公积金 开头的变量。

use 企业应付账款股本资本公积, clear
keep 证券代码 证券简称 应付账款*
gather 应付账款*
drop if missing(证券代码)
ren var quarter
ren val 应付账款
replace quarter = subinstr(quarter, "应付账款报告期", "", .)
replace quarter = subinstr(quarter, "报表类型合并报表", "", .)
replace quarter = subinstr(quarter, "一季", "-q1", .)
replace quarter = subinstr(quarter, "中报", "-q2", .)
replace quarter = subinstr(quarter, "三季", "-q3", .)
replace quarter = subinstr(quarter, "年报", "-q4", .)
gen date = quarterly(quarter, "YQ")
format date %tq
keep 证券代码 date 应付账款
replace 证券代码 = subinstr(证券代码, ".SZ", "", .)
replace 证券代码 = subinstr(证券代码, ".SH", "", .)
drop if 证券代码 == "数据来源:Wind"
destring, replace
xtset 证券代码 date
save 应付账款, replace

最后将三个表合并下:

use 实收资本或股本, clear
merge 1:1 证券代码 date using 资本公积金
drop _m
merge 1:1 证券代码 date using 应付账款
drop _m
order 证券代码 date

这样我们的数据就整理好了:

注意这是个平衡面板,虽然有很多缺失值,这给我们提供了一个把非平衡面板变成平衡面板的思路:先 spread 再 gather。


您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存