Julia 编程 - 使用数据集


在本章中,我们将详细讨论数据集。

CSV 文件

众所周知,CSV(逗号分隔值)文件是一个纯文本文件,它使用逗号分隔字段和这些字段的值。这些文件的扩展名是.CSV。Julia 编程语言提供了各种方法来对 CSV 文件执行操作。

在 Julia 中导入 .CSV 文件

要导入 .CSV 文件,我们需要安装 CSV 包。使用以下命令来执行此操作 -

using pkg
pkg.add("CSV")

读取数据

要从 Julia 中的 CSV 文件读取数据,我们需要使用CSV 包中的read()方法,如下所示 -

julia> using CSV
julia> CSV.read("C://Users//Leekha//Desktop//Iris.csv")
150×6 DataFrame
│ Row │  Id   │ SepalLengthCm │ SepalWidthCm │ PetalLengthCm │ PetalWidthCm │ Species        │
│     │ Int64 │      Float64  │     Float64  │     Float64   │    Float64   │ String         │
├─────┼───────┼───────────────┼──────────────┼───────────────┼──────────────┼─────────-------┤
│  1  │   1   │      5.1      │     3.5      │     1.4       │    0.2       │ Iris-setosa    │
│  2  │   2   │      4.9      │     3.0      │     1.4       │    0.2       │ Iris-setosa    │
│  3  │   3   │      4.7      │     3.2      │     1.3       │    0.2       │ Iris-setosa    │
│  4  │   4   │      4.6      │     3.1      │     1.5       │    0.2       │ Iris-setosa    │
│  5  │   5   │      5.0      │     3.6      │     1.4       │    0.2       │ Iris-setosa    │
│  6  │   6   │      5.4      │     3.9      │     1.7       │    0.4       │ Iris-setosa    │
│  7  │   7   │      4.6      │     3.4      │     1.4       │    0.3       │ Iris-setosa    │
│  8  │   8   │      5.0      │     3.4      │     1.5       │    0.2       │ Iris-setosa    │
│  9  │   9   │      4.4      │     2.9      │     1.4       │    0.2       │ Iris-setosa    │
│  10 │   10  │      4.9      │     3.1      │     1.5       │    0.1       │ Iris-setosa    │
⋮
│ 140 │ 140   │      6.9      │     3.1      │     5.4       │    2.1       │ Iris-virginica │
│ 141 │ 141   │      6.7      │     3.1      │     5.6       │    2.4       │ Iris-virginica │
│ 142 │ 142   │      6.9      │     3.1      │     5.1       │    2.3       │ Iris-virginica │
│ 143 │ 143   │      5.8      │     2.7      │     5.1       │    1.9       │ Iris-virginica │
│ 144 │ 144   │      6.8      │     3.2      │     5.9       │    2.3       │ Iris-virginica │
│ 145 │ 145   │      6.7      │     3.3      │     5.7       │    2.5       │ Iris-virginica │
│ 146 │ 146   │      6.7      │     3.0      │     5.2       │    2.3       │ Iris-virginica │
│ 147 │ 147   │      6.3      │     2.5      │     5.0       │    1.9       │ Iris-virginica │
│ 148 │ 148   │      6.5      │     3.0      │     5.2       │    2.0       │ Iris-virginica │
│ 149 │ 149   │      6.2      │     3.4      │     5.4       │    2.3       │ Iris-virginica │
│ 150 │ 150   │      5.9      │     3.0      │     5.1       │    1.8       │ Iris-virginica │

创建新的 CSV 文件

要创建新的 CSV 文件,我们需要使用CSV 包中的touch()命令。我们还需要使用 DataFrames 包将新创建的内容写入新的 CSV 文件 -

julia> using DataFrames
julia> using CSV
julia> touch("1234.csv")
"1234.csv"

julia> new = open("1234.csv", "w")
IOStream(<file 1234.csv>)

julia> new_data = DataFrame(Name = ["Gaurav", "Rahul", "Aarav", "Raman", "Ravinder"],
                  RollNo = [1, 2, 3, 4, 5],
                  Marks = [54, 67, 90, 23, 95])
                  
5×3 DataFrame
│ Row │  Name    │ RollNo │ Marks │
│     │  String  │ Int64  │ Int64 │
├─────┼──────────┼────────┼───────┤
│ 1   │  Gaurav  │   1    │   54  │
│ 2   │  Rahul   │   2    │   67  │
│ 3   │   Aarav  │   3    │   90  │
│ 4   │   Raman  │   4    │   23  │
│ 5   │ Ravinder │   5    │   95  │

