daru 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.build.sh +6 -6
- data/.gitignore +2 -0
- data/CONTRIBUTING.md +7 -3
- data/History.md +36 -0
- data/README.md +21 -13
- data/Rakefile +16 -1
- data/benchmarks/TradeoffData.csv +65 -0
- data/benchmarks/dataframe_creation.rb +39 -0
- data/benchmarks/group_by.rb +32 -0
- data/benchmarks/row_access.rb +41 -0
- data/benchmarks/row_assign.rb +36 -0
- data/benchmarks/sorting.rb +44 -0
- data/benchmarks/vector_access.rb +31 -0
- data/benchmarks/vector_assign.rb +42 -0
- data/benchmarks/where_clause.rb +48 -0
- data/benchmarks/where_vs_filter.rb +28 -0
- data/daru.gemspec +29 -5
- data/lib/daru.rb +30 -1
- data/lib/daru/accessors/array_wrapper.rb +2 -2
- data/lib/daru/accessors/nmatrix_wrapper.rb +6 -6
- data/lib/daru/core/group_by.rb +112 -31
- data/lib/daru/core/merge.rb +170 -0
- data/lib/daru/core/query.rb +95 -0
- data/lib/daru/dataframe.rb +335 -223
- data/lib/daru/date_time/index.rb +550 -0
- data/lib/daru/date_time/offsets.rb +397 -0
- data/lib/daru/index.rb +266 -54
- data/lib/daru/io/io.rb +1 -2
- data/lib/daru/maths/arithmetic/dataframe.rb +2 -2
- data/lib/daru/maths/arithmetic/vector.rb +2 -2
- data/lib/daru/maths/statistics/dataframe.rb +58 -8
- data/lib/daru/maths/statistics/vector.rb +229 -0
- data/lib/daru/vector.rb +230 -80
- data/lib/daru/version.rb +1 -1
- data/spec/core/group_by_spec.rb +16 -16
- data/spec/core/merge_spec.rb +52 -0
- data/spec/core/query_spec.rb +171 -0
- data/spec/dataframe_spec.rb +278 -280
- data/spec/date_time/data_spec.rb +199 -0
- data/spec/date_time/index_spec.rb +433 -0
- data/spec/date_time/offsets_spec.rb +371 -0
- data/spec/fixtures/stock_data.csv +500 -0
- data/spec/index_spec.rb +317 -11
- data/spec/io/io_spec.rb +18 -17
- data/spec/math/arithmetic/dataframe_spec.rb +3 -3
- data/spec/math/statistics/dataframe_spec.rb +39 -1
- data/spec/math/statistics/vector_spec.rb +163 -1
- data/spec/monkeys_spec.rb +4 -0
- data/spec/spec_helper.rb +3 -0
- data/spec/vector_spec.rb +125 -60
- metadata +71 -14
- data/lib/daru/accessors/dataframe_by_vector.rb +0 -17
- data/lib/daru/multi_index.rb +0 -216
- data/spec/multi_index_spec.rb +0 -216
data/lib/daru/version.rb
CHANGED
data/spec/core/group_by_spec.rb
CHANGED
@@ -13,23 +13,23 @@ describe Daru::Core::GroupBy do
|
|
13
13
|
@dl_group = @df.group_by([:a, :b])
|
14
14
|
@tl_group = @df.group_by([:a,:b,:c])
|
15
15
|
|
16
|
-
@sl_index = Daru::Index.new([
|
17
|
-
@dl_multi_index = Daru::MultiIndex.
|
18
|
-
[
|
19
|
-
[
|
20
|
-
[
|
21
|
-
[
|
22
|
-
[
|
23
|
-
[
|
16
|
+
@sl_index = Daru::Index.new(['bar', 'foo'])
|
17
|
+
@dl_multi_index = Daru::MultiIndex.from_tuples([
|
18
|
+
['bar', 'one'],
|
19
|
+
['bar', 'three'],
|
20
|
+
['bar', 'two'],
|
21
|
+
['foo', 'one'],
|
22
|
+
['foo', 'three'],
|
23
|
+
['foo', 'two']
|
24
24
|
])
|
25
|
-
@tl_multi_index = Daru::MultiIndex.
|
26
|
-
[
|
27
|
-
[
|
28
|
-
[
|
29
|
-
[
|
30
|
-
[
|
31
|
-
[
|
32
|
-
[
|
25
|
+
@tl_multi_index = Daru::MultiIndex.from_tuples([
|
26
|
+
['bar', 'one' , 2],
|
27
|
+
['bar', 'three', 1],
|
28
|
+
['bar', 'two' , 6],
|
29
|
+
['foo', 'one' , 1],
|
30
|
+
['foo', 'one' , 3],
|
31
|
+
['foo', 'three', 8],
|
32
|
+
['foo', 'two' , 3]
|
33
33
|
])
|
34
34
|
end
|
35
35
|
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Daru::DataFrame do
|
4
|
+
context "#join" do
|
5
|
+
before do
|
6
|
+
@left = Daru::DataFrame.new({
|
7
|
+
:id => [1,2,3,4],
|
8
|
+
:name => ['Pirate', 'Monkey', 'Ninja', 'Spaghetti']
|
9
|
+
})
|
10
|
+
@right = Daru::DataFrame.new({
|
11
|
+
:id => [1,2,3,4],
|
12
|
+
:name => ['Rutabaga', 'Pirate', 'Darth Vader', 'Ninja']
|
13
|
+
})
|
14
|
+
end
|
15
|
+
|
16
|
+
it "performs an inner join of two dataframes" do
|
17
|
+
answer = Daru::DataFrame.new({
|
18
|
+
:id_1 => [1,3],
|
19
|
+
:name => ['Pirate', 'Ninja'],
|
20
|
+
:id_2 => [2,4]
|
21
|
+
}, order: [:id_1, :name, :id_2])
|
22
|
+
expect(@left.join(@right, how: :inner, on: [:name])).to eq(answer)
|
23
|
+
end
|
24
|
+
|
25
|
+
it "performs a full outer join" do
|
26
|
+
answer = Daru::DataFrame.new({
|
27
|
+
:id_1 => [1,2,3,4,nil,nil],
|
28
|
+
:name => ['Pirate', 'Monkey', 'Ninja', 'Spaghetti','Rutabaga', 'Darth Vader'],
|
29
|
+
:id_2 => [2,nil,4,nil,1,3]
|
30
|
+
}, order: [:id_1, :name, :id_2])
|
31
|
+
expect(@left.join(@right, how: :outer, on: [:name])).to eq(answer)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "performs a left outer join", focus: true do
|
35
|
+
answer = Daru::DataFrame.new({
|
36
|
+
:id_1 => [1,2,3,4],
|
37
|
+
:name => ['Pirate', 'Monkey', 'Ninja', 'Spaghetti'],
|
38
|
+
:id_2 => [2,nil,4,nil]
|
39
|
+
}, order: [:id_1, :name, :id_2])
|
40
|
+
expect(@left.join(@right, how: :left, on: [:name])).to eq(answer)
|
41
|
+
end
|
42
|
+
|
43
|
+
it "performs a right outer join" do
|
44
|
+
answer = Daru::DataFrame.new({
|
45
|
+
:id_1 => [nil,1,nil,3],
|
46
|
+
:name => ['Rutabaga','Pirate', 'Darth Vader', 'Ninja'],
|
47
|
+
:id_2 => [1,2,3,4]
|
48
|
+
}, order: [:id_1, :name, :id_2])
|
49
|
+
expect(@left.join(@right, how: :right, on: [:name])).to eq(answer)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,171 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Daru::Core::Query::BoolArray do
|
4
|
+
before do
|
5
|
+
@klass = Daru::Core::Query::BoolArray
|
6
|
+
@left = @klass.new([true, true, true, false, false, true])
|
7
|
+
@right = @klass.new([false, false, false, false, true, false])
|
8
|
+
end
|
9
|
+
|
10
|
+
context "#&" do
|
11
|
+
it "computes and logic of each element in the array" do
|
12
|
+
expect(@left & @right).to eq(
|
13
|
+
@klass.new([false, false, false, false, false, false]))
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
context "#|" do
|
18
|
+
it "computes or logic of each element in arrays" do
|
19
|
+
expect(@left | @right).to eq(
|
20
|
+
@klass.new([true, true, true, false, true, true]))
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "#!" do
|
25
|
+
it "computes not logic of each element" do
|
26
|
+
expect(!@left).to eq(
|
27
|
+
@klass.new([false, false, false, true, true, false])
|
28
|
+
)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe "Arel-like syntax" do
|
34
|
+
describe "comparison operators" do
|
35
|
+
describe Daru::Vector do
|
36
|
+
before do
|
37
|
+
@vector = Daru::Vector.new([23,51,1214,352,32,11])
|
38
|
+
@comparator = Daru::Vector.new([45,22,1214,55,32,9])
|
39
|
+
@klass = Daru::Core::Query::BoolArray
|
40
|
+
end
|
41
|
+
|
42
|
+
context "#eq" do
|
43
|
+
it "accepts scalar value" do
|
44
|
+
expect(@vector.eq(352)).to eq(
|
45
|
+
@klass.new([false,false,false,true,false,false]))
|
46
|
+
end
|
47
|
+
|
48
|
+
it "accepts vector and compares corrensponding elements" do
|
49
|
+
expect(@vector.eq(@comparator)).to eq(
|
50
|
+
@klass.new([false,false,true,false,true,false]))
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
context "#not_eq" do
|
55
|
+
it "accepts scalar value" do
|
56
|
+
expect(@vector.not_eq(51)).to eq(
|
57
|
+
@klass.new([true, false, true, true, true, true]))
|
58
|
+
end
|
59
|
+
|
60
|
+
it "accepts vector and compares corrensponding elements" do
|
61
|
+
expect(@vector.not_eq(@comparator)).to eq(
|
62
|
+
@klass.new([true, true, false, true, false, true]))
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
context "#lt" do
|
67
|
+
it "accepts scalar value" do
|
68
|
+
expect(@vector.lt(51)).to eq(
|
69
|
+
@klass.new([true, false, false, false, true, true]))
|
70
|
+
end
|
71
|
+
|
72
|
+
it "accepts vector and compares corrensponding elements" do
|
73
|
+
expect(@vector.lt(@comparator)).to eq(
|
74
|
+
@klass.new([true,false,false,false,false,false]))
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
context "#lteq" do
|
79
|
+
it "accepts scalar value" do
|
80
|
+
expect(@vector.lteq(51)).to eq(
|
81
|
+
@klass.new([true, true, false, false, true, true]))
|
82
|
+
end
|
83
|
+
|
84
|
+
it "accepts vector and compares corrensponding elements" do
|
85
|
+
expect(@vector.lteq(@comparator)).to eq(
|
86
|
+
@klass.new([true,false,true,false,true,false]))
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
context "#mt" do
|
91
|
+
it "accepts scalar value" do
|
92
|
+
expect(@vector.mt(51)).to eq(
|
93
|
+
@klass.new([false, false, true, true, false, false]))
|
94
|
+
end
|
95
|
+
|
96
|
+
it "accepts vector and compares corrensponding elements" do
|
97
|
+
expect(@vector.mt(@comparator)).to eq(
|
98
|
+
@klass.new([false,true,false,true,false,true]))
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
context "#mteq" do
|
103
|
+
it "accepts scalar value" do
|
104
|
+
expect(@vector.mteq(51)).to eq(
|
105
|
+
@klass.new([false, true, true, true, false, false]))
|
106
|
+
end
|
107
|
+
|
108
|
+
it "accepts vector and compares corrensponding elements" do
|
109
|
+
expect(@vector.mteq(@comparator)).to eq(
|
110
|
+
@klass.new([false,true,true,true,true,true]))
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
context "#in" do
|
115
|
+
it "checks if any of elements in the arg are present in the vector" do
|
116
|
+
expect(@vector.in([23,55,1,33,32])).to eq(
|
117
|
+
@klass.new([true, false, false, false, true, false]))
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
describe "where clause" do
|
124
|
+
context Daru::DataFrame do
|
125
|
+
before do
|
126
|
+
@df = Daru::DataFrame.new({
|
127
|
+
number: [1,2,3,4,5,6],
|
128
|
+
sym: [:one, :two, :three, :four, :five, :six],
|
129
|
+
names: ['sameer', 'john', 'james', 'omisha', 'priyanka', 'shravan']
|
130
|
+
})
|
131
|
+
end
|
132
|
+
|
133
|
+
it "accepts simple single eq statement" do
|
134
|
+
answer = Daru::DataFrame.new({
|
135
|
+
number: [4],
|
136
|
+
sym: [:four],
|
137
|
+
names: ['omisha']
|
138
|
+
}, index: Daru::Index.new([3])
|
139
|
+
)
|
140
|
+
expect(@df.where(@df[:number].eq(4))).to eq(answer)
|
141
|
+
end
|
142
|
+
|
143
|
+
it "accepts somewhat complex comparison operator chaining" do
|
144
|
+
answer = Daru::DataFrame.new({
|
145
|
+
number: [3,4],
|
146
|
+
sym: [:three, :four],
|
147
|
+
names: ['james', 'omisha']
|
148
|
+
}, index: Daru::Index.new([2,3]))
|
149
|
+
expect(
|
150
|
+
@df.where (@df[:names].eq('james') | @df[:sym].eq(:four))
|
151
|
+
).to eq(answer)
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
155
|
+
context Daru::Vector do
|
156
|
+
before do
|
157
|
+
@vector = Daru::Vector.new([2,5,1,22,51,4])
|
158
|
+
end
|
159
|
+
|
160
|
+
it "accepts a simple single statement" do
|
161
|
+
expect(@vector.where(@vector.lt(10))).to eq(
|
162
|
+
Daru::Vector.new([2,5,1,4], index: Daru::Index.new([0,1,2,5])))
|
163
|
+
end
|
164
|
+
|
165
|
+
it "accepts somewhat complex operator chaining" do
|
166
|
+
expect(@vector.where((@vector.lt(6) | @vector.eq(51)))).to eq(
|
167
|
+
Daru::Vector.new([2,5,1,51,4], index: Daru::Index.new([0,1,2,4,5])))
|
168
|
+
end
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|
data/spec/dataframe_spec.rb
CHANGED
@@ -20,12 +20,12 @@ describe Daru::DataFrame do
|
|
20
20
|
[:c,:two,:foo],
|
21
21
|
[:c,:two,:bar]
|
22
22
|
]
|
23
|
-
@multi_index = Daru::MultiIndex.
|
23
|
+
@multi_index = Daru::MultiIndex.from_tuples(tuples)
|
24
24
|
|
25
25
|
@vector_arry1 = [11,12,13,14,11,12,13,14,11,12,13,14]
|
26
26
|
@vector_arry2 = [1,2,3,4,1,2,3,4,1,2,3,4]
|
27
27
|
|
28
|
-
@order_mi = Daru::MultiIndex.
|
28
|
+
@order_mi = Daru::MultiIndex.from_tuples([
|
29
29
|
[:a,:one,:bar],
|
30
30
|
[:a,:two,:baz],
|
31
31
|
[:b,:two,:foo],
|
@@ -54,7 +54,7 @@ describe Daru::DataFrame do
|
|
54
54
|
|
55
55
|
expect(df.index) .to eq(Daru::Index.new [0,1,2,3])
|
56
56
|
expect(df.vectors) .to eq(Daru::Index.new [:a,:b,:c,:d,:e])
|
57
|
-
expect(df
|
57
|
+
expect(df[:a]) .to eq(Daru::Vector.new [1,1,1,1])
|
58
58
|
end
|
59
59
|
|
60
60
|
it "creates a DataFrame from Vector rows" do
|
@@ -64,17 +64,18 @@ describe Daru::DataFrame do
|
|
64
64
|
|
65
65
|
expect(df.index) .to eq(Daru::Index.new [0,1,2,3])
|
66
66
|
expect(df.vectors) .to eq(Daru::Index.new [:a,:b,:c,:d,:e])
|
67
|
-
expect(df
|
67
|
+
expect(df[:a]) .to eq(Daru::Vector.new [1,1,1,1])
|
68
68
|
end
|
69
69
|
end
|
70
70
|
|
71
71
|
context Daru::MultiIndex do
|
72
72
|
it "creates a DataFrame from rows" do
|
73
|
-
df = Daru::DataFrame.rows(
|
73
|
+
df = Daru::DataFrame.rows(
|
74
|
+
@rows*3, index: @multi_index, order: [:a,:b,:c,:d,:e])
|
74
75
|
|
75
76
|
expect(df.index) .to eq(@multi_index)
|
76
77
|
expect(df.vectors) .to eq(Daru::Index.new([:a,:b,:c,:d,:e]))
|
77
|
-
expect(df
|
78
|
+
expect(df[:a]).to eq(Daru::Vector.new([1]*12, index: @multi_index))
|
78
79
|
end
|
79
80
|
|
80
81
|
it "crates a DataFrame from rows (MultiIndex order)" do
|
@@ -84,7 +85,7 @@ describe Daru::DataFrame do
|
|
84
85
|
[13, 3, 13, 3],
|
85
86
|
[14, 4, 14, 4]
|
86
87
|
]
|
87
|
-
index = Daru::MultiIndex.
|
88
|
+
index = Daru::MultiIndex.from_tuples([
|
88
89
|
[:one,:bar],
|
89
90
|
[:one,:baz],
|
90
91
|
[:two,:foo],
|
@@ -94,7 +95,7 @@ describe Daru::DataFrame do
|
|
94
95
|
df = Daru::DataFrame.rows(rows, index: index, order: @order_mi)
|
95
96
|
expect(df.index) .to eq(index)
|
96
97
|
expect(df.vectors).to eq(@order_mi)
|
97
|
-
expect(df
|
98
|
+
expect(df[:a, :one, :bar]).to eq(Daru::Vector.new([11,12,13,14],
|
98
99
|
index: index))
|
99
100
|
end
|
100
101
|
|
@@ -106,7 +107,7 @@ describe Daru::DataFrame do
|
|
106
107
|
|
107
108
|
expect(df.index).to eq(Daru::Index.new(Array.new(rows.size) { |i| i }))
|
108
109
|
expect(df.vectors).to eq(@multi_index)
|
109
|
-
expect(df
|
110
|
+
expect(df[:a,:one,:bar]).to eq(Daru::Vector.new([1]*12))
|
110
111
|
end
|
111
112
|
end
|
112
113
|
end
|
@@ -275,7 +276,7 @@ describe Daru::DataFrame do
|
|
275
276
|
expect(df[:c].object_id).to eq(c.object_id)
|
276
277
|
end
|
277
278
|
|
278
|
-
it "allows creation of empty dataframe with only order"
|
279
|
+
it "allows creation of empty dataframe with only order" do
|
279
280
|
df = Daru::DataFrame.new({}, order: [:a, :b, :c])
|
280
281
|
df[:a] = Daru::Vector.new([1,2,3,4,5,6])
|
281
282
|
|
@@ -317,7 +318,7 @@ describe Daru::DataFrame do
|
|
317
318
|
df = Daru::DataFrame.new({}, order: @order_mi)
|
318
319
|
|
319
320
|
expect(df.vectors).to eq(@order_mi)
|
320
|
-
expect(df
|
321
|
+
expect(df[:a, :one, :bar]).to eq(Daru::Vector.new([]))
|
321
322
|
end
|
322
323
|
|
323
324
|
it "creates from Hash" do
|
@@ -330,7 +331,7 @@ describe Daru::DataFrame do
|
|
330
331
|
|
331
332
|
expect(df.index) .to eq(@multi_index)
|
332
333
|
expect(df.vectors) .to eq(@order_mi)
|
333
|
-
expect(df
|
334
|
+
expect(df[:a,:one,:bar]).to eq(Daru::Vector.new(@vector_arry1,
|
334
335
|
index: @multi_index))
|
335
336
|
end
|
336
337
|
|
@@ -344,7 +345,7 @@ describe Daru::DataFrame do
|
|
344
345
|
|
345
346
|
expect(df.index) .to eq(@multi_index)
|
346
347
|
expect(df.vectors).to eq(@order_mi)
|
347
|
-
expect(df
|
348
|
+
expect(df[:a, :one, :bar]).to eq(Daru::Vector.new(@vector_arry1,
|
348
349
|
index: @multi_index))
|
349
350
|
end
|
350
351
|
|
@@ -358,19 +359,19 @@ describe Daru::DataFrame do
|
|
358
359
|
it "aligns MultiIndexes properly" do
|
359
360
|
pending
|
360
361
|
mi_a = @order_mi
|
361
|
-
mi_b = Daru::MultiIndex.
|
362
|
+
mi_b = Daru::MultiIndex.from_tuples([
|
362
363
|
[:b,:one,:foo],
|
363
364
|
[:a,:one,:bar],
|
364
365
|
[:b,:two,:foo],
|
365
366
|
[:a,:one,:baz]
|
366
367
|
])
|
367
|
-
mi_sorted = Daru::MultiIndex.
|
368
|
+
mi_sorted = Daru::MultiIndex.from_tuples([
|
368
369
|
[:a, :one, :bar],
|
369
370
|
[:a, :one, :baz],
|
370
371
|
[:b, :one, :foo],
|
371
372
|
[:b, :two, :foo]
|
372
373
|
])
|
373
|
-
order = Daru::MultiIndex.
|
374
|
+
order = Daru::MultiIndex.from_tuples([
|
374
375
|
[:pee, :que],
|
375
376
|
[:pee, :poo]
|
376
377
|
])
|
@@ -394,7 +395,7 @@ describe Daru::DataFrame do
|
|
394
395
|
end
|
395
396
|
end
|
396
397
|
|
397
|
-
context "#[
|
398
|
+
context "#[]" do
|
398
399
|
context Daru::Index do
|
399
400
|
before :each do
|
400
401
|
@df = Daru::DataFrame.new({b: [11,12,13,14,15], a: [1,2,3,4,5],
|
@@ -403,7 +404,7 @@ describe Daru::DataFrame do
|
|
403
404
|
end
|
404
405
|
|
405
406
|
it "returns a Vector" do
|
406
|
-
expect(@df[:a
|
407
|
+
expect(@df[:a]).to eq([1,2,3,4,5].dv(:a, [:one, :two, :three, :four, :five]))
|
407
408
|
end
|
408
409
|
|
409
410
|
it "returns a Vector by default" do
|
@@ -415,11 +416,11 @@ describe Daru::DataFrame do
|
|
415
416
|
temp = Daru::DataFrame.new({b: [11,12,13,14,15], a: [1,2,3,4,5]},
|
416
417
|
order: [:a, :b], index: [:one, :two, :three, :four, :five])
|
417
418
|
|
418
|
-
expect(@df[:a, :b
|
419
|
+
expect(@df[:a, :b]).to eq(temp)
|
419
420
|
end
|
420
421
|
|
421
422
|
it "accesses vector with Integer index" do
|
422
|
-
expect(@df[0
|
423
|
+
expect(@df[0]).to eq([1,2,3,4,5].dv(:a, [:one, :two, :three, :four, :five]))
|
423
424
|
end
|
424
425
|
|
425
426
|
it "returns a subset of DataFrame when specified range" do
|
@@ -432,41 +433,35 @@ describe Daru::DataFrame do
|
|
432
433
|
end
|
433
434
|
|
434
435
|
context Daru::MultiIndex do
|
435
|
-
|
436
|
-
|
437
|
-
|
438
|
-
|
439
|
-
context "#[:row]" do
|
440
|
-
context Daru::Index do
|
441
|
-
before :each do
|
442
|
-
@df = Daru::DataFrame.new({b: [11,12,13,14,15], a: [1,2,3,4,5],
|
443
|
-
c: [11,22,33,44,55]},
|
444
|
-
order: [:a, :b, :c],
|
445
|
-
index: [:one, :two, :three, :four, :five])
|
436
|
+
it "accesses vector with an integer index" do
|
437
|
+
expect(@df_mi[0]).to eq(
|
438
|
+
Daru::Vector.new(@vector_arry1, index: @multi_index))
|
446
439
|
end
|
447
440
|
|
448
|
-
it "returns a
|
449
|
-
expect(@
|
441
|
+
it "returns a vector when specifying full tuple" do
|
442
|
+
expect(@df_mi[:a, :one, :bar]).to eq(
|
443
|
+
Daru::Vector.new(@vector_arry1, index: @multi_index))
|
450
444
|
end
|
451
445
|
|
452
|
-
it "returns
|
453
|
-
|
446
|
+
it "returns DataFrame when specified first layer of MultiIndex" do
|
447
|
+
sub_order = Daru::MultiIndex.from_tuples([
|
448
|
+
[:one, :bar],
|
449
|
+
[:two, :baz]
|
450
|
+
])
|
451
|
+
expect(@df_mi[:a]).to eq(Daru::DataFrame.new([
|
452
|
+
@vector_arry1,
|
453
|
+
@vector_arry2
|
454
|
+
], index: @multi_index, order: sub_order))
|
454
455
|
end
|
455
456
|
|
456
|
-
it "returns a
|
457
|
-
|
458
|
-
|
459
|
-
|
460
|
-
expect(df[0, :row]).to eq([1,11,11].dv(nil, [:a, :b, :c]))
|
457
|
+
it "returns a Vector if the last level of MultiIndex is tracked" do
|
458
|
+
expect(@df_mi[:a, :one]).to eq(
|
459
|
+
Daru::Vector.new(@vector_arry1, index: @multi_index))
|
461
460
|
end
|
462
461
|
end
|
463
|
-
|
464
|
-
context Daru::MultiIndex do
|
465
|
-
# See #row
|
466
|
-
end
|
467
462
|
end
|
468
463
|
|
469
|
-
context "#[
|
464
|
+
context "#[]=" do
|
470
465
|
context Daru::Index do
|
471
466
|
before :each do
|
472
467
|
@df = Daru::DataFrame.new({b: [11,12,13,14,15], a: [1,2,3,4,5],
|
@@ -474,46 +469,55 @@ describe Daru::DataFrame do
|
|
474
469
|
index: [:one, :two, :three, :four, :five])
|
475
470
|
end
|
476
471
|
|
472
|
+
it "assigns directly with the []= operator" do
|
473
|
+
@data_frame[:a] = [100,200,300,400,500]
|
474
|
+
expect(@data_frame).to eq(Daru::DataFrame.new({
|
475
|
+
b: [11,12,13,14,15],
|
476
|
+
a: [100,200,300,400,500],
|
477
|
+
c: [11,22,33,44,55]}, order: [:a, :b, :c],
|
478
|
+
index: [:one, :two, :three, :four, :five]))
|
479
|
+
end
|
480
|
+
|
477
481
|
it "appends an Array as a Daru::Vector" do
|
478
|
-
@df[:d
|
482
|
+
@df[:d] = [69,99,108,85,49]
|
479
483
|
|
480
484
|
expect(@df.d.class).to eq(Daru::Vector)
|
481
485
|
end
|
482
486
|
|
483
487
|
it "replaces an already present vector" do
|
484
|
-
@df[:a
|
488
|
+
@df[:a] = [69,99,108,85,49].dv(nil, [:one, :two, :three, :four, :five])
|
485
489
|
|
486
490
|
expect(@df.a).to eq([69,99,108,85,49].dv(nil, [:one, :two, :three, :four, :five]))
|
487
491
|
end
|
488
492
|
|
489
493
|
it "appends a new vector to the DataFrame" do
|
490
|
-
@df[:woo
|
494
|
+
@df[:woo] = [69,99,108,85,49].dv(nil, [:one, :two, :three, :four, :five])
|
491
495
|
|
492
496
|
expect(@df.vectors).to eq([:a, :b, :c, :woo].to_index)
|
493
497
|
end
|
494
498
|
|
495
499
|
it "creates an index for the new vector if not specified" do
|
496
|
-
@df[:woo
|
500
|
+
@df[:woo] = [69,99,108,85,49]
|
497
501
|
|
498
502
|
expect(@df.woo.index).to eq([:one, :two, :three, :four, :five].to_index)
|
499
503
|
end
|
500
504
|
|
501
505
|
it "matches index of vector to be inserted with the DataFrame index" do
|
502
|
-
@df[:shankar
|
506
|
+
@df[:shankar] = [69,99,108,85,49].dv(:shankar, [:two, :one, :three, :five, :four])
|
503
507
|
|
504
508
|
expect(@df.shankar).to eq([99,69,108,49,85].dv(:shankar,
|
505
509
|
[:one, :two, :three, :four, :five]))
|
506
510
|
end
|
507
511
|
|
508
512
|
it "matches index of vector to be inserted, inserting nils where no match found" do
|
509
|
-
@df
|
513
|
+
@df[:shankar] = [1,2,3].dv(:shankar, [:one, :james, :hetfield])
|
510
514
|
|
511
515
|
expect(@df.shankar).to eq([1,nil,nil,nil,nil].dv(:shankar, [:one, :two, :three, :four, :five]))
|
512
516
|
end
|
513
517
|
|
514
518
|
it "raises error for Array assignment of wrong length" do
|
515
519
|
expect{
|
516
|
-
@df
|
520
|
+
@df[:shiva] = [1,2,3]
|
517
521
|
}.to raise_error
|
518
522
|
end
|
519
523
|
|
@@ -521,23 +525,6 @@ describe Daru::DataFrame do
|
|
521
525
|
# TODO
|
522
526
|
end
|
523
527
|
end
|
524
|
-
|
525
|
-
context Daru::MultiIndex do
|
526
|
-
pending
|
527
|
-
end
|
528
|
-
end
|
529
|
-
|
530
|
-
context "#[]=" do
|
531
|
-
context Daru::Index do
|
532
|
-
it "assigns directly with the []= operator" do
|
533
|
-
@data_frame[:a] = [100,200,300,400,500]
|
534
|
-
expect(@data_frame).to eq(Daru::DataFrame.new({
|
535
|
-
b: [11,12,13,14,15],
|
536
|
-
a: [100,200,300,400,500],
|
537
|
-
c: [11,22,33,44,55]}, order: [:a, :b, :c],
|
538
|
-
index: [:one, :two, :three, :four, :five]))
|
539
|
-
end
|
540
|
-
end
|
541
528
|
|
542
529
|
context Daru::MultiIndex do
|
543
530
|
it "raises error when incomplete index specified but index is absent" do
|
@@ -547,7 +534,6 @@ describe Daru::DataFrame do
|
|
547
534
|
end
|
548
535
|
|
549
536
|
it "assigns all sub-indexes when a top level index is specified" do
|
550
|
-
pending
|
551
537
|
@df_mi[:a] = [100,200,300,400,100,200,300,400,100,200,300,400]
|
552
538
|
|
553
539
|
expect(@df_mi).to eq(Daru::DataFrame.new([
|
@@ -558,8 +544,7 @@ describe Daru::DataFrame do
|
|
558
544
|
end
|
559
545
|
|
560
546
|
it "creates a new vector when full index specfied" do
|
561
|
-
|
562
|
-
order = Daru::MultiIndex.new([
|
547
|
+
order = Daru::MultiIndex.from_tuples([
|
563
548
|
[:a,:one,:bar],
|
564
549
|
[:a,:two,:baz],
|
565
550
|
[:b,:two,:foo],
|
@@ -579,7 +564,7 @@ describe Daru::DataFrame do
|
|
579
564
|
end
|
580
565
|
end
|
581
566
|
|
582
|
-
context "#[
|
567
|
+
context "#row[]=" do
|
583
568
|
context Daru::Index do
|
584
569
|
before :each do
|
585
570
|
@df = Daru::DataFrame.new({b: [11,12,13,14,15], a: [1,2,3,4,5],
|
@@ -590,33 +575,39 @@ describe Daru::DataFrame do
|
|
590
575
|
it "assigns specified row when Array" do
|
591
576
|
@df.row[:one] = [49, 99, 59]
|
592
577
|
|
593
|
-
expect(@df[:one
|
594
|
-
expect(@df[:one
|
595
|
-
expect(@df[:one
|
578
|
+
expect(@df.row[:one]) .to eq([49, 99, 59].dv(:one, [:a, :b, :c]))
|
579
|
+
expect(@df.row[:one].index).to eq([:a, :b, :c].to_index)
|
580
|
+
expect(@df.row[:one].name) .to eq(:one)
|
596
581
|
end
|
597
582
|
|
598
583
|
it "assigns specified row when DV" do
|
599
|
-
@df[:one
|
584
|
+
@df.row[:one] = [49, 99, 59].dv(nil, [:a, :b, :c])
|
600
585
|
|
601
|
-
expect(@df[:one
|
586
|
+
expect(@df.row[:one]).to eq([49, 99, 59].dv(:one, [:a, :b, :c]))
|
587
|
+
end
|
588
|
+
|
589
|
+
it "assigns correct elements when Vector of different index" do
|
590
|
+
@df.row[:one] = Daru::Vector.new([44,62,11], index: [:b,:f,:a])
|
591
|
+
|
592
|
+
expect(@df.row[:one]).to eq(Daru::Vector.new([11,44,nil], index: [:a,:b,:c]))
|
602
593
|
end
|
603
594
|
|
604
595
|
it "creates a new row from an Array" do
|
605
596
|
@df.row[:patekar] = [9,2,11]
|
606
597
|
|
607
|
-
expect(@df[:patekar
|
598
|
+
expect(@df.row[:patekar]).to eq([9,2,11].dv(:patekar, [:a, :b, :c]))
|
608
599
|
end
|
609
600
|
|
610
601
|
it "creates a new row from a DV" do
|
611
602
|
@df.row[:patekar] = [9,2,11].dv(nil, [:a, :b, :c])
|
612
603
|
|
613
|
-
expect(@df[:patekar
|
604
|
+
expect(@df.row[:patekar]).to eq([9,2,11].dv(:patekar, [:a, :b, :c]))
|
614
605
|
end
|
615
606
|
|
616
607
|
it "creates a new row from numeric row index and named DV" do
|
617
608
|
@df.row[2] = [9,2,11].dv(nil, [:a, :b, :c])
|
618
609
|
|
619
|
-
expect(@df[2
|
610
|
+
expect(@df.row[2]).to eq([9,2,11].dv(nil, [:a, :b, :c]))
|
620
611
|
end
|
621
612
|
|
622
613
|
it "correctly aligns assigned DV by index" do
|
@@ -685,7 +676,22 @@ describe Daru::DataFrame do
|
|
685
676
|
c: [11,22,33]}, order: [:a, :b, :c],
|
686
677
|
index: [:one, :two, :three])
|
687
678
|
)
|
688
|
-
end
|
679
|
+
end
|
680
|
+
|
681
|
+
it "returns a row with the given index" do
|
682
|
+
expect(@df.row[:one]).to eq([1,11,11].dv(:one, [:a, :b, :c]))
|
683
|
+
end
|
684
|
+
|
685
|
+
it "returns a row with given Integer index" do
|
686
|
+
expect(@df.row[0]).to eq([1,11,11].dv(:one, [:a, :b, :c]))
|
687
|
+
end
|
688
|
+
|
689
|
+
it "returns a row with given Integer index for default index-less DataFrame" do
|
690
|
+
df = Daru::DataFrame.new({b: [11,12,13,14,15], a: [1,2,3,4,5],
|
691
|
+
c: [11,22,33,44,55]}, order: [:a, :b, :c])
|
692
|
+
|
693
|
+
expect(df.row[0]).to eq([1,11,11].dv(nil, [:a, :b, :c]))
|
694
|
+
end
|
689
695
|
end
|
690
696
|
|
691
697
|
context Daru::MultiIndex do
|
@@ -694,22 +700,16 @@ describe Daru::DataFrame do
|
|
694
700
|
end
|
695
701
|
|
696
702
|
it "returns a DataFrame when specifying numeric range" do
|
697
|
-
sub_index = Daru::MultiIndex.
|
703
|
+
sub_index = Daru::MultiIndex.from_tuples([
|
698
704
|
[:a,:one,:bar],
|
699
|
-
[:a,:one,:baz]
|
700
|
-
[:a,:two,:bar],
|
701
|
-
[:a,:two,:baz],
|
702
|
-
[:b,:one,:bar],
|
703
|
-
[:b,:two,:bar],
|
704
|
-
[:b,:two,:baz],
|
705
|
-
[:b,:one,:foo]
|
705
|
+
[:a,:one,:baz]
|
706
706
|
])
|
707
707
|
|
708
708
|
expect(@df_mi.row[0..1]).to eq(Daru::DataFrame.new([
|
709
|
-
[11,12
|
710
|
-
[1,2
|
711
|
-
[11,12
|
712
|
-
[1,2
|
709
|
+
[11,12],
|
710
|
+
[1,2],
|
711
|
+
[11,12],
|
712
|
+
[1,2]
|
713
713
|
], order: @order_mi, index: sub_index, name: :numeric_range))
|
714
714
|
end
|
715
715
|
|
@@ -718,7 +718,7 @@ describe Daru::DataFrame do
|
|
718
718
|
end
|
719
719
|
|
720
720
|
it "returns DataFrame when specifying first layer of MultiIndex" do
|
721
|
-
sub_index = Daru::MultiIndex.
|
721
|
+
sub_index = Daru::MultiIndex.from_tuples([
|
722
722
|
[:one,:bar],
|
723
723
|
[:one,:baz],
|
724
724
|
[:two,:foo],
|
@@ -733,7 +733,7 @@ describe Daru::DataFrame do
|
|
733
733
|
end
|
734
734
|
|
735
735
|
it "returns DataFrame when specifying first and second layer of MultiIndex" do
|
736
|
-
sub_index = Daru::MultiIndex.
|
736
|
+
sub_index = Daru::MultiIndex.from_tuples([
|
737
737
|
[:bar],
|
738
738
|
[:baz]
|
739
739
|
])
|
@@ -760,48 +760,6 @@ describe Daru::DataFrame do
|
|
760
760
|
end
|
761
761
|
end
|
762
762
|
|
763
|
-
context "#vector" do
|
764
|
-
context Daru::Index do
|
765
|
-
it "appends an Array as a Daru::Vector" do
|
766
|
-
@data_frame[:d, :vector] = [69,99,108,85,49]
|
767
|
-
|
768
|
-
expect(@data_frame.d.class).to eq(Daru::Vector)
|
769
|
-
end
|
770
|
-
end
|
771
|
-
|
772
|
-
context Daru::MultiIndex do
|
773
|
-
it "accesses vector with an integer index" do
|
774
|
-
expect(@df_mi.vector[0]).to eq(Daru::Vector.new(@vector_arry1,
|
775
|
-
index: @multi_index))
|
776
|
-
end
|
777
|
-
|
778
|
-
it "returns a vector when specifying full tuple" do
|
779
|
-
expect(@df_mi.vector[:a, :one, :bar]).to eq(Daru::Vector.new(@vector_arry1,
|
780
|
-
index: @multi_index))
|
781
|
-
end
|
782
|
-
|
783
|
-
it "returns DataFrame when specified first layer of MultiIndex" do
|
784
|
-
sub_order = Daru::MultiIndex.new([
|
785
|
-
[:one, :bar],
|
786
|
-
[:two, :baz]
|
787
|
-
])
|
788
|
-
expect(@df_mi.vector[:a]).to eq(Daru::DataFrame.new([
|
789
|
-
@vector_arry1,
|
790
|
-
@vector_arry2
|
791
|
-
], index: @multi_index, order: sub_order))
|
792
|
-
end
|
793
|
-
|
794
|
-
it "returns DataFrame when specified first and second layer of MultiIndex" do
|
795
|
-
sub_order = Daru::MultiIndex.new([
|
796
|
-
[:bar]
|
797
|
-
])
|
798
|
-
expect(@df_mi.vector[:a, :one]).to eq(Daru::DataFrame.new([
|
799
|
-
@vector_arry1
|
800
|
-
], index: @multi_index, order: sub_order))
|
801
|
-
end
|
802
|
-
end
|
803
|
-
end
|
804
|
-
|
805
763
|
context "#==" do
|
806
764
|
it "compares by vectors, index and values of a DataFrame (ignores name)" do
|
807
765
|
a = Daru::DataFrame.new({b: [11,12,13,14,15], a: [1,2,3,4,5]},
|
@@ -824,7 +782,7 @@ describe Daru::DataFrame do
|
|
824
782
|
expect(clo.index.object_id) .not_to eq(@data_frame.object_id)
|
825
783
|
|
826
784
|
@data_frame.each_vector_with_index do |vector, index|
|
827
|
-
expect(vector.object_id).not_to eq(clo
|
785
|
+
expect(vector.object_id).not_to eq(clo[index].object_id)
|
828
786
|
end
|
829
787
|
end
|
830
788
|
end
|
@@ -1092,18 +1050,14 @@ describe Daru::DataFrame do
|
|
1092
1050
|
index: [:one, :two, :three, :four, :five]))
|
1093
1051
|
end
|
1094
1052
|
end
|
1095
|
-
|
1096
|
-
context Daru::MultiIndex do
|
1097
|
-
pending
|
1098
|
-
end
|
1099
1053
|
end
|
1100
1054
|
|
1101
1055
|
context "#delete_row" do
|
1102
1056
|
it "deletes the specified row" do
|
1103
|
-
@data_frame.delete_row :
|
1057
|
+
@data_frame.delete_row :three
|
1104
1058
|
|
1105
|
-
expect(@data_frame).to eq(Daru::DataFrame.new({b: [12,
|
1106
|
-
c: [22,
|
1059
|
+
expect(@data_frame).to eq(Daru::DataFrame.new({b: [11,12,14,15], a: [1,2,4,5],
|
1060
|
+
c: [11,22,44,55]}, order: [:a, :b, :c], index: [:one, :two, :four, :five]))
|
1107
1061
|
end
|
1108
1062
|
end
|
1109
1063
|
|
@@ -1161,10 +1115,6 @@ describe Daru::DataFrame do
|
|
1161
1115
|
expect(a).to eq(Daru::DataFrame.new({a: [2], b: [3]}, order: [:a, :b], index: [1]))
|
1162
1116
|
end
|
1163
1117
|
end
|
1164
|
-
|
1165
|
-
context Daru::MultiIndex do
|
1166
|
-
pending
|
1167
|
-
end
|
1168
1118
|
end
|
1169
1119
|
|
1170
1120
|
context "#filter_vectors" do
|
@@ -1179,10 +1129,6 @@ describe Daru::DataFrame do
|
|
1179
1129
|
expect(a).to eq(Daru::DataFrame.new({a: [1,2,3]}))
|
1180
1130
|
end
|
1181
1131
|
end
|
1182
|
-
|
1183
|
-
context Daru::MultiIndex do
|
1184
|
-
pending
|
1185
|
-
end
|
1186
1132
|
end
|
1187
1133
|
|
1188
1134
|
context "#to_a" do
|
@@ -1321,79 +1267,86 @@ describe Daru::DataFrame do
|
|
1321
1267
|
@df_mi.sort([[:a,:one,:bar]])
|
1322
1268
|
end
|
1323
1269
|
end
|
1324
|
-
end
|
1270
|
+
end
|
1325
1271
|
|
1326
|
-
context "#
|
1327
|
-
|
1328
|
-
|
1272
|
+
context "#index=" do
|
1273
|
+
before :each do
|
1274
|
+
@df = Daru::DataFrame.new({
|
1275
|
+
a: [1,2,3,4,5],
|
1276
|
+
b: [11,22,33,44,55],
|
1277
|
+
c: %w(a b c d e)
|
1278
|
+
})
|
1279
|
+
end
|
1329
1280
|
|
1330
|
-
|
1331
|
-
|
1332
|
-
expect(
|
1281
|
+
it "simply reassigns the index" do
|
1282
|
+
@df.index = Daru::Index.new(['4','foo', :bar, 0, 23])
|
1283
|
+
expect(@df.row['foo']).to eq(Daru::Vector.new([2,22,'b'], index: [:a,:b,:c]))
|
1284
|
+
end
|
1333
1285
|
|
1334
|
-
|
1335
|
-
expect
|
1336
|
-
|
1286
|
+
it "raises error for improper length index" do
|
1287
|
+
expect {
|
1288
|
+
@df.index = Daru::Index.new([1,2])
|
1289
|
+
}.to raise_error(ArgumentError)
|
1337
1290
|
end
|
1291
|
+
end
|
1338
1292
|
|
1339
|
-
|
1340
|
-
|
1293
|
+
context "#vectors=" do
|
1294
|
+
before :each do
|
1295
|
+
@df = Daru::DataFrame.new({
|
1296
|
+
a: [1,2,3,4,5],
|
1297
|
+
b: [11,22,33,44,55],
|
1298
|
+
c: %w(a b c d e)
|
1299
|
+
})
|
1300
|
+
end
|
1341
1301
|
|
1342
|
-
|
1343
|
-
|
1344
|
-
order: [:a, :b, :c], index: [:a,:b,:c,:d,:e]))
|
1345
|
-
expect(a).to_not eq(@data_frame)
|
1302
|
+
it "simply reassigns vectors" do
|
1303
|
+
@df.vectors = Daru::Index.new(['b',0,'m'])
|
1346
1304
|
|
1347
|
-
expect(
|
1348
|
-
expect(
|
1349
|
-
expect(
|
1305
|
+
expect(@df.vectors).to eq(Daru::Index.new(['b',0,'m']))
|
1306
|
+
expect(@df['b']).to eq(Daru::Vector.new([1,2,3,4,5]))
|
1307
|
+
expect(@df[0]).to eq(Daru::Vector.new([11,22,33,44,55]))
|
1308
|
+
expect(@df['m']).to eq(Daru::Vector.new(%w(a b c d e)))
|
1350
1309
|
end
|
1351
|
-
end
|
1352
1310
|
|
1353
|
-
|
1354
|
-
|
1355
|
-
|
1356
|
-
|
1357
|
-
a: [1,2,3,4,5], c: [11,22,33,44,55]}, order: [:a, :b, :c]))
|
1358
|
-
expect(@data_frame.a.index).to eq(Daru::Index.new(5))
|
1359
|
-
expect(@data_frame.b.index).to eq(Daru::Index.new(5))
|
1360
|
-
expect(@data_frame.c.index).to eq(Daru::Index.new(5))
|
1361
|
-
end
|
1362
|
-
|
1363
|
-
it "sets a new index for the data frame and its underlying vectors" do
|
1364
|
-
expect(@data_frame.reindex!([:a,:b,:c,:d,:e])).to eq(Daru::DataFrame.new(
|
1365
|
-
{b: [11,12,13,14,15], a: [1,2,3,4,5], c: [11,22,33,44,55]},
|
1366
|
-
order: [:a, :b, :c], index: [:a,:b,:c,:d,:e]))
|
1367
|
-
expect(@data_frame.a.index).to eq(Daru::Index.new([:a,:b,:c,:d,:e]))
|
1368
|
-
expect(@data_frame.b.index).to eq(Daru::Index.new([:a,:b,:c,:d,:e]))
|
1369
|
-
expect(@data_frame.c.index).to eq(Daru::Index.new([:a,:b,:c,:d,:e]))
|
1370
|
-
end
|
1311
|
+
it "raises error for improper length index" do
|
1312
|
+
expect {
|
1313
|
+
@df.vectors = Daru::Index.new([1,2,'3',4,'5'])
|
1314
|
+
}.to raise_error(ArgumentError)
|
1371
1315
|
end
|
1372
|
-
|
1373
|
-
context Daru::MultiIndex do
|
1374
|
-
pending "feature manually tested. write tests"
|
1375
|
-
end
|
1376
1316
|
end
|
1377
1317
|
|
1378
|
-
context "#
|
1379
|
-
|
1380
|
-
|
1318
|
+
context "#reindex" do
|
1319
|
+
it "re indexes and aligns accordingly" do
|
1320
|
+
df = Daru::DataFrame.new({
|
1381
1321
|
a: [1,2,3,4,5],
|
1382
1322
|
b: [11,22,33,44,55],
|
1383
1323
|
c: %w(a b c d e)
|
1384
1324
|
})
|
1325
|
+
|
1326
|
+
ans = df.reindex(Daru::Index.new([1,3,0,8,2]))
|
1327
|
+
expect(ans).to eq(Daru::DataFrame.new({
|
1328
|
+
a: [2,4,1,nil,3],
|
1329
|
+
b: [22,44,11,nil,33],
|
1330
|
+
c: ['b','d','a',nil,'c']
|
1331
|
+
}, index: Daru::Index.new([1,3,0,8,2])))
|
1332
|
+
expect(ans).to_not eq(df)
|
1385
1333
|
end
|
1334
|
+
end
|
1386
1335
|
|
1387
|
-
|
1388
|
-
|
1336
|
+
context "#reindex_vectors" do
|
1337
|
+
it "re indexes vectors and aligns accordingly" do
|
1338
|
+
df = Daru::DataFrame.new({
|
1389
1339
|
a: [1,2,3,4,5],
|
1390
1340
|
b: [11,22,33,44,55],
|
1391
1341
|
c: %w(a b c d e)
|
1392
|
-
}
|
1342
|
+
})
|
1393
1343
|
|
1394
|
-
|
1395
|
-
expect(
|
1396
|
-
|
1344
|
+
ans = df.reindex_vectors(Daru::Index.new([:b, 'a', :a]))
|
1345
|
+
expect(ans).to eq(Daru::DataFrame.new({
|
1346
|
+
:b => [11,22,33,44,55],
|
1347
|
+
'a' => [nil, nil, nil, nil, nil],
|
1348
|
+
:a => [1,2,3,4,5]
|
1349
|
+
}, order: [:b, 'a', :a]))
|
1397
1350
|
end
|
1398
1351
|
end
|
1399
1352
|
|
@@ -1476,16 +1429,16 @@ describe Daru::DataFrame do
|
|
1476
1429
|
expect(@df.pivot_table(index: [:a])).to eq(Daru::DataFrame.new({
|
1477
1430
|
d: [5.5,2.2],
|
1478
1431
|
e: [11.0,4.4]
|
1479
|
-
}, index: [
|
1432
|
+
}, index: ['bar', 'foo']))
|
1480
1433
|
end
|
1481
1434
|
|
1482
1435
|
it "creates row index as per (double) index argument and default aggregates to mean" do
|
1483
|
-
agg_mi = Daru::MultiIndex.
|
1436
|
+
agg_mi = Daru::MultiIndex.from_tuples(
|
1484
1437
|
[
|
1485
|
-
[
|
1486
|
-
[
|
1487
|
-
[
|
1488
|
-
[
|
1438
|
+
['bar', 'large'],
|
1439
|
+
['bar', 'small'],
|
1440
|
+
['foo', 'large'],
|
1441
|
+
['foo', 'small']
|
1489
1442
|
]
|
1490
1443
|
)
|
1491
1444
|
expect(@df.pivot_table(index: [:a, :c]).round(2)).to eq(Daru::DataFrame.new({
|
@@ -1495,46 +1448,48 @@ describe Daru::DataFrame do
|
|
1495
1448
|
end
|
1496
1449
|
|
1497
1450
|
it "creates row and vector index as per (single) index and (single) vectors args" do
|
1498
|
-
agg_vectors = Daru::MultiIndex.
|
1499
|
-
[:d,
|
1500
|
-
[:d,
|
1501
|
-
[:e,
|
1502
|
-
[:e,
|
1451
|
+
agg_vectors = Daru::MultiIndex.from_tuples([
|
1452
|
+
[:d, 'one'],
|
1453
|
+
[:d, 'two'],
|
1454
|
+
[:e, 'one'],
|
1455
|
+
[:e, 'two']
|
1503
1456
|
])
|
1504
|
-
agg_index = Daru::MultiIndex.
|
1457
|
+
agg_index = Daru::MultiIndex.from_tuples(
|
1505
1458
|
[
|
1506
|
-
[
|
1507
|
-
[
|
1459
|
+
['bar'],
|
1460
|
+
['foo']
|
1508
1461
|
]
|
1509
1462
|
)
|
1510
|
-
|
1511
|
-
expect(@df.pivot_table(index: [:a], vectors: [:b]).round(2)).to eq(
|
1512
|
-
|
1513
|
-
[
|
1514
|
-
|
1515
|
-
|
1516
|
-
|
1517
|
-
|
1463
|
+
|
1464
|
+
expect(@df.pivot_table(index: [:a], vectors: [:b]).round(2)).to eq(
|
1465
|
+
Daru::DataFrame.new(
|
1466
|
+
[
|
1467
|
+
[4.5, 1.67],
|
1468
|
+
[6.5, 3.0],
|
1469
|
+
[9.0, 3.33],
|
1470
|
+
[13, 6]
|
1471
|
+
], order: agg_vectors, index: agg_index)
|
1472
|
+
)
|
1518
1473
|
end
|
1519
1474
|
|
1520
1475
|
it "creates row and vector index as per (single) index and (double) vector args" do
|
1521
|
-
agg_vectors = Daru::MultiIndex.
|
1476
|
+
agg_vectors = Daru::MultiIndex.from_tuples(
|
1522
1477
|
[
|
1523
|
-
[:d,
|
1524
|
-
[:d,
|
1525
|
-
[:d,
|
1526
|
-
[:d,
|
1527
|
-
[:e,
|
1528
|
-
[:e,
|
1529
|
-
[:e,
|
1530
|
-
[:e,
|
1478
|
+
[:d, 'one', 'large'],
|
1479
|
+
[:d, 'one', 'small'],
|
1480
|
+
[:d, 'two', 'large'],
|
1481
|
+
[:d, 'two', 'small'],
|
1482
|
+
[:e, 'one', 'large'],
|
1483
|
+
[:e, 'one', 'small'],
|
1484
|
+
[:e, 'two', 'large'],
|
1485
|
+
[:e, 'two', 'small']
|
1531
1486
|
]
|
1532
1487
|
)
|
1533
1488
|
|
1534
|
-
agg_index = Daru::MultiIndex.
|
1489
|
+
agg_index = Daru::MultiIndex.from_tuples(
|
1535
1490
|
[
|
1536
|
-
[
|
1537
|
-
[
|
1491
|
+
['bar'],
|
1492
|
+
['foo']
|
1538
1493
|
]
|
1539
1494
|
)
|
1540
1495
|
|
@@ -1553,21 +1508,21 @@ describe Daru::DataFrame do
|
|
1553
1508
|
end
|
1554
1509
|
|
1555
1510
|
it "creates row and vector index with (double) index and (double) vector args" do
|
1556
|
-
agg_index = Daru::MultiIndex.
|
1557
|
-
[
|
1558
|
-
[
|
1559
|
-
[
|
1560
|
-
[
|
1561
|
-
[
|
1562
|
-
[
|
1563
|
-
[
|
1511
|
+
agg_index = Daru::MultiIndex.from_tuples([
|
1512
|
+
['bar', 4],
|
1513
|
+
['bar', 5],
|
1514
|
+
['bar', 6],
|
1515
|
+
['bar', 7],
|
1516
|
+
['foo', 1],
|
1517
|
+
['foo', 2],
|
1518
|
+
['foo', 3]
|
1564
1519
|
])
|
1565
1520
|
|
1566
|
-
agg_vectors = Daru::MultiIndex.
|
1567
|
-
[:e,
|
1568
|
-
[:e,
|
1569
|
-
[:e,
|
1570
|
-
[:e,
|
1521
|
+
agg_vectors = Daru::MultiIndex.from_tuples([
|
1522
|
+
[:e, 'one', 'large'],
|
1523
|
+
[:e, 'one', 'small'],
|
1524
|
+
[:e, 'two', 'large'],
|
1525
|
+
[:e, 'two', 'small']
|
1571
1526
|
])
|
1572
1527
|
|
1573
1528
|
expect(@df.pivot_table(index: [:a, :d], vectors: [:b, :c])).to eq(
|
@@ -1582,18 +1537,18 @@ describe Daru::DataFrame do
|
|
1582
1537
|
end
|
1583
1538
|
|
1584
1539
|
it "only aggregates over the vector specified in the values argument" do
|
1585
|
-
agg_vectors = Daru::MultiIndex.
|
1540
|
+
agg_vectors = Daru::MultiIndex.from_tuples(
|
1586
1541
|
[
|
1587
|
-
[:e,
|
1588
|
-
[:e,
|
1589
|
-
[:e,
|
1590
|
-
[:e,
|
1542
|
+
[:e, 'one', 'large'],
|
1543
|
+
[:e, 'one', 'small'],
|
1544
|
+
[:e, 'two', 'large'],
|
1545
|
+
[:e, 'two', 'small']
|
1591
1546
|
]
|
1592
1547
|
)
|
1593
|
-
agg_index = Daru::MultiIndex.
|
1548
|
+
agg_index = Daru::MultiIndex.from_tuples(
|
1594
1549
|
[
|
1595
|
-
[
|
1596
|
-
[
|
1550
|
+
['bar'],
|
1551
|
+
['foo']
|
1597
1552
|
]
|
1598
1553
|
)
|
1599
1554
|
expect(@df.pivot_table(index: [:a], vectors: [:b, :c], values: :e)).to eq(
|
@@ -1609,18 +1564,18 @@ describe Daru::DataFrame do
|
|
1609
1564
|
end
|
1610
1565
|
|
1611
1566
|
it "overrides default aggregate function to aggregate over sum" do
|
1612
|
-
agg_vectors = Daru::MultiIndex.
|
1567
|
+
agg_vectors = Daru::MultiIndex.from_tuples(
|
1613
1568
|
[
|
1614
|
-
[:e,
|
1615
|
-
[:e,
|
1616
|
-
[:e,
|
1617
|
-
[:e,
|
1569
|
+
[:e, 'one', 'large'],
|
1570
|
+
[:e, 'one', 'small'],
|
1571
|
+
[:e, 'two', 'large'],
|
1572
|
+
[:e, 'two', 'small']
|
1618
1573
|
]
|
1619
1574
|
)
|
1620
|
-
agg_index = Daru::MultiIndex.
|
1575
|
+
agg_index = Daru::MultiIndex.from_tuples(
|
1621
1576
|
[
|
1622
|
-
[
|
1623
|
-
[
|
1577
|
+
['bar'],
|
1578
|
+
['foo']
|
1624
1579
|
]
|
1625
1580
|
)
|
1626
1581
|
expect(@df.pivot_table(index: [:a], vectors: [:b, :c], values: :e, agg: :sum)).to eq(
|
@@ -1908,15 +1863,15 @@ describe Daru::DataFrame do
|
|
1908
1863
|
df = Daru::DataFrame.crosstab_by_assignation(v1, v2, v3)
|
1909
1864
|
|
1910
1865
|
expect(df[:_id].type).to eq(:object)
|
1911
|
-
expect(df[
|
1912
|
-
expect(df[
|
1866
|
+
expect(df['a'].type).to eq(:numeric)
|
1867
|
+
expect(df['b'].type).to eq(:numeric)
|
1913
1868
|
|
1914
1869
|
ev_id = Daru::Vector.new %w(a b c)
|
1915
1870
|
ev_a = Daru::Vector.new [0, 0, 0]
|
1916
1871
|
ev_b = Daru::Vector.new [1, 1, 0]
|
1917
1872
|
ev_c = Daru::Vector.new [0, 1, 1]
|
1918
1873
|
df2 = Daru::DataFrame.new({
|
1919
|
-
:_id => ev_id,
|
1874
|
+
:_id => ev_id, 'a' => ev_a, 'b' => ev_b, 'c' => ev_c })
|
1920
1875
|
|
1921
1876
|
expect(df2).to eq(df)
|
1922
1877
|
end
|
@@ -1929,19 +1884,21 @@ describe Daru::DataFrame do
|
|
1929
1884
|
['2', 'fred', 'green', 15, 'orange', 30, 'white', 20],
|
1930
1885
|
['3', 'alfred', nil, nil, nil, nil, nil, nil]
|
1931
1886
|
]
|
1887
|
+
|
1932
1888
|
df = Daru::DataFrame.rows(rows,
|
1933
|
-
order: [
|
1934
|
-
|
1889
|
+
order: ['id', 'name', 'car_color1', 'car_value1', 'car_color2',
|
1890
|
+
'car_value2', 'car_color3', 'car_value3'])
|
1935
1891
|
|
1936
1892
|
ids = Daru::Vector.new %w(1 1 2 2 2)
|
1937
1893
|
colors = Daru::Vector.new %w(red blue green orange white)
|
1938
1894
|
values = Daru::Vector.new [10, 20, 15, 30, 20]
|
1939
1895
|
col_ids = Daru::Vector.new [1, 2, 1, 2, 3]
|
1896
|
+
|
1940
1897
|
df_expected = Daru::DataFrame.new({
|
1941
|
-
|
1942
|
-
}, order: [
|
1898
|
+
'id' => ids, '_col_id' => col_ids, 'color' => colors, 'value' => values
|
1899
|
+
}, order: ['id', '_col_id', 'color', 'value'])
|
1943
1900
|
|
1944
|
-
expect(df.one_to_many([
|
1901
|
+
expect(df.one_to_many(['id'], 'car_%v%n')).to eq(df_expected)
|
1945
1902
|
end
|
1946
1903
|
end
|
1947
1904
|
|
@@ -2023,7 +1980,7 @@ describe Daru::DataFrame do
|
|
2023
1980
|
|
2024
1981
|
context Daru::MultiIndex do
|
2025
1982
|
before do
|
2026
|
-
agg_vectors = Daru::MultiIndex.
|
1983
|
+
agg_vectors = Daru::MultiIndex.from_tuples(
|
2027
1984
|
[
|
2028
1985
|
[:d, :one, :large],
|
2029
1986
|
[:d, :one, :small],
|
@@ -2036,7 +1993,7 @@ describe Daru::DataFrame do
|
|
2036
1993
|
]
|
2037
1994
|
)
|
2038
1995
|
|
2039
|
-
agg_index = Daru::MultiIndex.
|
1996
|
+
agg_index = Daru::MultiIndex.from_tuples(
|
2040
1997
|
[
|
2041
1998
|
[:bar],
|
2042
1999
|
[:foo]
|
@@ -2057,7 +2014,7 @@ describe Daru::DataFrame do
|
|
2057
2014
|
end
|
2058
2015
|
|
2059
2016
|
it "returns numeric vectors" do
|
2060
|
-
vectors = Daru::MultiIndex.
|
2017
|
+
vectors = Daru::MultiIndex.from_tuples(
|
2061
2018
|
[
|
2062
2019
|
[:d, :one, :large],
|
2063
2020
|
[:d, :two, :large],
|
@@ -2068,7 +2025,7 @@ describe Daru::DataFrame do
|
|
2068
2025
|
]
|
2069
2026
|
)
|
2070
2027
|
|
2071
|
-
index = Daru::MultiIndex.
|
2028
|
+
index = Daru::MultiIndex.from_tuples(
|
2072
2029
|
[
|
2073
2030
|
[:bar],
|
2074
2031
|
[:foo]
|
@@ -2089,4 +2046,45 @@ describe Daru::DataFrame do
|
|
2089
2046
|
end
|
2090
2047
|
end
|
2091
2048
|
end
|
2049
|
+
|
2050
|
+
context "#set_index" do
|
2051
|
+
before(:each) do
|
2052
|
+
@df = Daru::DataFrame.new({
|
2053
|
+
a: [1,2,3,4,5],
|
2054
|
+
b: ['a','b','c','d','e'],
|
2055
|
+
c: [11,22,33,44,55]
|
2056
|
+
})
|
2057
|
+
end
|
2058
|
+
|
2059
|
+
it "sets a particular column as the index and deletes that column" do
|
2060
|
+
@df.set_index(:b)
|
2061
|
+
expect(@df).to eq(
|
2062
|
+
Daru::DataFrame.new({
|
2063
|
+
a: [1,2,3,4,5],
|
2064
|
+
c: [11,22,33,44,55]
|
2065
|
+
}, index: ['a','b','c','d','e'])
|
2066
|
+
)
|
2067
|
+
end
|
2068
|
+
|
2069
|
+
it "sets a particular column as index but keeps that column" do
|
2070
|
+
expect(@df.set_index(:c, keep: true)).to eq(
|
2071
|
+
Daru::DataFrame.new({
|
2072
|
+
a: [1,2,3,4,5],
|
2073
|
+
b: ['a','b','c','d','e'],
|
2074
|
+
c: [11,22,33,44,55]
|
2075
|
+
}, index: [11,22,33,44,55]))
|
2076
|
+
expect(@df[:c]).to eq(@df[:c])
|
2077
|
+
end
|
2078
|
+
|
2079
|
+
it "raises error if all elements in the column aren't unique" do
|
2080
|
+
jholu = Daru::DataFrame.new({
|
2081
|
+
a: ['a','b','a'],
|
2082
|
+
b: [1,2,4]
|
2083
|
+
})
|
2084
|
+
|
2085
|
+
expect {
|
2086
|
+
jholu.set_index(:a)
|
2087
|
+
}.to raise_error(ArgumentError)
|
2088
|
+
end
|
2089
|
+
end
|
2092
2090
|
end if mri?
|