旧版本|上市公司与绿色专利数据匹配结果(1992~2019 年)

之前我们分享过上市公司和专利匹配结果数据:

×

今天我们一起来看一下如何根据 WIPO 绿色专利分类范围清单从里面筛选绿色专利数据。

在之前的课程中我们讲解了如何爬取和处理 WIPO 绿色专利分类标准数据:

×

经过爬取之后得到了四个数据文件:

  • ipcdf1.dta:只有大类的;
  • ipcdf2.dta:只有大类小类的;
  • ipcdf3.dta:没有范围的;
  • ipcdf4.dta:有范围的。

因此绿色专利的筛选就是根据主分类号或者分类号和上面的数据进行匹配。

根据主分类号筛选

首先需要处理下专利的主分类号,因为里面含有年份,所以需要提取 “(” 之前的内容,可以使用正则表达式:

use 上市公司与专利数据匹配结果.dta, clear
replace 主分类号 = ustrregexs(1) if ustrregexm(主分类号, "(.*)(\(+)")
save 上市公司与专利数据匹配结果.dta, replace

ipcdf1 数据是这样的:

也就是分类号大组是 B61 和 G21 的都是绿色专利。

在 上市公司与专利数据匹配结果.dta 数据中提取主分类号的前 3 位生成 class 变量和 ipcdf1 匹配即可:

use 上市公司与专利数据匹配结果.dta, clear
gen class = substr(主分类号, 1, 3)
merge m:1 class using ipcdf1.dta
keep if _m == 3
drop _m
save data1, replace

ipcdf2 数据是这样的:

由于其中存在重复的 class(同时属于两种绿色类别的专利分类),所以这个时候就不好使用 merge 命令直接进行匹配了,因此我先把 ipcdf2 数据拆分开,然后分别和专利数据匹配:

use ipcdf2.dta, clear
bysort class: gen matchid = _n
tab matchid
preserve
keep if matchid == 1
save ipcdf2a, replace
restore
keep if matchid == 2
save ipcdf2b, replace

use 上市公司与专利数据匹配结果.dta, clear
gen class = substr(主分类号, 1, 4)
merge m:1 class using ipcdf2a.dta
keep if _m == 3
drop _m
save data2a, replace

use 上市公司与专利数据匹配结果.dta, clear
gen class = substr(主分类号, 1, 4)
merge m:1 class using ipcdf2b.dta
keep if _m == 3
drop _m
save data2b, replace

ipcdf3 数据是这样的:

ipcdf4 数据结果也类似,因此可以合并起来处理,不过合并后的数据同样也存在重复问题,因此也需要进行拆分:

use ipcdf3.dta, clear
append using ipcdf4.dta
gen 主分类号 = class + IPC
bysort 主分类号: gen matchid = _n
tab matchid
forval i = 1/4 {
preserve
keep if matchid == `i'
save ipcdf34_`i', replace
restore
}

再分别和专利数据匹配即可:

forval i = 1/4 {
use 上市公司与专利数据匹配结果.dta, clear
compress
merge m:1 主分类号 using ipcdf34_`i'.dta
keep if _m == 3
drop _m
save data34_`i', replace
}

最后我们再把上面三次匹配的结果合并起来就得到了所有的上市公司绿色专利数据:

* 合并所有的结果
use data34_1, clear
forval i = 2/4 {
append using data34_`i'
}
append using data2a
append using data2b
append using data1
drop matchid
duplicates drop _all, force
save 上市公司绿色专利匹配结果(根据主分类号筛选).dta, replace

根据分类号筛选

分类号变量中每个专利包含多个 IPC 分类号,因此需要预先分离开:

use 上市公司与专利数据匹配结果.dta, clear
split 分类号, parse(";")
gen patentid = _n
ren 分类号 分类号_orign
save tempa, replace

* 通过循环转成长数据
use tempa, clear
keep patentid 年份 - 摘要附图存储路径 分类号_orign 分类号1
ren 分类号1 分类号
save tempa2, replace

forval i = 2/55{
use tempa, clear
keep patentid 年份 - 摘要附图存储路径 分类号_orign 分类号`i'
ren 分类号`i' 分类号
append using tempa2
drop if missing(分类号)
save tempa2, replace
}
use tempa2, clear
replace 分类号 = ustrregexs(1) if ustrregexm(分类号, "(.*)(\(+)")
save tempa2, replace

然后就可以和上面类似的方法进行绿色专利筛选了:

* 根据分类号筛选绿色专利
use tempa2, clear
gen class = substr(分类号, 1, 3)
merge m:1 class using ipcdf1.dta
keep if _m == 3
drop _m
save adata1, replace

use tempa2, clear
gen class = substr(分类号, 1, 4)
merge m:1 class using ipcdf2a.dta
keep if _m == 3
drop _m
save adata2a, replace

use tempa2, clear
gen class = substr(分类号, 1, 4)
merge m:1 class using ipcdf2b.dta
keep if _m == 3
drop _m
save adata2b, replace

forval i = 1/4 {
use ipcdf34_`i'.dta, clear
ren 主分类号 分类号
save aipcdf34_`i'.dta, replace
}

forval i = 1/4 {
use tempa2, clear
compress
merge m:1 分类号 using aipcdf34_`i'.dta
keep if _m == 3
drop _m
save adata34_`i', replace
}

use adata34_1, clear
forval i = 2/4 {
append using adata34_`i'
}
append using adata2a
append using adata2b
append using adata1
drop matchid patentid 分类号
ren 分类号_orign 分类号
duplicates drop _all, force
save 上市公司绿色专利匹配结果(根据分类号筛选).dta, replace

统计绿色专利的数量

数据的汇总可以使用 collapse 命令:

use 上市公司绿色专利匹配结果(根据主分类号筛选).dta, clear
collapse (count) zlid, by(股票代码 年份 专利类型)
spread 专利类型 zlid
replace 发明型专利 = 0 if missing(发明型专利)
replace 实用型专利 = 0 if missing(实用型专利)
gen 总绿色专利数量_根据主分类号筛选 = 发明型专利 + 实用型专利
ren 实用型专利 实用型绿色专利_根据主分类号筛选
ren 发明型专利 发明型绿色专利_根据主分类号筛选
destring 股票代码, replace
save data1, replace

use 上市公司绿色专利匹配结果(根据分类号筛选).dta, clear
collapse (count) zlid, by(股票代码 年份 专利类型)
spread 专利类型 zlid
replace 发明型专利 = 0 if missing(发明型专利)
replace 实用型专利 = 0 if missing(实用型专利)
gen 总绿色专利数量_根据分类号筛选 = 发明型专利 + 实用型专利
ren 实用型专利 实用型绿色专利_根据分类号筛选
ren 发明型专利 发明型绿色专利_根据分类号筛选
destring 股票代码, replace
save data2, replace

然后再和 上市公司专利申请数量面板数据(1992~2019).dta 数据匹配起来:

use 上市公司专利申请数量面板数据(1992~2019).dta, clear
merge 1:1 股票代码 年份 using data1
drop _m
merge 1:1 股票代码 年份 using data2
drop _m
foreach i of varlist 发明型绿色专利_根据主分类号筛选 - 总绿色专利数量_根据分类号筛选 {
replace `i' = 0 if missing(`i')
}
order 年份 股票代码 设计型专利 - 总专利数量 发明型绿色专利_根据主分类号筛选 - 总绿色专利数量_根据分类号筛选
label data "数据处理:微信公众号 RStata"
save 上市公司专利申请数量及绿色专利申请数量面板数据(1992~2019).dta

绘图展示

最后我们再绘图展示下根据主分类号筛选和根据分类号筛选的结果。

根据主分类号筛选的:

use 上市公司专利申请数量及绿色专利申请数量面板数据(1992~2019).dta, clear
collapse (sum) 发明型专利 (sum) 实用型专利 (sum) 总专利数量 ///
(sum) 发明型绿色专利_根据主分类号筛选 (sum) 实用型绿色专利_根据主分类号筛选 ///
(sum) 总绿色专利数量_根据主分类号筛选 (sum) 发明型绿色专利_根据分类号筛选 ///
(sum) 实用型绿色专利_根据分类号筛选 (sum) 总绿色专利数量_根据分类号筛选, by(年份)
save zldata20230131, replace

* 安装附件中的 rstata_scheme 主题
* lightrstata 主题
set scheme lightrstata, perm
use zldata20230131, clear

ren 年份 year
gen year1 = year - 0.2
gen year2 = year + 0.2

tw bar 发明型专利 year1, barwidth(0.4) || ///
bar 发明型绿色专利_根据主分类号筛选 year1, barwidth(0.4) || ///
bar 实用型专利 year2, barwidth(0.4) || ///
bar 实用型绿色专利_根据主分类号筛选 year2, barwidth(0.4) || ///
line 总专利数量 year || ///
line 总绿色专利数量_根据主分类号筛选 year ||, ///
leg(order(1 "发明型专利" 2 "发明型绿色专利(根据主分类号筛选)" ///
3 "实用型专利" 4 "实用型绿色专利(根据主分类号筛选)" ///
5 "总专利数量" 6 "总绿色专利数量(根据主分类号筛选)") ///
pos(11) ring(0) row(3)) ///
xla(1992(1)2019, ang(90)) ///
ti("1992~2019 年上市公司与绿色专利数据匹配情况(根据主分类号筛选)", size(*0.8)) ///
subti("由于专利数据库后面年份的不是很全,2017 年及之后年份的数据需要谨慎使用。", size(*0.8)) ///
caption("数据来源:上市公司数据来源于和讯网,专利数据来源于国家知识产权局,绿色专利分类标准来自 WIPO。")

gr export pic1.png, replace width(2400)

根据分类号筛选的结果:

tw bar 发明型专利 year1, barwidth(0.4) || ///
bar 发明型绿色专利_根据分类号筛选 year1, barwidth(0.4) || ///
bar 实用型专利 year2, barwidth(0.4) || ///
bar 实用型绿色专利_根据分类号筛选 year2, barwidth(0.4) || ///
line 总专利数量 year || ///
line 总绿色专利数量_根据分类号筛选 year ||, ///
leg(order(1 "发明型专利" 2 "发明型绿色专利(根据分类号筛选)" ///
3 "实用型专利" 4 "实用型绿色专利(根据分类号筛选)" ///
5 "总专利数量" 6 "总绿色专利数量(根据分类号筛选)") ///
pos(11) ring(0) row(3)) ///
xla(1992(1)2019, ang(90)) ///
ti("1992~2019 年上市公司与绿色专利数据匹配情况(根据分类号筛选)", size(*0.8)) ///
subti("由于专利数据库后面年份的不是很全,2017 年及之后年份的数据需要谨慎使用。", size(*0.8)) ///
caption("数据来源:上市公司数据来源于和讯网,专利数据来源于国家知识产权局,绿色专利分类标准来自 WIPO。")

gr export pic2.png, replace width(2400)

由于推文空间有限,难以逐句介绍代码的作用,对绿色专利筛选感兴趣的小伙伴可以学习这个课程(有视频讲解):

×

点击这里跳转到 RStata 短书平台获取附件:旧版本|上市公司与绿色专利数据匹配结果(1992~2019 年)

评论