原文地址https://knowledge.safe.com/articles/19645/tutorial-manipulation-of-tabular-data.html
这篇文章介绍了一些用FME操作表格数据的不同工具。它包括:转置表格(transposing),汇总统计和总量(summary statistics and totals),数据透视表(pivot tables)和交叉表(crosstab)。这些操作在电子表格中经常被用到。比如Excel。
如果你的目标格式是Microsoft Excel,那么你可能想要利用FME的Excel写文件功能来写到一个模板文件里面。模板文件一般包含预定义的透视表、图表、命名范围等。参考Excel的读/写教程。下列例子中的工作空间(原文作者给出):
pivot-attributepivoter2015.fmwt
pivot-statisticscalculator2015.fmwt
一、 操作表格数据
提到表格操作,我们常常会想到电子表格内的数据,比如Excel。但是,我们还可以对Microsoft Access表,CSV,或者其他的表格或数据库中的数据进行这些操作。通常的操作为:
Transpose(转置):调换表格的行和列——有时称为表旋转。
Summary Statistics(汇总统计):统计表格数据的总量和平均量。
Pivot(透视表):也称作交叉表。透视表通常用于分析分类数据集。
1、 转置表格
转置一个表格也就是将表格的列转换到行——在大部分情况下,不需要其他的数据操作或者统计汇总。比如:
在FME中,结合AttributeExploder和Aggregator两个转换器就可以达到转置的效果。转换器AttributeExploder会将标题名和值转换到一行,并且对每一个属性值,按照标题名/值对的方式将标题名和值构建成一个一个的要素。通过合并这些要素,你可以重新组建这个表的列,使之变成行。
比如说,如果你的表格有两条记录:
下面列出了将Excel表格进行转置的简单工作空间:
下列是此工作空间的关键点:
AttributeExploder:设置Exploding Type: Feature. 则从原始表的两条记录中创建了六条新的记录。每个新的要素都由原始单元格的标题名/值对生成。如下所示:
其中,“标题名”代表列或者属性名(_attr_name),“值”代表属性值或者单元格的值(_attr_value)。
Aggregator:重建标题名/值对成三条新的记录。设置Group By 为 _attr_name. 在Attribute Accumulation设置List Name为attrs。则列表attrs{}就有要素:
聚合的输出是一个新的要素,这个要素(一行)的值就是原始表格的列,它的列表属性 _attr{} 包含了初始表格的列值。
如何将这个列表映射到输出?对Microsoft Excel来说,最简单的输出方法就是,用AttributeCreator或者AttributeRenamer去重命名属性名:A,B,C等等。
更为复杂的是,如何将行按照正确的顺序写出。转换器AttributeExploder会打乱属性值的顺序,我们可以用转换器Sorter对转置表格的行进行排序。
最终,就可以获得原始表格的转置表格。
第二个转置表格的例子——例:transposeadvanced.fmwt用了上面例子相同的原理。在这个工作流里面,复杂的部分就是使得要素——header、data、totals以正确的顺序输出。上述工作空间的每个转换器都加上了注释,以便读者理解各个部分的作用。
2、 汇总表格——统计
你可以利用转换器StatisticsCalculator完成简单的数据统计。转换器StatisticsCalculator可以用来生成渐进的和对一系列的要素。参考文章:Calculating a Running Total or Cumulative Sum. 想要了解更多StatisticsCalculator 的细节,可以查阅FME Transformer Help.
转换器Aggregator 也可以用于完成简单的数据统计。如果要素有几何形状,可以用转换器Aggregator计算加权平均值。
二、 透视表或交叉表
当制作透视表或交叉表时,转换器AttributePivoter应该会是你的第一选择。这实际上允许你,像在Excel里面创建透视表一样,在FME里面创建透视表。
转换器StatisticsCalculator能够对要素组(groups)作统计——可以用此创建透视表。
1、 用Microsoft Excel创建透视表
下面是Excel电子表格和透视表的一个例子,在pivot_attributepivoter.fmwt的模板中,附上了这个Excel表格。
上面是原始Excel表格和透视表的示例。
如果你的输出格式是Excel,那么你可能想要应用FME的Excel写文件写出结果。
下面的章节介绍了如何用FME达到透视的效果。
2、 用转换器AttributePivoter生成透视表
在制作透视表或者交叉表的时候,应用AttributePivoter不失为一个好的选择。使用AttributePivoter比StatisticsCalculater在某些方面有更大的优势。
转换器AttributePivoter可以自动生成统计结果。同时,在创建透视表的时候,有时很难预测输出数据的格式。当你创建透视表的时候,会生成新的属性列,比如说上例中的“Average of observed”,AttributePivoter增加了动态属性,使得写出透视表变得更加容易。
转换器AttributePivoter的一个缺点就是,在现有的FME版本中,你只能对其中的一个属性作此应用。如果你想要对更多的属性作分析,那你可能需要考虑StatisticsCalculator方法——阅读下个章节。
使用AttributePivoter的一个工作空间的例子如下:
上面是转换器AttributePivoter生成透视表的过程,示例请下载pivot_attributepivoter.fmwt.
想要了解AttributePivoter的各项配置,请参阅转换器文档。在上面的例子中,被透视的属性为“observed”。数据是由“region”和“potential”作分组属性的。行分组的顺序是很重要的,因为这会影响到Summaries是如何被创建的。“Group Rows By”属性顺序是由“Select Group Rows By Items”的图框窗口决定的:
显示结果如下(高亮部分为手动添加):
你还可以使用“Group Columns By”参数去创建更深层次的列透视,在这个例子里面,使用“potential”属性,得到结果:
3、 用StatisticsCalculator创建透视表
下面的工作空间通过按照属性“region”和“potential”分组,对属性“observed”作StatisticsCalculator统计。则新的统计要素按照“region”和“potential”排序,然后输出到一个CSV文件里面。输出的CSV文件跟Excel透视表有相同的属性和值。
上面的模板可从pivot_statisticscalculator2015.fmwt下载。
在上面的工作空间中,使用了两个StatisticsCalculator。第一个StatisticsCalculator对每一个“region”和“potential”生成统计量,第二个StatisticsCalculator对所有的数据统计总量。如果对“potential”属性作小计,需要第三个StatisticsCalculator。运行结果如下:
复杂的部分就是输出要素的顺序,以及输出数据的格式。
4、 转换器AttributePivoter VS 转换器StatisticsCalculator
AttributePivoter和StatisticsCalculator两个方法,你会使用哪一个?
首先说一说AttributePivoter的优点:
两个或者更多的StatisticsCalculator才能完成的任务,一个AttributePivoter就可以完成。
作总量统计时,你可以用AttributePivoter自动创建,而用StatisticsCalculator,你需要对每一个层级的总量作统计。
按照你的要求生成格式,使得输出变得更容易。
行的顺序可以保持下来,如果使用StatisticsCalculator,你需要自己进行排序。
AttributePivoter最主要的缺点就是,在现有的FME版本中(2015及以前),AttributePivoter只能对一个属性生成统计量。所以,如果你想要对更多的属性进行统计,你需要转换到更复杂,但是更通用的StatisticsCalculator方法上来。
然而,如果你的输出格式为Microsoft Excel,那么你可以考虑使用Excel写文件加上一个模板文件来构建透视表,这个方法会在FME和Excel中得到更好的结果。