实例下载:https://pan.baidu.com/s/1JgsIR58ZcvxNrLlPtezy3A
提取码:s6ee
在工作中我们经常会遇到合并多个数据表的情况,比如多个历史时期数据表的合并,多个分公司报表的汇总,当数量不多时,我们可以依次打开各个数据表,手动复制粘贴至一张表中,但如果涉及到的数据表太多时,这个方法就行不通了,或者说过于繁琐,比如说有时候刚整理好各月工资,又需要整理各月奖金,那么之前进行的所有步骤又需要再做一遍了。当这样的重复性工作我们做了好多年之后,就应该考虑其他的方法了,我们需要在不打开文件的情况下提取其中的数据,把人从繁琐的数据整理工作中解放出来。
那么怎么办呢?过去我曾尝试通过VBA编程提取数据,对于结构完全一致的报表这个方法是行得通的,但是这里有一个问题,由于制表人不同或者表结构变化等原因,每张表中的同一个数据可能并不在同一个位置,比如说有的表里工资在单元格B2,有的表里可能在B3,或者C2,或者其他什么地方,有时候发给分公司的工整的报表,收上来的时候却变得花花绿绿的,有的甚至面目全非,填表人会随意地删行、加行、删列、加列、调整行列顺序、合并单元格、修改单元格格式,等等,不一而足,原因是他那里有特殊情况,或者为了方便填报等,但是无规矩不成方圆,随意更改表结构方便了填表人,却给数据整理工作带来了大麻烦,需要汇总整理的数据表必须严格限定报表格式,最好是在下发报表的时候就锁定表结构,但是我们不能指望每一个报表设计者都会锁定操作,或者数据表的汇总者和设计者不是同一个人,汇总人收到各张报表的时候发现表结构已经不一致了,这个时候,VBA也是无可奈何的。
这时候,我们可以用Excel插件power query解决这个问题。PQ是微软公司的商务智能Power BI工具之一,它和power pivot构成了PBI的核心,它的操作原理和语法类似于SQL语言和OLEDB数据连接,但使用起来更加灵活简单,是面向普通的数据工作者的大众化BI工具,不需要编写太多复杂繁琐的代码,就可以轻松实现数据汇总分析。PQ是一种入门级的大数据分析工具,我认为以后会是数据工作者必备的技能之一,就像现在的Excel一样基础。
在这篇文章中我以一个例子通俗易懂地介绍一下用PQ进行数据表合并的一般思路和操作过程。
问题的提出:
假如我们需要整理北京市各市区社会消费品零售额的历史数据,现在有2007年2月-2019年6月的100多张数据表(数据来源:北京市统计局),我们对比一下第一期和最后一期报表的表结构:
总结一下2019年6月期报表中表结构的几处变化:
- 从行来看,
1.1 表头由两行变为一行;
1.2 取消了四大功能区;
1.3 "亦庄开发区"更名为"北京经济技术开发区";
1.4 崇文区、宣武区分别合并到东城区、西城区;
1.5 密云、延庆两县撤县设区;
1.6 门头沟区位置提前;
1.7 市区名称前加上了空格; - 从列来看,第2、3列数据互换位置,从
“本月、累计、本月增速、累计增速”变成了
“本月、本月增速、累计、累计增速”。
由于表结构的变化,所有数据的位置均发生了改变,用VBA取固定位置的数据显然不可取,而用PQ,可以分步实现数据汇总。
第一步:获取数据源
数据源表首先需要整理出“数据源表”,这张表里列出了各个数据表的基本情况,需要说明几点:
- 一共有138个excel文件,统一存放在“根目录\数据源”文件夹中,根目录根据存放路径自动调整,比如我现在用的根目录是:
PQ会自动从
“F:\20190810合并数据表\数据源\200702.xlsx”
“F:\20190810合并数据表\数据源\200703.xlsx”
等文件中取数,而下载压缩包后可解压存在任一地址,比如放在“D:\PQ练习\合并数据表”中,PQ就会自动从
“D:\PQ练习\合并数据表\数据源\200702.xlsx”
“D:\PQ练习\合并数据表\数据源\200703.xlsx”
等文件中取数,不用手动修改。
- 在十多年的时间里,报表结构经过了多次变化,二维表的表结构包括主栏(甲栏)、宾栏(乙栏、表头)两个方面,数据源表中列出了每一个excel文件中报表的甲栏版本和宾栏版本,这需要用户自己去总结,PQ就是根据文件位置和甲栏、宾栏版本去各个文件中的特定单元格取数。
(关于主栏、宾栏的介绍,可参考《二维表的主栏、宾栏》)
第二步:获取表头行数
从2013年2月开始,数据表的表头由两行变为了一行,先总结出各甲栏版本的表头行数,然后让各excel文件自动查找对应的表头行数信息,实现原理类似于excel工作表函数vlookup。
这一步是为了便于理解接下来的处理过程,当PQ熟练以后可省略这一步。
第三步:批处理表格——二维表转一维表
这是数据汇总的最关键一步:维度转换,要想把不同结构的数据表汇总在一起,所需要做的不是简单的表格的拼接(追加),因为不同时期的报表中各行、各列意义不同,比如下面这两张表拼接在一起就出错了,因为后一张表的第2、3列数据互换了位置,这时候需要先把二维表统一转化为一维表,再进行各张表行、列的规范化。
简单拼接出错首先需要去掉表结构区域,仅保留数据区域。2007年2月报表需要去掉第一列和前两行,2019年6月报表需要去掉第一列和第一行,这时候步骤二中的表头行数就派上了用场(不过在熟练以后其实这一步可省略,不影响结果)。
去掉表结构,仅保留数据区域二维表转一维表所用的方法叫做“逆透视”,也就是把多行、多列的数据转化为一列,道理很简单,把横向放置的数据转置,竖向排列在一起就可以了,excel中进行此项操作较麻烦,在PQ中可以很方便地进行逆透视操作。
逆透视PQ中可以对多个数据表进行批量操作,批量逆透视之后的结果是:
逆透视结果这时候就可以对不同时期的报表进行拼接(追加)了。
第四步:展开(拼接)报表
这一步很简单,把规范化之后的二维表拼接在一起就可以了。
展开报表但是对于表中的每个数据我们还不知道是什么意思,所以下一步需要进行甲栏(行号)和宾栏(列号)的转换(规范化)。
第五步:规范甲栏(行号)
规范甲栏和宾栏首先需要有规范依据,以甲栏为例,需要整理出各个甲栏版本间的对应关系,经整理发现甲栏版本共有6次调整,共有7个版本,每一次调整都有一定的原因:
甲栏规范表需要注意的是,整理表结构需要以最新一版为准,比如密云县、延庆县已撤县设区,所以历史汇总数据中统一称密云区、延庆区,同理不再保留老东城、老西城、崇文、宣武区数据,因为人们已经不再关注这些数据了,如果需要的话可以另行添加。关于规范表中整理相关问题请参考另一篇文章。
对甲栏规范表进行二维表转一维表操作,可得到如下报表:
二维表转一维表以此为依据可以对第四步展开的报表中的行号进行规范化整理,比如甲栏版本1-5的第3行是北京市数据,而版本6和7的第2行是北京市数据,版本2的第28行是东城区数据,版本7的第3行是东城区数据,版本1的第4行是“首都功能核心区”数据,最新版中已不再保留,所以在转化结果就顺便把它去掉了。
规范甲栏/行号(市区)甲栏规范化之后,甲栏版本列也就没用了,可以删除。规范化过程用到的方法叫做“合并查询”,类似于excel工作表函数vlookup,但好处是可以设置多个查询依据(多列),其实就是关系型数据库中所说的主键,只有同时指定“甲栏版本”和“行号”才能确定唯一的“市区”,可以理解为一个二元函数,f(x1,x2)由x1、x2共同决定的,两个条件缺一不可。
第六步:规范宾栏(列号)
同理可对宾栏进行规范化转换,转换后的结果是:
规范宾栏/列号需要注意的是,宾栏中包含着4个属性,比如2019年6月报表的第2列数据,它表示:
2019年当年(属性3)的2月当月(属性2)的社会消费品零售额(属性1)的绝对值(属性4)数据,
而第4列表示:
2019年当年(属性3)的2月累计(属性2)的社会消费品零售额(属性1)的绝对值(属性4)数据。
对于数据的某些属性,我们在特定情况下可以省略说明,比如这个例子中的所有数据都是关于“社会消费品零售额”这个指标的,用户都知道,所以这个属性可以省略,可以把文件名命名为“社会消费品零售额历史数据”就可以了,用户就知道这个文件里面的所有数据都是关于这个指标的,这就是所谓数据的“上下文context”。
但是你不能把文件命名为“海淀区社零额”,因为这里面有非海淀区的数据,但是可以命名为“北京市各区数据”、“北京市各区历史数据”等,从这里也可以看出,数据表的文件名就是其中所有数据的一个或几个共同的属性名。
关于宾栏整理过程中的问题可以参考另一篇文章。
在甲栏和宾栏的规范化操作中,包含着模式分解和数据清洗的过程,这都是数据整理和数据库搭建必不可少的环节,具体可以参考另一篇文章。
第七步:单位转换
在对甲栏、宾栏规范化转换以后其实数据汇总表已经基本做好了,但还有一个重要的问题需要解决:整理各期数据表发现有的时期数据单位是万元,有的时期是亿元,必须统一起来。
单位乘数规则很简单,对于“增速”数据不用处理,“绝对值”数据中最近5年的年末数据因为比较大,当期报表中使用了亿元单位,不用处理,其他时期的绝对值都是万元单位,统一乘以0.0001转换为亿元单位。转换之后的结果是:
单位转换之后数据分析
一维表是数据分析的基础,当得到历史数据的一维表之后,就可以进行各类透视,然后可进行相应数据分析,透视操作用PQ或数据透视表都可以,比如对“度量”透视得到如下结果:
透视“度量”继续透视“数期”得到:
透视“数期”透视“市区”得到:
透视“市区”可以看出,我们平时看到的大部分数据表都是一种数据透视表,透视表是对抽象事物和数据的特征的高度概括和呈现,通过序列数据的对比,使人们很容易抓住同类事物的本质和特征,例如,通过时间序列数据对比可总结出事物的变化规律,通过空间序列数据对比可概括出事物分布规律,通过时空数据对比可抓住事物的薄弱点、突破口、差距所在,更好地促进整体发展。
在数据分析报告中,透视表比单纯的文字描述效果要好得多,很多所谓的数据分析报告就是对透视表的文字描述,比如某某指标实现了多少、增长了多少、占比是多少之类,几大段乱七八糟的文字可能还不如一张表讲得清楚,因此说一表胜千言,而进一步讲,数据图又比数据表的表现能力更好,因此还有人说文不如表,表不如图,确实如此。在数据透视表的基础上,可以在excel中制作数据图,而用微软PBI的组件power view、百度ECharts等工具可实现更多更丰富的数据图表展现形式。
网友评论