今天处理了wind数据,目标是统计各个行业杠杆率和资产负债率的75%分位点。
wind的企业可以分为两种,一种是上市企业,从发债信息表获得。另一种是上市企业,从上市信息表获得。
源表和结果表表示如下:
源表字段:表名、企业名称、行业、杠杆率、资产负债率。
结果表字段:来源表名、行业、计算指标、75分位点。
其中来源表可以是“上市表”或者“发债表”,计算指标可以是杠杆率/资产负债率。
1、indirect函数
在结果表中,如果要统计上市企业,则要从上市表取数;如果要统计发债企业,则要从发债表取数。
indirect函数可以把字符串转为地址。因此,假设在单元格B2中标记的是“上市”,用indirect(B2&)语法就可以实现从上市表取数。
这里补充一个例子,比如我们要计算A1:A4四个单元格的和,以下两种写法是等价的:
sum(A1:A4)
sum(indirect("A1:A4"))
第二种写法的好处是,字符串可以是动态的。
比如在B2、B3单元格分别录入A1、A4,那么就可以写成:
sum(indirect(B2&B3))
假如后来我们要计算A1:A100单元格的和,只需要将B3改成A100。
sum(indirect(B2 &":"& B3))就会自动计算A1:A100的和。
再自动化一点,甚至可以将B3的取值取决于A列的长度,具体不表。
2、column函数、address函数、substitute函数
除了想要知道来源表之外,我们还需要定位“杠杆率”在源表中的哪一列。
假设发债企业的杠杆率在C列。用
vlookup(杠杆率,发债表)
语法可以找到杠杆率所在位置,然后用
column(vlookup结果) ----备注:column函数会将vlookup结果视为一个地址。
得到数字3。
为了表示地址,address函数可以实现数字到字母的转换。(备注:如果后面用R1C1的方式表示地址,不需要转换)。
address函数本质上是将输入的row、column转换为地址,例如address(1,3)得到C1。
substitute函数则是实现文本替换,不表。
3、percentile函数、offset函数
percentile函数可以计算数组中的任意分位点,语法是:
percentile(数组,分位点)
数组可以用offset函数或者indirect函数来选取,语法是:
offset(起始点,偏移行,偏移列,选取行,选取列)
indirect(起始点,结束点)
比如要取C3:C103:
offset(C1,2,0,100,[])
----注意这里列如果[]处写了1,取到的是二维数组,percentile需要的是一维数组
indirect(B2 &":"&B3)
----假设在B2、B3录入C3、C100两个值
最后补充一句,percentile计算分位点的时候,会忽略空值和字符串。因此如果源表中有空值,不需要剔除。
4、filter函数、ctrl+\、高级筛选
filter可以将一个多维数组,按条件筛选输出一个多维数组。
ctrl+\可以查找两列的差异值,仅限数值。
如果被判定的列填写的是公式,两列计算结果相同,但是文本不一样,也会被判定是差异。
高级筛选的使用待研究。
5、vlookup/xlookup
vlookup一般是处理单个条件的查询,如果有多个条件:
(1)内嵌if函数,待验证。
(2)两列合并成一列,作为查询条件。
总结
前面解释显得比较啰嗦,决定重新讲解一次思路框架。
在数据处理的时候,汇总结果往往要从多个结构相似的源表进行取数和加工。
比如有A、B、C三个班学生的各科成绩,要在汇总表中统计各班男生的数学平均分、标准差等指标,可以分为三个步骤解决:
1、定位表:假设要统计A班的成绩,用indirect(A表)实现从A表取数。
2、定位列:假设A班的数学成绩在A表的D列,用match、vlookup/xlookup、index、offset这类函数可以实现列的定位。
3、定位行:假设A班男生D20-D70行,先用match、vlookup/xlookup、index、offset这类函数定位男生所在行,然后用indirect函数取数。
其他:column、row、address函数用于地址和字符串的转换。substitute可以做文本处理。
总结の总结
本质上这是一个动态取数的问题,动态体现再两个方面,一是根据我们想要统计的对象(比如是A班、数学)进行取数,体现为表、列的动态;二是根据我们想要的数据(所有男生)进行取数,体现为行的动态。
两者的区别是,表、列的取数仅与我们的目标有关,行的取数与原表中男生所在行有关,是目标和数据共同决定的。
1、汇总时,根据统计对象是A班、B班或C班,从不同的源表中取数。
2、取数时,识别统计学科,从源表相应的列取数。
3、取数时,根据源表中男生所在行,从源表相应的行取数。
用SQL语句可以表示为:
SELECT 列 FROM 表 WHERE 行