julia> CSV.write("1234.csv", new_data)
"1234.csv"

julia> CSV.read("1234.csv")
5×3 DataFrame
│ Row │    Name  │ RollNo │ Marks │
│     │  String  │ Int64  │ Int64 │
├─────┼──────────┼────────┼───────┤
│   1 │   Gaurav │   1    │   54  │
│   2 │   Rahul  │   2    │   67  │
│   3 │   Aarav  │   3    │   90  │
│   4 │   Raman  │   4    │   23  │
│   5 │ Ravinder │   5    │   95  │

HDF5

HDF5 的完整形式是分层数据格式 v5。以下是它的一些属性 -

  • “组”类似于目录,“数据集”类似于文件。

  • 为了将元数据与特定组关联起来,它使用属性。

  • 它对不同的对象使用 ASCII 名称。

  • 语言包装器通常被称为“低级”或“高级”。

打开HDF5文件

HDF5 文件可以使用 h5open 命令打开,如下所示 -

fid = h5open(filename, mode)

下表描述了该模式 -

车号 模式及含义
1

“r”

只读

2

“r+”

读写- 它将保留任何现有内容。

3

“CW”

读写- 如果文件不存在,它将创建文件。

它还将保留现有内容。

4

“w”

读写- 它将破坏任何现有内容。

上面的命令将生成一个HDF5File类型的对象和抽象类型DataFile的子类型。

关闭 HDF5 文件

完成文件后,我们应该按如下方式关闭它 -

close(fid)

它还将关闭文件中的所有对象。

打开 HDF5 对象

假设如果我们有一个名为fid的文件对象,并且它有一个名为object1的组,则可以按如下方式打开它 -

Obj1 = fid[“object1”]

关闭 HDF5 对象

close(obj1)

读取数据

组“ g ”包含路径为“ dtset ”的数据集,我们已将数据集打开为dset1 = g[dtset]。我们可以通过以下方式读取信息 -

ABC = read(dset1)
ABC = read(g, "dtset")
Asub = dset1[2:3, 1:3]

写入数据

我们可以按如下方式创建数据集 -

g["dset1"] = rand(3,5)
write(g, "dset1", rand(3,5))

XML 文件

这里我们将讨论LightXML.jl包,它是libxml2的轻量级 Julia 包装器。它提供以下功能 -

  • 解析 XML 文件

  • 访问 XML 树结构

  • 创建 XML 树

  • 将 XML 树导出为字符串

例子

假设我们有一个名为 new.xml 的 xml 文件,如下所示 -

<Hello>
      <to>Gaurav</to>
      <from>Rahul</from>
      <heading>Reminder to meet</heading>
      <body>Friend, Don't forget to meet this weekend!</body>
</Hello>

现在,我们可以使用LightXML解析该文件,如下所示 -

julia> using LightXML
#below code will parse this xml file
julia> xdoc = parse_file("C://Users//Leekha//Desktop//new.xml")
<?xml version="1.0" encoding="utf-8"?>
<Hello>
<to>Gaurav</to>
<from>Rahul</from>
<heading>Reminder to meet</heading>
<body>Friend, Don't forget to meet this weekend!</body>
</Hello>

以下示例解释了如何获取根元素 -

julia> xroot = root(xdoc);
julia> println(name(xroot))
Hello
#Traversing all the child nodes and also print element names
julia> for c in child_nodes(xroot) # c is an instance of XMLNode
            println(nodetype(c))
            if is_elementnode(c)
               e = XMLElement(c) # this makes an XMLElement instance
               println(name(e))
            end
         end
3
1
to
3
1
from
3
1
heading
3
1
body
3

R数据集

Julia 的 RDatasets.jl 包提供了简单的方法来使用和试验 R 核心中提供的大多数标准数据集。要加载和使用 RDatasets 包中包含的数据集之一,我们需要安装 RDatasets,如下所示-

julia> using Pkg
julia> Pkg.add("RDatasets")

对数据进行子集化

例如,我们将在mlmRev组中使用Gcsemv数据集,如下所示 -

julia> GetData = dataset("mlmRev","Gcsemv");
julia> summary(GetData);
julia> head(GetData)
6×5 DataFrame
│ Row │     School   │     Student  │     Gender   │  Written │   Course │
│     │ Categorical… │ Categorical… │ Categorical… │ Float64⍰ │ Float64⍰ │
├─────┼──────────────┼──────────────┼──────────────┼──────────┼──────────┤
│   1 │     20920    │      16      │      M       │  23.0    │  missing │
│   2 │     20920    │      25      │      F       │  missing │   71.2   │
│   3 │     20920    │      27      │      F       │  39.0    │   76.8   │
│   4 │     20920    │      31      │      F       │  36.0    │   87.9   │
│   5 │     20920    │      42      │      M       │  16.0    │   44.4   │
│   6 │     20920    │      62      │      F       │  36.0    │  missing │

我们可以选择特定学校的数据如下 -

julia> GetData[GetData[:School] .== "68137", :]
104×5 DataFrame
│ Row │     School   │     Student  │     Gender   │  Written │   Course │
│     │ Categorical… │ Categorical… │ Categorical… │ Float64⍰ │ Float64⍰ │
├─────┼──────────────┼──────────────┼──────────────┼──────────┼──────────┤
│  1  │     68137    │      1       │     F        │   18.0   │   56.4   │
│  2  │     68137    │      2       │     F        │   23.0   │   55.5   │
│  3  │     68137    │      3       │     F        │   25.0   │  missing │
│  4  │     68137    │      4       │     F        │   29.0   │   73.1   │
│  5  │     68137    │      5       │     F        │  missing │   66.6   │
│  6  │     68137    │      9       │     F        │   20.0   │   60.1   │
│  7  │     68137    │     11       │     F        │   34.0   │   63.8   │
│  8  │     68137    │     12       │     F        │   60.0   │   89.8   │
│  9  │     68137    │     13       │     F        │   44.0   │   76.8   │
│  10 │     68137    │     14       │     F        │   20.0   │   58.3   │
⋮
│ 94  │     68137    │     252      │     M        │  missing │   75.9   │
│ 95  │     68137    │     254      │     M        │     35.0 │ missing  │
│ 96  │     68137    │     255      │     M        │     36.0 │   62.0   │
│ 97  │     68137    │     258      │     M        │     23.0 │   61.1   │
│ 98  │     68137    │     260      │     M        │     25.0 │ missing  │
│ 99  │     68137    │     261      │     M        │     46.0 │    89.8  │
│ 100 │     68137    │     264      │     M        │     50.0 │    70.3  │
│ 101 │     68137    │     268      │     M        │     15.0 │    43.5  │
│ 102 │     68137    │     270      │     M        │  missing │    73.1  │
│ 103 │     68137    │     272      │     M        │     43.0 │    78.7  │
│ 104 │     68137    │     273      │     M        │     35.0 │    60.1  │

对数据进行排序

借助sort!()函数,我们可以对数据进行排序。例如,在这里我们将以考试成绩升序对数据集进行排序 -

julia> sort!(GetData, cols=[:Written])
1905×5 DataFrame
│ Row  │       School │      Student │       Gender │  Written │   Course │
│      │ Categorical… │ Categorical… │ Categorical… │ Float64⍰ │ Float64⍰ │
├──────┼──────────────┼──────────────┼──────────────┼──────────┼──────────┤
│  1   │    22710     │       77     │     F        │    0.6   │   41.6   │
│  2   │    68137     │       65     │     F        │    2.5   │   50.0   │
│  3   │    22520     │       115    │     M        │    3.1   │   9.25   │
│  4   │    68137     │       80     │     F        │    4.3   │   50.9   │
│  5   │    68137     │       79     │     F        │    7.5   │   27.7   │
│  6   │    22710     │       57     │     F        │    11.0  │   73.1   │
│  7   │    64327     │       19     │     F        │    11.0  │   87.0   │
│  8   │    68137     │       85     │     F        │    11.0  │   27.7   │
│  9   │    68137     │       97     │     F        │    11.0  │   57.4   │
│ 10   │    68137     │       100    │     F        │    11.0  │   61.1   │
⋮
│ 1895 │    74874     │       83     │     F        │ missing  │    81.4  │
│ 1896 │    74874     │       86     │     F        │ missing  │    92.5  │
│ 1897 │    76631     │       79     │     F        │ missing  │    84.2  │
│ 1898 │    76631     │       193    │     M        │ missing  │    72.2  │
│ 1899 │    76631     │       221    │     F        │ missing  │    76.8  │
│ 1900 │    77207     │       5001   │     F        │ missing  │    82.4  │
│ 1901 │    77207     │       5062   │     M        │ missing  │    75.0  │
│ 1902 │    77207     │       5063   │     F        │ missing  │    79.6  │
│ 1903 │    84772     │       17     │     M        │ missing  │    88.8  │
│ 1904 │    84772     │       49     │     M        │ missing  │    74.0  │
│ 1905 │    84772     │       85     │     F        │ missing  │    90.7  │

