Julia机器学习核心编程:人人可用的高性能科学计算
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

2.7 DataFrames

DataFrame是具有标记列的数据结构,可以单独使用不同的数据类型。就像SQL表或电子表格一样,它有两个维度。DataFrame是统计分析推荐的数据结构。Julia提供了一个名为DataFrames的包,它具有使用DataFrames所需的所有功能。Julia的DataFrames包提供了三种数据类型。

• NA:Julia中的缺失值由特定数据类型NA表示。

• DataArray:标准Julia库中定义的数组类型。虽然它具有很多功能,但并未提供任何特定的数据分析功能。而DataFrames包中的DataArray类型提供了这些功能(例如,可以在数组中存储一些缺失值)。

• DataFrame:这是一个二维数据结构,其提供了很多功能来表示和分析数据。

2.7.1 DataFrames中的NA数据类型

在实际生活中,我们会遇到无值的数据。虽然Julia中的数组无法存储这种类型的值,但DataFrames包中提供了这种数据类型,即NA数据类型。假设有一个带有浮点数的数据集:

julia> x = [1.1, 2.2, 3.3, 4.4, 5.5, 6.6]

这将创建一个具有6个元素的数组{Float64,1}。

现在,假设此数据集在位置x[1]处有缺失值。这意味着该数据没有意义,而不是1.1。我们不能用Julia中的数组类型来表示。当尝试分配NA值时,将发生错误,我们无法将NA值添加到数组中。

01  julia> x[1] = NA
02  Error: UndefVarError: NA not defined
03  while loading In[2], in expression starting on line 1

如果要将数据加载到具有NA值的数组中,则需要使用DataArrays包下的DataArray类型。

【范例2-38】DataArrays的使用

01  julia> using DataArrays
02  julia> x = DataArray([1.1, 2.2, 3.3, 4.4, 5.5, 6.6])

这将创建一个具有6个元素的数组DataArrays.DataArray{Float64,1}。下面的代码将使用NA值进行测试

【范例2-39】NA值测试

以下代码简单测试了NA的性质。

01  julia> x[1] = NA
02  NA
03  julia> x
04  6-element DataArrays.DataArray{Float64,1}:
05  NA
06  2.2
07  3.3
08  4.4
09  5.5
10  6.6

代码01行将NA赋值给x[1],因此使用DataArray可以处理丢失的数据。NA并不总是影响应用于特定数据集的函数。因此,不涉及NA值或不受其影响的方法可以应用于数据集;如果涉及NA值,那么DataArray将给出NA作为结果。在下面的代码中,我们使用了mean()函数和true||x。mean()函数不起作用,因为它涉及NA值;而true||x则按预期工作。

01  julia> true || x
02  true
03  julia> true && x[1]
04  NA
05  julia> mean(x)
06  NA
07  julia> mean(x[2:6])
08  4.4

可以看到,使用mean()函数时返回的值为NA。代码07行不涉及NA值,因此返回正常的数值。

除此之外,还有其他类似于Julia的Array类型的功能。比如,Vector(一维数组类型)和Matrix(二维数组类型),它们在DataArray中的类型别名分别为DataVector和DataMatrix。

创建一维DataArray与创建Array类型相似。

【范例2-40】DataArray测试

01  julia> using DataArrays
02  julia> dvector = data([10,20,30,40,50])
03  5-element DataArrays.DataArray{Int64,1}:
04  10
05  20
06  30
07  40
08  50

代码01行调用了DataArrays包,代码02行创建了一个DataArray。

同理,可以创建一个二维DataMatrix阵列:

01  julia> dmatrix = data([10 20 30; 40 50 60])
02  2×3 DataArrays.DataArray{Int64,2}:
03  10 20 30
04  40 50 60
05  julia> dmatrix[2,3]
06  60

在前面的范例中,为了计算平均值,将数组中的NA值分离出来。这不是一个将NA值移出计算范围的便利方法,更好的方法是使用dropna()函数。

01  julia> dropna(x)
02  5-element Array{Float64,1}:
03  2.2
04  3.3
05  4.4
06  5.5
07  6.6

上面代码使用了dropna()函数,该函数能够过滤掉NA值。

2.7.2 DataFrame表格

可以说,无论是R(data.frame)还是Python(Pandas)中的表格都是统计计算中最重要和最常用的数据类型。这是因为真实世界中的数据大多是表格式的,不能用简单的DataArray来表示。

要使用DataFrame,请从Julia的已注册包中添加DataFrames包,范例如下。

【范例2-41】使用表格

01  julia> Pkg.update()
02  julia> Pkg.add("DataFrames")
03  julia> using DataFrame

下面我们创建一个简单的数据表。

对于这种类型的数据,无法使用DataArray来表示。这种数据具有以下功能:

• 在不同列中具有不同类型的数据。不能使用矩阵表示不同列中的不同数据类型,因为矩阵只能包含一种类型的值。

• 它是一个表格数据结构,其记录与不同列的同一行中的其他记录有关系。因此,所有列必须具有相同的长度。无法使用向量,因为无法使用相同长度的列强制执行。因此,DataFrame中的列由DataArray表示。

• 首列是标记的表头。这种标记有助于我们熟悉数据并访问数据,而无须记住其确切位置。因此,可以使用数字索引以及它们的标记访问列。DataFrame包用于表示表格数据,并将DataArrays用作列。