其他
问答|如何将从 Wind 数据库下载的数据转换成面板?
这是培训班的一个小伙伴遇到的一个问题,她从 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。