朱莉娅的统计数据

为了进行统计,Julia 有StatsBase.jl包,提供了进行简单统计的简单方法。要使用统计数据,我们需要安装 StatsBase 包,如下所示 -

julia> using Pkg
julia> Pkg.add("StatsBase")

简单统计

Julia 提供了定义权重和计算平均值的方法。

我们可以使用weights()函数来定义权重向量,如下所示 -

julia> WV = Weights([10.,11.,12.])
3-element Weights{Float64,Float64,Array{Float64,1}}:
 10.0
 11.0
 12.0

您可以使用 isempty() 函数检查权重向量是否为空 -

julia> isempty(WV)
false

我们可以借助 eltype() 函数检查权重向量的类型,如下所示 -

julia> eltype(WV)
Float64

我们可以借助 length() 函数检查权重向量的长度,如下所示 -

julia> length(WV)
3

有不同的方法来计算平均值-

  • 调和平均值- 我们可以使用Harmmean()函数来计算调和平均值。

julia> A = [3, 5, 6, 7, 8, 2, 9, 10]
8-element Array{Int64,1}:
 3
 5
 6
 7
 8
 2
 9
 10
julia> harmmean(A)
4.764831009217679
  • 几何平均值- 我们可以使用geomean()函数来计算几何平均值。

julia> geomean(A)
5.555368605381863
  • 一般平均值- 我们可以使用mean()函数来计算一般平均值。

julia> mean(A)
6.25

描述性统计

这是提取和分析信息的统计学学科。这些信息解释了数据的本质。

计算方差

我们可以使用var()函数来计算向量的方差,如下所示 -

julia> B = [1., 2., 3., 4., 5.];
julia> var(B)
2.5

计算加权方差

我们可以计算向量 x 与权重向量的加权方差,如下所示 -

julia> B = [1., 2., 3., 4., 5.];
julia> a = aweights([4., 2., 1., 3., 1.])
5-element AnalyticWeights{Float64,Float64,Array{Float64,1}}:
 4.0
 2.0
 1.0
 3.0
 1.0
julia> var(B, a)
2.066115702479339

计算标准差

我们可以使用std()函数来计算向量的标准方差,如下所示 -

julia> std(B)
1.5811388300841898

计算加权标准差

我们可以计算向量 x 与权重向量的加权标准差,如下所示 -

julia> std(B,a)
1.4373989364401725

计算平均值和标准差

我们可以在单个命令中计算平均值和标准差,如下所示 -

julia> mean_and_std(B,a)
(2.5454545454545454, 1.4373989364401725)

计算均值和方差

我们可以在单个命令中计算均值和方差,如下所示 -

julia> mean_and_var(B,a)
(2.5454545454545454, 2.066115702479339)

样本和估计

它可以被定义为统计学的学科,为了进行分析,将从大量人口集中选择样本单位。

以下是我们进行采样的方法 -

随机抽样是最简单的抽样方法。在此,我们从数组中抽取一个随机元素,即总体集。用于此目的的函数是sample()

例子

julia> A = [8.,12.,23.,54.5]
4-element Array{Float64,1}:
 8.0
 12.0
 23.0
 54.5
julia> sample(A)
12.0

接下来,我们可以取“n”个元素作为随机样本。

例子

julia> A = [8.,12.,23.,54.5]
4-element Array{Float64,1}:
 8.0
 12.0
 23.0
 54.5
julia> sample(A, 2)
2-element Array{Float64,1}:
 23.0
 54.5

我们还可以将采样的元素写入长度为“n”的预分配元素。执行此任务的函数是sample!()

例子

julia> B = [1., 2., 3., 4., 5.];
julia> X = [2., 1., 3., 2., 5.];
julia> sample!(B,X)
5-element Array{Float64,1}:
 2.0
 2.0
 4.0
 1.0
 3.0

另一种方法是进行直接采样,它将从总体集中随机选取数字并将它们存储在另一个数组中。执行此任务的函数是direct_sample!()

例子

julia> StatsBase.direct_sample!(B, X)
5-element Array{Float64,1}:
 1.0
 4.0
 4.0
 4.0
 5.0

Knuth 算法是另一种无需替换地进行随机采样的方法。

例子

julia> StatsBase.knuths_sample!(B, X)
5-element Array{Float64,1}:
 5.0
 3.0
 4.0
 2.0
 1.0