`
bewithme
  • 浏览: 423287 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

DataVec/转换-1

    博客分类:
  • dl4j
阅读更多

数据转换

     数据向量的关键工具之一是转换。数据向量帮助用户将数据集从一个概要映射到另一个概要,并提供一个操作列表来转换类型,格式化数据,把一个2D数据集转换成系列数据。

 

构建一个转换过程

     一个转换过程需要一个概要来成功地转换数据。概要和转换过程类都附带一个帮助构建器类,对于组织代码和避免复杂的构建器来说是很有用的。当两者结合起来它们看起来像如下的样例代码。请注意inputDataSchema是如何传到Builder构造器的。没有它,你的转换过程将会编译失败。

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,这里是你如何用一个数据向量在本地执行它。

import org.datavec.local.transforms.LocalTransformExecutor;

List<List<Writable>> processedData = LocalTransformExecutor.execute(originalData, tp);

调式

在概要发生变化的时候在一个转换过程中的每个操作代表一个步骤。有时候,转换的结果不是预期想要的。你可以按如下通过打印转换过程对象tp中每个步骤调试这它。

//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));
}

可用转换和变换


TransformProcess

[源码]

 

TransformProcess 定义了一个有序的转换列表,用于在一些数据上执行。

 

getFinalSchema
public Schema getFinalSchema() 

得到这个转换过程将要执行的动作列表

  • return
getSchemaAfterStep
public Schema getSchemaAfterStep(int step) 

      行执所有步骤直至并包括指定步骤后返回概要。步骤索引从0开始:所以getSchemaAfterStep(0) 是在一个转换被执行之后。

  • 参数step是步骤的索引
  • 返回在此(以及所有先前)步骤已被执行之后的数据概要
toJson
public String toJson() 

     为单个示例执行完整的转换序列。如果一个示例被过滤,可能返回空。需要注意的是:一些转换过程操作不能在示例中独立完成。最值得注意的,转换为系列和从系列转换操作要求一次处理全部的数据集合。

  • param input 参数 input
  • return
toYaml
public String toYaml() 

 把转换过程转化为YAML字符

  • 返回一个YAML格式的转换过程
fromJson
public static TransformProcess fromJson(String json) 

反系列化一个JSON字符(由oJson()创建)

  • 返回一个从JSON转换而来的转换对象
fromYaml
public static TransformProcess fromYaml(String yaml) 

反系列化一个yaml字符(由toYaml()创建)。 

  • 返回一个从YAML转换而来的转换对象。
transform  (注意此方法说明与方法名不一致,官网文档也是错的)
public Builder transform(Transform transform) 

     推断特定列的给定记录读取器的类别。注意,每个“列索引”是上下文(List record = ...; record.get(columnIndex);)中的列。

请注意,作为列传递的任何内容将自动转换为字符串以用于分类目的。期待的输入是字符或是数字(有明显的 toString()表示)需要注意的是返回的类别将按字母顺序排序 

  • 参数recordReader是指用于迭代的记录阅读器
  • 参数columnIndex是用于获取的类别的索引
  • return
filter
public Builder filter(Filter filter) 

在前面的added操作被执行之后添加一个过滤器操作。

  • 参数filter是要执行的过滤器操作
filter
public Builder filter(Condition condition) 

基于一个指定的条件,添加一个过滤器操作。如果条件满足(返回true):移除示例或系列。如果条件不满足(返回false):保持示例或系列 。

  • 参数condition是过滤器需要的条件
removeColumns
public Builder removeColumns(String... columnNames) 

按名称删除所有列

  • 参数columnNames是需要删除的列名称的
removeColumns
public Builder removeColumns(Collection<String> columnNames) 

按名称删除所有列

  • 参数columnNames是需要删除的列名称的
removeAllColumnsExceptFor
public Builder removeAllColumnsExceptFor(String... columnNames) 

删除除了指定列名称外的所有列

  • 参数columnNames是需要保留的列
removeAllColumnsExceptFor
public Builder removeAllColumnsExceptFor(Collection<String> columnNames) 

删除除了指定列名称外的所有列

  • 参数columnNames是需要保留的列
renameColumn
public Builder renameColumn(String oldName, String newName) 

重命名一个列

  • 参数oldName是旧的列名
  • 参数newName是新的列名
renameColumns
public Builder renameColumns(List<String> oldNames, List<String> newNames) 

重命名多列

  • 参数oldNames是旧列名列表
  • 参数newNames是新列名列表
reorderColumns
public Builder reorderColumns(String... newOrder) 

使用部份列或全部列进行重新排序。如果列名的一部份被指定用作新的顺序,其余的列将按原来的顺序放到最后面。

  • 参数newOrder是列的名称,为了可以在输出中展现。
duplicateColumn
public Builder duplicateColumn(String column, String newName) 

 复制一个列

  • 参数column是需要被复制的列名
  • 参数newName是新列的列名
duplicateColumns
public Builder duplicateColumns(List<String> columnNames, List<String> newNames) 

复制一个集合的列

  • 参数columnNames是需要被复制的列名
  • 参数newNames是被复制的新列名
integerMathOp
public Builder integerMathOp(String column, MathOp mathOp, int scalar) 

用一个标量在指定的整型数据列上进行数学运算(加法,减法,标量最大值)

  • 参数column是需要进行运算的整数列
  • 参数mathOp是要进行的数学运算
  • 参数scalar是需要用于数学运算的标量
integerColumnsMathOp
public Builder integerColumnsMathOp(String newColumnName, MathOp mathOp, String... columnNames) 

计算并添加一个新的整型列,通过在已存的在列的数字进行数学运算。新列被添加到最后。

  • 参数newColumnName是新列的名称
  • 参数mathOp是需要在列上执行的数学运算
  • 参数columnNames是用于数学运算的列名称
longMathOp
public Builder longMathOp(String columnName, MathOp mathOp, long scalar) 

用一个标量在指定的长整型数据列上进行数学运算(加法,减法,标量最大值)

  • 参数columnName是进行数学运算的长整型数据列
  • 参数mathOp是要进行的数学运算
  • 参数scalar是用来参与数学运算的标量
longColumnsMathOp
public Builder longColumnsMathOp(String newColumnName, MathOp mathOp, String... columnNames) 

计算并添加一个新的长整型列,通过在已存的在列的数字进行数学运算。新列被添加到最后。

  • 参数newColumnName是新列的名称
  • 参数mathOp是需要在列上执行的数学运算
  • 参数columnNames是用于数学运算的列名称
floatMathOp
public Builder floatMathOp(String columnName, MathOp mathOp, float scalar)  

用一个标量在指定的浮点型数据列上进行数学运算(加法,减法,标量最大值)

  • 参数columnName是进行数学运算的浮点型数据列
  • 参数mathOp是要进行的数学运算
  • 参数scalar是用来参与数学运算的标量

floatColumnsMathOp

public Builder floatColumnsMathOp(String newColumnName, MathOp mathOp, String... columnNames) 

计算并添加一个新的浮点型列,通过在已存的在列的数字进行数学运算。新列被添加到最后。

  • 参数newColumnName是新列的名称
  • 参数mathOp是需要在列上执行的数学运算
  • 参数columnNames是用于数学运算的列名称
floatMathFunction
public Builder floatMathFunction(String columnName, MathFunction mathFunction) 

在一个列上进行一个数学运算(例如sin(x), ceil(x), exp(x) 等)

  • 参数columnName是需要进行运算的列
  • 参数mathFunction是应用于列上的数学函数。
doubleMathOp
public Builder doubleMathOp(String columnName, MathOp mathOp, double scalar) 

用一个标量在指定的双精度型数据列上进行数学运算(加法,减法,标量最大值)

  • 参数columnName是进行数学运算的双精度型数据列
  • 参数mathOp是要进行的数学运算
  • 参数scalar是用来参与数学运算的标量
doubleColumnsMathOp
public Builder doubleColumnsMathOp(String newColumnName, MathOp mathOp, String... columnNames) 

计算并添加一个新的双精度型列,通过在已存的在列的数字进行数学运算。新列被添加到最后。

  • 参数newColumnName是新列的名称
  • 参数mathOp是需要在列上执行的数学运算
  • 参数columnNames是用于数学运算的列名称
doubleMathFunction
public Builder doubleMathFunction(String columnName, MathFunction mathFunction)  

在一个列上进行一个数学运算(例如sin(x), ceil(x), exp(x) 等)

  • 参数columnName是需要进行运算的列
  • 参数mathFunction是应用于列上的数学函

timeMathOp

public Builder timeMathOp(String columnName, MathOp mathOp, long timeQuantity, TimeUnit timeUnit) 

在一个指定的列上进行一个数学运算(加法,减法,标量最大值)

  • 参数columnName是要进行运算的整型数据列名称
  • 参数mathOp是指数学运算
  • 参数timeQuantity是用于数学运算的数量
  • 参数是用于数学运算的数量的单位
categoricalToOneHot
public Builder categoricalToOneHot(String... columnNames) 

  转换指定的列,从分类形式转换为one-hot形式 。这涉及到创建多个新的列。

  •  参数columnNames是用于转换为one-hot形式的分类列的名称
categoricalToInteger
public Builder categoricalToInteger(String... columnNames) 

  转换指定的列,从分类形式转换为整型形式 。这将用整型形式替换指定的分类列,整型的范转是从0 到 分类数量-1

  • 参数columnNames是要转换为整型形式的列名称
integerToCategorical
public Builder integerToCategorical(String columnName, List<String> categoryStateNames) 

 给定指定的状态名称,将整型(假设值为0到分类数量-1)表示的列转换为用分类表示的列

  • 参数columnName是需要转换的列名
  • 参数categoryStateNames是分类列的状态名称
integerToCategorical
public Builder integerToCategorical(String columnName, Map<Integer, String> categoryIndexNameMap) 

给定指定的索引与状态名称的映射,将整型(假设值为0到分类数量-1)表示的列转换为用分类表示的列

  • 参数columnName是需要转换的列名
  • 参数categoryIndexNameMap是分类列的索引与状态名称的映射
integerToOneHot
public Builder integerToOneHot(String columnName, int minValue, int maxValue) 

把一个整型列转换为one-hot列,基于整型列的值

  • 参数columnName是整型列的名称
  • 参数minValue是整型列可能的最小值(包括minValue)
  • 参数maxValue是整型列可能的最大值(包括maxValue)
addConstantColumn
public Builder addConstantColumn(String newColumnName, ColumnType newColumnType, Writable fixedValue) 

添加一个新列,其中列中的所有值都是相同的和被指定的。

  • 参数newColumnName是指新列的名称
  • 参数newColumnType是指新列的数据类型
  • 参数fixedValue是一个新列中所有记录的值
addConstantDoubleColumn
public Builder addConstantDoubleColumn(String newColumnName, double value) 

添加一个新的双精度类型列,这个列的所有记录的值都相同。

  • 参数newColumnName是新列的名称
  • 参数value是新列中所有记录的值
addConstantIntegerColumn
public Builder addConstantIntegerColumn(String newColumnName, int value)  

添加一个新的整型列,这个列的所有记录的值都相同。

  • 参数newColumnName是新列的名称
  • 参数value是新列中所有记录的值

addConstantLongColumn

public Builder addConstantLongColumn(String newColumnName, long value)  

添加一个新的长整型列,这个列的所有记录的值都相同。

  • 参数newColumnName是新列的名称
  • 参数value是新列中所有记录的值

convertToString

public Builder convertToString(String inputColumn) 

把指定的列转换为字符

  • 参数inputColumn 是要转换的列
  • 返回构建器模式
convertToDouble
public Builder convertToDouble(String inputColumn) 

把指定的列转换为双精度

  • 参数inputColumn 是要转换的列
  • 返回构建器模式
convertToInteger
public Builder convertToInteger(String inputColumn)  

把指定的列转换为整型

  • 参数inputColumn 是要转换的列
  • 返回构建器模式

normalize

public Builder normalize(String column, Normalize type, DataAnalysis da) 

用给定的归一化类型归一化指定的列

  • 参数column是指需要归一化的列
  • 参数type是要应用的归一化的类型
  • 参数da是指数据分析类对象
convertToSequence
public Builder convertToSequence(String keyColumn, SequenceComparator comparator) 

按照一些键,将独立的记录/实例集合转换成序列。在每个序列中,值是按给定的序列比较器排序的。

  • 参数keyColumn是作为键使用的列(具有相同键的值将被合并成序列)
  • 参数comparator是一个在每个序列中用于排序的比较器(例如,按时间或按字符顺序)
convertToSequence
public Builder convertToSequence() 

将独立的记录/实例集合转换成序列,每个例子简单的当作一个长度为1的序列,没有任何连接/分组操作。需要注意的是通常需要加入连接/分组;使用convertToSequence(List, SequenceComparator)来实现此功能。

 

 

convertToSequence
public Builder convertToSequence(List<String> keyColumns, SequenceComparator comparator) 

将独立的记录/实例集合转换成序列,每个序列是按一个或多个键值分组的(值在一个或多个列中),在每个序列中,值是用所提供的序列比较器进行排序。

  • 参数keyColumn是作为键使用的列(具有相同键的值将被合并成系列)
  • 参数comparator是一个在每个序列中用于排序的比较器(例如,按时间或按字符顺序)
convertFromSequence
public Builder convertFromSequence() 

将一个序列转换为独立的值的集合(通过把每个序列中的每个值当作一个单独实例)

 

splitSequence
public Builder splitSequence(SequenceSplit split) 

将系列分割为1个或多个序列。用于例如将一个大的序列分割为小的序列集合。

 

  • 参数SequenceSplit是指如何进行分割
trimSequence
public Builder trimSequence(int numStepsToTrim, boolean trimFromStart) 

序列修剪变换在序列中移除第一个或倒数第N个值。需要注意的是如果输入序列的长度小于或等于N,结果序列的长度可能为0。

 

  • 参数numStepsToTrim是修剪序列步骤的次数
  • 参数trimFromStart如果为true,则从序列的开始修整值。如果为false,从序列的结尾开始。

 

offsetSequence (此方法说明并不清楚)
public Builder offsetSequence(List<String> columnsToOffset, int offsetAmount,
                                      SequenceOffsetTransform.OperationType operationType) 

在指定列上执行序列操作。需要注意的是默认情况下,这也会截断指定偏移量的序列。使用{- 代码 transform(new SequenceOffsetTransform(…)} 来改变这种情况. 查看 {- link SequenceOffsetTransform} 来知道它是要进行的操作和如何操作的。

 

 

  • 参数columnsToOffset是要偏移的列 
  • 参数offsetAmount是指定的列的偏移量。(正偏移:'columnsToOffset'是移动到以后的时间步长)
  • 参数operationType是指是否在原来的地方进行偏移操作或是通过添加一个新的列。
reduce
public Builder reduce(IAssociativeReducer reducer) 

缩减(聚合/合并)一个实例集合(通常按键来进行)。需要注意的是减少只能在标准的(非序列)数据上进行操作。

 

  • 参数reducer是要使用的缩减器 
reduceSequence
public Builder reduceSequence(IAssociativeReducer reducer) 

为每个独立序列进行缩减(聚合/合并)一个序列实例集合。需要注意的是这个方法倒致非序列的数据。相反,如果你喜欢缩减后的长度为1的序列,可以使用transform(new ReduceSequenceTransform(reducer))方法。

  • 参数reducer是用于在每个窗口的缩减器。
reduceSequenceByWindow
public Builder reduceSequenceByWindow(IAssociativeReducer reducer, WindowFunction windowFunction) 

使用一个窗口函数为每个独立序列进行缩减(聚合/合并)一个序列实例集合。例如,在24小时内取所有的记录/实例,(使用缩减器)把它们转换为单个值。这个例子中,时间周期是24小时,输出是一个序列。

  • 参数reducer是在每个窗中使用的缩减器。
  • 参数windowFunction是分别在每个独立序列上找到应用的窗口函数。
sequenceMovingWindowReduce
public Builder sequenceMovingWindowReduce(String columnName, int lookback, ReduceOp op) 

 

序列移动窗口缩减变换:添加一个新列,它的值是:

(a)使用单个列中最后n个值的窗口

(b)在窗口上应用一个缩减操作来计算一个新值,例如,这个转换器可以用于实现一个最后n个值的一个简单移动平均,或确定最后N个时间步长中的最小值或最大值。

例如, 对于一个长度为20的简单移动平均:使用new SequenceMovingWindowReduceTransform(“myCol”, 20, ReduceOp.Mean)

 

 

  • 参数columnName是进行窗口操作的列 
  • 参数lookback是回顾窗口期
  • 参数op是每个窗口进行的缩减操作
calculateSortedRank
public Builder calculateSortedRank(String newColumnName, String sortOnColumn, WritableComparator comparator) 

 

计算排序的秩:在排序后计算每个实例的秩。例始,我们可能有一些数字“分数”列,根据那个列,我们想要知道每个实例的秩(排列顺序)。

每个实例的秩将被添加到一个新的长整型列。从0开始索引 ;实例会有0到数据集大小减1的索引。目前计算排序的秩只能应用在标准的数据上,除此外,当前的实现只能在一列上排序。

 

  • 参数newColumnName是找新列的名称(将包括每个实例的秩)
  • 参数sortOnColumn是需要排序的列
  • 参数comparator是用于实例的比较器
calculateSortedRank
public Builder calculateSortedRank(String newColumnName, String sortOnColumn, WritableComparator comparator,
                                           boolean ascending) 

计算排序的秩:在排序后计算每个实例的秩。例始,我们可能有一些数字“分数”列,根据那个列,我们想要知道每个实例的秩(排列顺序)。

每个实例的秩将被添加到一个新的长整型列。从0开始索引 ;实例会有0到数据集大小减1的索引。目前计算排序的秩只能应用在标准的数据上,除此外,当前的实现只能在一列上排序。

 

  • 参数newColumnName是找新列的名称(将包括每个实例的秩)
  • 参数sortOnColumn是需要排序的列
  • 参数comparator是用于实例的比较器
  • 参数ascending如果为true: 升序排序. False: 降序排序
stringToCategorical
public Builder stringToCategorical(String columnName, List<String> stateNames) 

将指定的列转换为分类列。必须提供状态名称。

  • 参数columnName是要被转换为分类列的列名
  • 参数stateNames是分类的状态名
stringRemoveWhitespaceTransform
public Builder stringRemoveWhitespaceTransform(String columnName) 

在指定的字符列的值中移除空白字符

  • 参数columnName是需要移除空白字符的列名
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics