转换 数据整理
数据向量的关键工具之一是转换。数据向量帮助用户将数据集从一个概要映射到另一个概要,并提供一个操作列表来转换类型,格式化数据,把一个2D数据集转换成系列数据。
构建一个转换过程
一个转换过程需要一个概要来成功地转换数据。概要和转换过程类都附带一个帮助构建器类,对于组织代码和避免复杂的构建器来说是很有用的。当两者结合起来它们看起来像如下的样例代码。请注意inputDataSchema是如何传到Builder构造器的。没有它,你的转换过程将会编译失败。
Copy import org . datavec . api . transform . TransformProcess ;
TransformProcess tp = new TransformProcess . Builder (inputDataSchema)
. removeColumns ( "CustomerID" , "MerchantID" )
.filter(new ConditionFilter(new CategoricalColumnCondition("MerchantCountryCode", ConditionOp.NotInSet, new HashSet<>(Arrays.asList("USA","CAN")))))
. conditionalReplaceValueTransform (
"TransactionAmountUSD" , //被操作的列
new DoubleWritable( 0.0 ) , //如果条件满足,用新的值
new DoubleColumnCondition( "TransactionAmountUSD" , ConditionOp . LessThan , 0.0 ) ) //条件: amount < 0.0
. stringToTimeTransform ( "DateTimeString" , "YYYY-MM-DD HH:mm:ss.SSS" , DateTimeZone . UTC )
. renameColumn ( "DateTimeString" , "DateTime" )
.transform(new DeriveColumnsFromTimeTransform.Builder("DateTime").addIntegerDerivedColumn("HourOfDay", DateTimeFieldType.hourOfDay()).build())
. removeColumns ( "DateTime" )
. build ();
执行一个转换
现在有不同的执行器后台可以使用。使用上面的转换过程对象tp,这里是你如何用一个数据向量在本地执行它。
Copy import org . datavec . local . transforms . LocalTransformExecutor ;
List < List < Writable >> processedData = LocalTransformExecutor . execute (originalData , tp);
调式
在概要发生变化的时候在一个转换过程中的每个操作代表一个步骤。有时候,转换的结果不是预期想要的。你可以按如下通过打印转换过程对象tp中每个步骤调试这它。
Copy //Now, print the schema after each time step:
int numActions = tp . getActionList () . size ();
for ( int i = 0 ; i < numActions; i ++ ){
System . out . println ( "\n\n==================================================" );
System . out . println ( "-- Schema after step " + i + " (" + tp . getActionList () . get (i) + ") --" );
System . out . println ( tp . getSchemaAfterStep (i));
}
可用的转换和变换