DataVec/概要
为什么要使用概要?
现实中的不幸是数据是脏的。当为了深度学习而试图向量化一个数据集时,很少能找到没有错的文件。在使用神经网络训练神经网络之前,概要对于维护数据的意义是很重要的。
使用概要
概要基本上用于程序设计变换。在正确执行转换过程之前,需要传递正在转换的数据的概要。一个用于商家记录的概要的例子看起来如下:
Schema inputDataSchema = new Schema.Builder()
.addColumnsString("DateTimeString", "CustomerID", "MerchantID")
.addColumnInteger("NumItemsInTransaction")
.addColumnCategorical("MerchantCountryCode", Arrays.asList("USA","CAN","FR","MX"))
.addColumnDouble("TransactionAmountUSD",0.0,null,false,false) //$0.0 or more, no maximum limit, no NaN and no Infinite values
.addColumnCategorical("FraudLabel", Arrays.asList("Fraud","Legit"))
.build();
概要连接
如果你有两个你想要合并的不同的数据集,数据向理提供一个Join连接类,它有不同的连接策略,例如 Inner内连和RightOuter右外连
Schema customerInfoSchema = new Schema.Builder()
.addColumnLong("customerID")
.addColumnString("customerName")
.addColumnCategorical("customerCountry", Arrays.asList("USA","France","Japan","UK"))
.build();
Schema customerPurchasesSchema = new Schema.Builder()
.addColumnLong("customerID")
.addColumnTime("purchaseTimestamp", DateTimeZone.UTC)
.addColumnLong("productID")
.addColumnInteger("purchaseQty")
.addColumnDouble("unitPriceUSD")
.build();
Join join = new Join.Builder(Join.JoinType.Inner)
.setJoinColumns("customerID")
.setSchemas(customerInfoSchema, customerPurchasesSchema)
.build();
一旦你已经定义了你的连接并且你已经加载了数据到数据向量,你必须使用一个Executor执行器来完成连接。
Classes and utilities 类和实用工具
数据向量为2D和序列类型数据提供一些概要类和帮助工具。
Join 连接
连接类:用于指定一个连接(类似SQL的连接)
setSchemas 设置概要
public Builder setSchemas(Schema left, Schema right)
连接类型
内连:返回连接列值同时出现的实例。
左外连:返回从左边来的所有实例,不管是否有与右边的值匹配。(如果不匹配:右边的值将会以NullWritable来替代)
右外连:返回从右边来的所有实例,不管是否有与左边的值匹配。(如果不匹配:左边的值将会以NullWritable来替代)
全外连:返回左右所有实例,不管两边的数据是否匹配。(如果不匹配:值会以NullWritable来替代)
setKeyColumns 设置关键列
public Builder setKeyColumns(String... keyColumnNames)
- 弃用的 {- link #setJoinColumns(String…)}
setKeyColumnsLeft 设置关键列左边
public Builder setKeyColumnsLeft(String... keyColumnNames)
- 弃用的 {- link #setJoinColumnsLeft(String…)}
setKeyColumnsRight 设置关键列右边
public Builder setKeyColumnsRight(String... keyColumnNames)
- 弃用的 {- link #setJoinColumnsRight(String…)}
setJoinColumnsLeft 设置连接列左边
public Builder setJoinColumnsLeft(String... joinColumnNames)
为左边的数据指定连接的列名)思路:为所有i连接firstDataValues(joinColumNamesLeft[i]) == secondDataValues(joinColumnNamesRight[i])的实例
- 参数joinColumnNames 为连接的列名(用于左边的数据)
setJoinColumnsRight
public Builder setJoinColumnsRight(String... joinColumnNames)
为右边的连接指定列名)思路:为所有的i连接firstDataValues(joinColumNamesLeft[i]) == secondDataValues(joinColumnNamesRight[i]) 的实例。
- 参数joinColumnNames为连接的列名(用于右边的数据)
InferredSchema 推断概要
如果传入一个包括一个头和单行数据的CSV文件,它将返回一个概要。只有Double, Integer, Long, 和 String类型才被支持。如果不能推断出数字类型,字段类型将成为默认类型。需要注意的是如果你的列实际上是分类的,但表示为一个数字,则需要进行额外的转换。同时,如果你的样例字段为blank/null,则它也将成为默认类型。
Schema 概要
概要定义表格数据的布局。特别的,它抱括了每个列的名称,类型明细 (Integer, String, Long, Double, 等).每个列的类型数据也可以可选地包括为每个列指定允许的数据约束。
sameTypes 名称类型
public boolean sameTypes(Schema schema)
基于给定的元数据创建一个概要
- 参数columnMetaData为创建概要的元数据
newSchema 创建概要
public Schema newSchema(List<ColumnMetaData> columnMetaData)
计算在 ColumnMetaData中这个概要与传入的概要的不同。在org.datavec.api.transform.TransformProcess识别什么过程将会作用于一个给定的概要的过程中,这是很重要的。
- 参数schema是计算不同点的概要
- 返回在该概要与其他概要之间不同的(按顺序)的元数据。
numColumns
public int numColumns()
返回此概要的列或字段的数目
- 返回此概要的列或字段的数目
getName
public String getName(int column)
返回在指定索引处给定列的名称。
- 参数column为获取名称的列的索引
- 返回在指定索引处给定列的名称。
getType
public ColumnType getType(int column)
在指定的索引处返回列的类型
- 参数column是用于获取列的索引
- 返回指定索引处的列的类型
getType
public ColumnType getType(String columnName)
在指定的列名称处返回列的类型
- 参数columnName是用于获取列的名称
- 返回指定名称处的列的类型
getMetaData
public ColumnMetaData getMetaData(int column)
返回指定索引处的列元数据
- par参数column是用于获取列的索引
- 返回指定索引处的列的元数据
getMetaData
public ColumnMetaData getMetaData(String column)
返回指定名称处的列元数据
- 参数column是用于获取列的名称
- 返回指定名称处的列的元数据
getIndexOfColumn
public int getIndexOfColumn(String columnName)
返回指定列名的索引
- 返回指定的列名的索引
hasColumn
public boolean hasColumn(String columnName)
返回是否有这个列名的列
- 参数columnNames是需要索引的列名
- 返回是否有这个列名的列的布尔值
toJson
public String toJson()
系列化这个概要到json
- 返回一个此概要的json形式
toYaml
public String toYaml()
把这个概要系列化为yaml
- 返回这个概要的yaml形式
fromJson
public static Schema fromJson(String json)
从一个给定的json字符串创建一个概要
- 参数json是概要要从哪个JSON字符串中创建
- 返回一个基于json创建的概要
fromYaml
public static Schema fromYaml(String yaml)
从一个给定的yaml字符串中创建概要
- 参数yaml是概要要从哪个yaml字符串中创建
- 返回一个基于yaml创建的概要
addColumnFloat
public Builder addColumnFloat(String name)
添加浮点数据列,对允许值没有限制,除了不允许NAN/无限大值。
- 参数name是列的名称
addColumnFloat
public Builder addColumnFloat(String name, Float minAllowedValue, Float maxAllowedValue)
添加一个浮点数据列并指定约束(不允许NAN/无限值)
- 参数name 是指列的名称
- 参数minAllowedValue是允许的最小值,如果为空就没有约束。
- 参数maxAllowedValue是允许的最大值,如果为空就没有约束。
- return
addColumnFloat
public Builder addColumnFloat(String name, Float minAllowedValue, Float maxAllowedValue, boolean allowNaN,
boolean allowInfinite)
添加一个浮点数据列,指定约束
- 参数name 是指列的名称
- 参数minAllowedValue是允许的最小值,如果为空就没有约束。
- 参数maxAllowedValue是允许的最大值,如果为空就没有约束。
- 参数allowNaN 如果为false 则不允许为空值,如果为true则允许。
- 参数allowInfinite如果为false则不允许为无限,如果为true则允许。
addColumnsFloat
public Builder addColumnsFloat(String... columnNames)
添加多个浮点数据列,对列的允许值没有限制(除了不允许NAN/无限)
- 参数columnNames是指要添加的列的名称
addColumnsFloat
public Builder addColumnsFloat(String pattern, int minIdxInclusive, int maxIdxInclusive)
一个方便的方法,用于添加多个浮点类型的列。例如,添加这些列“myFloatCol_0”, “myFloatCol_1”, “myFloatCol_2”,使用{- code addColumnsFloat(“myFloatCol_%d”,0,2)}
- 参数pattern是使用的模式(通过String.format)。“%d”会被列号替换。
- 参数minIdxInclusive是指最小的列索引
- 参数maxIdxInclusive是指最大的列索引
addColumnsFloat
public Builder addColumnsFloat(String pattern, int minIdxInclusive, int maxIdxInclusive,
Float minAllowedValue, Float maxAllowedValue, boolean allowNaN, boolean allowInfinite)
一个方便的方法,用于添加多个浮点类型的列,带有额外的约束可以应用于所有的列。例如,添加这些列“myFloatCol_0”, “myFloatCol_1”, “myFloatCol_2”, 可以使用 {- code addColumnsFloat(“myFloatCol_%d”,0,2,null,null,false,false)}
- 参数pattern是使用的模式(通过String.format)。“%d”会被列号替换。
- 参数minIdxInclusive是指最小的列索引
- 参数maxIdxInclusive是指最大的列索引
- 参数minAllowedValue是指允许的最小列值。如果为空,则没有限制。
- 参数maxAllowedValue是指允许的最大列值,如果为空,则没有限制。
- 参数allowNaN如果是false则不允许空值。如果是true则允许。
- 参数allowInfinite如果是false则不允许无限大。如果是true则允许。
addColumnDouble
public Builder addColumnDouble(String name)
添加双精度数据列,对允许值没有限制,除了不允许NAN/无限大值。
- 参数name是列的名称
addColumnDouble
public Builder addColumnDouble(String name, Double minAllowedValue, Double maxAllowedValue)
- 添加双精度数据列,带有限制,并且不允许NAN/无限大值。
- 参数name是指列的名称
- 参数minAllowedValue是指允许的最小值,如果空,则没有限制
- 参数maxAllowedValue是指允午的最大值,如果空,则没有限制
- return
addColumnDouble
public Builder addColumnDouble(String name, Double minAllowedValue, Double maxAllowedValue, boolean allowNaN,
boolean allowInfinite)
- 添加双精度数据列,带有指定的限制
- 参数name是指列的名称
- 参数minAllowedValue是指允许的最小值,如果空,则没有限制
- 参数maxAllowedValue是指允午的最大值,如果空,则没有限制
- 参数allowNaN如果是false则不允许空值。如果是true则允许。
- 参数allowInfinite如果是false则不允许无限大。如果是true则允许。
addColumnsDouble
public Builder addColumnsDouble(String... columnNames)
添加多个双精度数据列,对列的允许值没有限制(除了不允许NAN/无限)
- 参数columnNames是指要被添加的那些列名
addColumnsDouble
public Builder addColumnsDouble(String pattern, int minIdxInclusive, int maxIdxInclusive)
一个方便的方法,用于添加多个双精度数据列。例如,添加这些列“myDoubleCol_0”, “myDoubleCol_1”, “myDoubleCol_2”, 可以使用 {- code addColumnsDouble(“myDoubleCol_%d”,0,2)}
- 参数pattern是使用的模式(通过String.format)。“%d”会被列号替换。
- 参数minIdxInclusive是指最小的列索引
- 参数maxIdxInclusive是指最大的列索引
addColumnsDouble
public Builder addColumnsDouble(String pattern, int minIdxInclusive, int maxIdxInclusive,
Double minAllowedValue, Double maxAllowedValue, boolean allowNaN, boolean allowInfinite)
一个方便的方法,用于添加多个双精度数据列,带有额外的约束可以应用于所有的列。例如,添加这些列“myDoubleCol_0”, “myDoubleCol_1”, “myDoubleCol_2”, 使用 {- code addColumnsDouble(“myDoubleCol_%d”,0,2,null,null,false,false)}
- 参数pattern是使用的模式(通过String.format)。“%d”会被列号替换。
- 参数minIdxInclusive是指最小的列索引
- 参数maxIdxInclusive是指最大的列索引
- 参数minAllowedValue是指允许的最小列值。如果为空,则没有限制。
- 参数maxAllowedValue是指允许的最大列值,如果为空,则没有限制。
- 参数allowNaN如果是false则不允许空值。如果是true则允许。
- 参数allowInfinite如果是false则不允许无限大。如果是true则允许。
addColumnInteger
public Builder addColumnInteger(String name)
添加一个整型数据列,在允许的值上不带限制
- 参数name是指列的名称
addColumnInteger
public Builder addColumnInteger(String name, Integer minAllowedValue, Integer maxAllowedValue)
添加一个整型数据列,带有指定的允午的最小值和最大值
- 参数name是列名
- 参数minAllowedValue是允许的最小值,如果是空,则没有限制
- 参数maxAllowedValue是允许的最大值,如果是空,则没有限制
addColumnsInteger
public Builder addColumnsInteger(String... names)
添加多个整型数据列,在允许的值上不带限制
- 参数names是指要添加的那些整数列的列名
addColumnsInteger
public Builder addColumnsInteger(String pattern, int minIdxInclusive, int maxIdxInclusive)
一个方便的方法,用于添加多个整数列。例如,添加这些列 “myIntegerCol_0”, “myIntegerCol_1”, “myIntegerCol_2”, 可以使用 {- code addColumnsInteger(“myIntegerCol_%d”,0,2)}
- 参数pattern是使用的模式(通过String.format)。“%d”会被列号替换。
- 参数minIdxInclusive是指最小的列索引
- 参数maxIdxInclusive是指最大的列索引
addColumnsInteger
public Builder addColumnsInteger(String pattern, int minIdxInclusive, int maxIdxInclusive,
Integer minAllowedValue, Integer maxAllowedValue)
一个方便的方法,用来添加多个整型数据列。例如,添加这些列“myIntegerCol_0”, “myIntegerCol_1”, “myIntegerCol_2”, 可以使用 {- code addColumnsInteger(“myIntegerCol_%d”,0,2,1,100)}
- 参数pattern是使用的模式(通过String.format)。“%d”会被列号替换。
- 参数minIdxInclusive是指最小的列索引
- 参数maxIdxInclusive是指最大的列索引
- 参数minAllowedValue是指允许的最小列值。如果为空,则没有限制。
- 参数maxAllowedValue是指允许的最大列值,如果为空,则没有限制。
addColumnCategorical
public Builder addColumnCategorical(String name, String... stateNames)
添加一个分类的列,带有指定的状态名
- 参数name是指列的名称
- 参数stateNames是指这个分类列允许的状态值
addColumnCategorical
public Builder addColumnCategorical(String name, List<String> stateNames)
添加一个分类的列,带有指定的状态名
- name是指列的名称
- 参数stateNames是指这个分类列允许的状态值
addColumnLong
public Builder addColumnLong(String name)
添加一个长整型数据列,在最小值和最大值上没有限制
- 参数name是指列的名称
addColumnLong
public Builder addColumnLong(String name, Long minAllowedValue, Long maxAllowedValue)
添加一个长整型数据列,带有指定的最小值和最大值
- 参数name是指列的名称
- 参数minAllowedValue是指允许的最小列值。如果为空,则没有限制。
- 参数maxAllowedValue是指允许的最大列值,如果为空,则没有限制。
addColumnsLong
public Builder addColumnsLong(String... names)
添加多个长整型数据列,在允许的值上不带有限制
- 参数names是指你要添加的那些列的列名
addColumnsLong
public Builder addColumnsLong(String pattern, int minIdxInclusive, int maxIdxInclusive)
一个方便的方法,用于添加多个长整型数据列。例如,添加这些列“myLongCol_0”, “myLongCol_1”, “myLongCol_2”, 可使用 {- code addColumnsLong(“myLongCol_%d”,0,2)}
- 参数pattern是使用的模式(通过String.format)。“%d”会被列号替换。
- 参数minIdxInclusive是指最小的列索引
- 参数maxIdxInclusive是指最大的列索引
addColumnsLong
public Builder addColumnsLong(String pattern, int minIdxInclusive, int maxIdxInclusive, Long minAllowedValue,
Long maxAllowedValue)
一个方便的方法,用于添加多个长整型数据列。例如,添加这些列“myLongCol_0”, “myLongCol_1”, “myLongCol_2”, 可使用 {- code addColumnsLong(“myLongCol_%d”,0,2,1,100)}
- 参数pattern是使用的模式(通过String.format)。“%d”会被列号替换。
- 参数minIdxInclusive是指最小的列索引
- 参数maxIdxInclusive是指最大的列索引
- 参数minAllowedValue是指允许的最小列值。如果为空,则没有限制。
- 参数maxAllowedValue是指允许的最大列值,如果为空,则没有限制。
addColumn
public Builder addColumn(ColumnMetaData metaData)
添加一个列
- 参数metaData是指这个列的元数据
addColumnString
public Builder addColumnString(String name)
添加一个字符列,在允许的值上不带有限制。
- 参数name是指列的名称
addColumnsString
public Builder addColumnsString(String... columnNames)
添加多个字符列,在允许的值上不带有限制。
- 参数columnNames是指那些要被添加的列名
addColumnString
public Builder addColumnString(String name, String regex, Integer minAllowableLength,
Integer maxAllowableLength)
添加一个例,带有指定的约束
- 参数name是指列的名称
- 参数regex是字符必须匹配的正则表大式,以便于被认为是有效的。如果是空,则没有正则限制。
- 参数minAllowableLength是指被认为有效的最短的字符长度
- 参数maxAllowableLength是指被认为有效的最长的字符长度
addColumnsString
public Builder addColumnsString(String pattern, int minIdxInclusive, int maxIdxInclusive)
一个方便的方法,用于添加多个字符列。例如,添加这些列“myStringCol_0”, “myStringCol_1”, “myStringCol_2”, 可以使用 {- code addColumnsString(“myStringCol_%d”,0,2)}
- 参数pattern是使用的模式(通过String.format)。“%d”会被列号替换。
- 参数minIdxInclusive是指最小的列索引
- 参数maxIdxInclusive是指最大的列索引
addColumnsString
public Builder addColumnsString(String pattern, int minIdxInclusive, int maxIdxInclusive, String regex,
Integer minAllowedLength, Integer maxAllowedLength)
一个方便的方法,用于添加多个字符列。例如,添加这些列“myStringCol_0”, “myStringCol_1”, “myStringCol_2”, 可以使用 {- code addColumnsString(“myStringCol_%d”,0,2,null,3,7)}
- 参数pattern是使用的模式(通过String.format)。“%d”会被列号替换。
- 参数minIdxInclusive是指最小的列索引
- 参数maxIdxInclusive是指最大的列索引
- 参数regex是字符必须匹配的正则表大式,以便于被认为是有效的。如果是空,则没有正则限制。
- 参数minAllowableLength是指被认为有效的最短的字符长度
- 参数maxAllowableLength是指被认为有效的最长的字符长度
addColumnTime
public Builder addColumnTime(String columnName, TimeZone timeZone)
添加一个时间列,在允许的最大和最小时间上不带约束。注意:时间列是用长整型的值代替的。为了让时间值变成人可读的格式,使用列+ StringToTimeTransform
- 参数columnName 是添加要列名
- 参数timeZone是时间列的时区
addColumnTime
public Builder addColumnTime(String columnName, DateTimeZone timeZone)
添加一个时间列,在允许的最大和最小时间上不带约束。注意:时间列是用长整型的值代替的。为了让时间值变成人可读的格式,使用列+ StringToTimeTransform
- 参数columnName 是添加要列名
- 参数timeZone是时间列的时区
addColumnTime
public Builder addColumnTime(String columnName, DateTimeZone timeZone, Long minValidValue, Long maxValidValue)
添加一个时间列,带有指定的约束。注意:时间列是用长整型的值代替的。为了让时间值变成人可读的格式,使用列+ StringToTimeTransform
- 参数columnName是要添加的列名
- 参数timeZone是时间列的时区
- 参数minValidValue是允许的最小时间,可以为空
- 参数maxValidValue是允许的最大时间,可以为空
addColumnNDArray
public Builder addColumnNDArray(String columnName, long[] shape)
添加一个NDArray列
- 参数columnName是指列的名称
- 参数shape是指这个NDArray列的形状。在条目中使用-1指定该维度中的“可变长度”
build
public Schema build()
创建概要
inferMultiple
public static Schema inferMultiple(List<List<Writable>> record)
推断基于记录的概要。列名基于索引。
- 参数record是指从哪个记录进行推断
- 返回推断的概要
infer
public static Schema infer(List<Writable> record)
推断基于记录的概要。列名基于索引。
- 参数record是指从哪个记录进行推断
- 返回推断的概要
SequenceSchema
inferSequenceMulti
public static SequenceSchema inferSequenceMulti(List<List<List<Writable>>> record)
基于记录推断一个序列概要
- 参数record是概要基于的需要推断的记录
- 返回被推断的序列概要
inferSequence
public static SequenceSchema inferSequence(List<List<Writable>> record)
基于记录推断一个序列概要
- 参数record是概要基于的需要推断的记录
- 返回被推断的序列概要
有任何问题请联系微信