自动获取和展示中国宏观杠杆率数据
这是 TidyFriday 社区推出的第一篇 Stata 的教程,为了吸引大家对 Stata 的兴趣,先不从最基础的讲,而是讲述一个使用 Stata 提高研究效率的案例。
国家资产负债表研究中心 CNBS 会在他们的服务器上定期推出 中国宏观杠杆率数据[1],是下面这个样子的:
在左下角有个数据下载按钮,点击就可以下载数据了,下载链接为:http://114.115.232.154:8080/handler/download.ashx ,下载之后会得到这个 xlsx 文件,这个文件的内容是这样的:
如果我们经常需要用这个数据,然后每次要用的时候都要打开这个网站下载,而且这个网站的网址还是个 IP 地址,谁记得住啊!所以如果我们能写个小程序自动获取然后整理好这个数据,最好再配个画图的功能。
那么我们先用 Stata 完成下载数据、整理数据、图表绘制这三个操作:
下载和整理数据
注意这个年份实际上是个月份变量:
/* 清空内存 */
clear all
/* copy 命令可以用于文件下载、复制粘贴 */
copy "http://114.115.232.154:8080/handler/download.ashx" "CNBS中国杠杆率数据.xlsx", replace
/* import excel 命令用于导入 EXCEL 数据 */
import excel "CNBS中国杠杆率数据.xlsx", sheet("Data") firstrow clear
/* 删除没用的列 */
drop J K L
/* 删除第一行:英文变量名 */
drop in 1
/* 把所有能转换成数值型变量的变量都转换成数值型变量 */
destring, replace
/* 把年份转换成日期型变量,date() 函数生成的数是从 1960 年 1 月 1 日开始计算的天数 */
gen date = date(年份, "DMY")
/* 把 date 变量放在第一列 */
order date
/* 把 date 变量转换成 年-月-日 的格式 */
format date %tdCY-N-D
/* 删除没用的年份变量 */
drop 年份
/* 生成一个月份变量 */
gen 月份 = mofd(date)
/* 月份变量的格式:年-月 */
format 月份 %tmCY-N
/* 把月份放在第一列 */
order 月份
/* 删除没有用的 date 变量 */
drop date
/* 给月份变量添加一个赋值标签 */
label var 月份 "数据月份"
整理好的数据是这样的:
然后我们在画个图把这些数据展示出来:
/* 安装绘图主题 */
ssc install blindschemes, replace all
/* 设定 plotplain 为默认绘图主题 */
set scheme plotplain, permanently
/* 绘图 */
tw ///
line 居民部门 非金融企业部门 政府部门 中央政府 ///
地方政府 实体经济部门 金融部门资产方 金融部门负债方 月份, ///
lp(solid solid solid solid solid solid solid solid) ///
lc("166 206 227" "031 120 180" "178 223 138" ///
"051 160 044" "251 154 153" "227 026 028" ///
"253 191 111" "255 127 000") xti(日期) ///
note("数据来源:国家资产负债表研究中心(CNBS)") ///
ti(中国各部门宏观杠杆率趋势)
这样我们就完成了刚刚设想的整个流程,下面就是本文的重点了,就是如何编写一个 Stata 命令,把上面这个流程整合进去,让以后我们想调用这个数据的时候,一条命令就完成!
我们先写一个最简单的 Stata 命令:
program def myprog di "Hello, World!"end
把这个程序保存为一个 myprog.ado
文件,然后放在当前工作目录下,然后就可以调用了:
myprog
*> Hello, World!
那么对于本案例,我们可以编写一个这样的 ado
文件:
*! 自动获取和展示中国宏观杠杆率数据*! 程振兴 2019年4月1日*! 中国宏观杠杆率数据:http://114.115.232.154:8080/*! 示例:cmlrd*! cmlrd, plotcap program drop cmlrdprogram define cmlrd syntax [, plot] di "获取数据中···" qui copy "http://114.115.232.154:8080/handler/download.ashx" "CNBS中国杠杆率数据.xlsx", replace di "数据来源:国家资产负债表研究中心(CNBS)" qui{ import excel "CNBS中国杠杆率数据.xlsx", sheet("Data") firstrow clear drop J K L drop in 1 destring, replace gen date = date(年份, "DMY") order date format date %tdCY-N-D drop 年份 gen 月份 = mofd(date) format 月份 %tmCY-N order 月份 drop date label var 月份 "数据月份" } if "`plot'" != ""{ tw line 居民部门 非金融企业部门 政府部门 中央政府 /// 地方政府 实体经济部门 金融部门资产方 金融部门负债方 月份, /// lp(solid solid solid solid solid solid solid solid) /// lc("166 206 227" "031 120 180" "178 223 138" "051 160 044" "251 154 153" "227 026 028" "253 191 111" "255 127 000") xti(日期) /// note("数据来源:国家资产负债表研究中心(CNBS)") /// ti(中国各部门宏观杠杆率趋势) }end // end of program cmlrd
这里涉及了一些 Stata 编程的 Tips:
1.*!
是一种特殊的注释,当你运行 which cmlrd
查找 cmlrd
命令的时候,这些注释会同时被打印出来,例如:
which cmlrd/Users/czx/Library/Application Support/Stata/ado/personal/c/cmlrd.ado *!
自动获取和展示中国宏观杠杆率数据 *! 程振兴 2019年4月1日 *! 中国宏观杠杆率数据:http://114.115.232.154:8080/ *! 示例:cmlrd *! cmlrd, plot
2.qui
是 quietly
的缩写,可以隐藏程序运行过程中的输出信息;
3.cap
是 capture
的缩写,可以在运行出错的时候自动跳过该程序;
4.syntax [, plot]
里面 plot
是我设定的选项,用 syntax [, PLOT]
的效果也是一样的,大写部分表示可以缩写。如果我这里使用的是 syntax [, Plot]
,那就表明 plot
选项可以缩写为 p
。
使用 cmlrd
这个命令只有两个用法:
1.cmlrd
:获取数据但是不绘图;2.cmlrd, plot
:获取数据然后绘图。
全局使用 cmlrd
为了以后能够直接使用 cmlrd
命令,我们可以把这个 ado
文件放在系统文件夹里,运行下面的命令查看系统文件夹的位置:
sysdir
*> STATA: /Applications/Stata/
*> BASE: /Applications/Stata/ado/base/
*> SITE: /Applications/Stata/ado/site/
*> PLUS: /Users/czx/Library/Application Support/Stata/ado/plus/
*> PERSONAL: /Users/czx/Library/Application Support/Stata/ado/personal/
*> OLDPLACE: ~/ado/
推荐放在 PERSONAL
文件夹里。Windows 用户可以按 Win + R
键将 PERSONAL
的路径粘贴进去回车打开这个文件夹,Mac 用户可以直接运行下面的命令打开 PERSONAL
文件夹:
!open '/Users/czx/Library/Application Support/Stata/ado/personal/'
打开这个文件夹之后,把 cmlrd.ado
文件放在名为 c
的子文件夹里。Windows 用户也这样。
然后你就可以随时使用 cmlrd 命令了!
是不是觉得 Stata 也蛮有趣的!
References
[1]
中国宏观杠杆率数据: http://114.115.232.154:8080/