问题的提出
在平时整理统计数据的过程中,我们经常会遇到不同的报表单位不一致的情况,原因是不同制表人的习惯不同,同一个制表人不同时期时的习惯也不同,就拿GDP数据来说,去年我们觉得亿元好看,今年可能就觉得万亿元看起来更简练。这就给我们整理数据的工作带来了难题,应该怎样把不同报表的同一个指标数据的单位规范起来呢?
假设我们已经整理好了一张数据合并表作为这个例子的数据源:
数据源:近三年中国主要经济社会指标不同时期数据的单位不同,我们想要根据下面这张“单位转换表”把其中的数据单位规范起来:
单位转换表我们可以用微软的Power BI工具中的power query组件来解决。
Power BI工具在office2016及以上版本中已经集成,可以直接使用,也可以下载独立的Power BI软件来使用,即使电脑上没有安装office软件也可以用Power BI来处理数据。
一开始我考虑用合并查询来解决,但是合并查询要求两张表中的字段完全相等,而这张单位转换表中用到了“其他”,2017年份的GDP数据的单位乘数是0.0001,其他年份是1,2017年份的人口数据的单位乘数是1,其他年份是0.0001,还要求把所有年份的经济增速变成以百分比显示,也就是把源数据乘以0.01,这样的情况下用合并查询是不行了。
经过多日的思考,我决定用筛选“单位转换表”的方法来达到查询的目的。
1. 查询
_1查询 = Table.AddColumn(数据源, "单位乘数", each let
_1 = Table.SelectRows(单位转换表,
(x)=>(x[年度]=[年度] or x[年度]="其他") and
(x[指标]=[指标] or x[指标]="其他")),
_2 = Table.First(_1, [单位乘数=0.01, 规范单位=null])
in _2),
这段代码的意思是根据数据源表中每一行的[年度]和[指标]值去单位转换表中筛选符合条件的行,因为2018、2019年都属于“其他”的情况,所以这里要把“其他”行筛选出来,代码中[年度]、[指标]分别代表数据源表中每一行相应的字段值,(x)代表单位转换表中的每一行,x[年度]、x[指标]分别代表单位转换表中该行相应的字段值。
其中,“_2”步的意思是当在“单位转换表”中找不到符合条件的行时,给予一个缺省的乘数0.01,就是把原来的一位小数的增速6.9、6.7、6.1(单位:%)分别乘以0.01,让它们变成0.069、0.067、0.061,而变换之后的数据是没有单位的(null)。
2. 展开
第二步是展开查询到的“单位转换表”,情况如下:
筛选查询结果这一步可以通过窗口操作完成。
3. 进行计算
_3计算 = Table.CombineColumns(
_2展开, {"单位", "单位乘数", "值"}, each
List.Product(List.LastN(_,2)),
"值")
这里用到了Table.CombineColumns函数,这个函数可以合并表中的多列,_ 代表着{"单位", "单位乘数", "值"}这个list,List.LastN(_,2)是取它的后两个元素,而第一个元素“单位”也就是原来的单位可以不要了,List.Product是进行连乘,合并后的列仍然命名为“值”。(关于Table.CombineColumns函数我曾在知乎写过一篇介绍文章《Power Query列运算的几种方法比较》可以参考)
这样,就对不同来源数据的单位进行了规范化。
规范数据单位实例下载:
链接:https://pan.baidu.com/s/1NQNS_QtTLNWLqQzSQZHucw
提取码:1ey7
网友评论