daru 0.1.5 → 0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +5 -5
- data/.github/ISSUE_TEMPLATE.md +18 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +21 -7
- data/.travis.yml +10 -5
- data/CONTRIBUTING.md +15 -10
- data/History.md +124 -2
- data/README.md +37 -9
- data/ReleasePolicy.md +20 -0
- data/benchmarks/db_loading.rb +34 -0
- data/benchmarks/statistics.rb +6 -6
- data/benchmarks/where_clause.rb +1 -1
- data/benchmarks/where_vs_filter.rb +1 -1
- data/daru.gemspec +17 -41
- data/lib/daru.rb +10 -13
- data/lib/daru/accessors/gsl_wrapper.rb +1 -1
- data/lib/daru/accessors/nmatrix_wrapper.rb +2 -0
- data/lib/daru/category.rb +29 -15
- data/lib/daru/configuration.rb +34 -0
- data/lib/daru/core/group_by.rb +158 -77
- data/lib/daru/core/merge.rb +12 -3
- data/lib/daru/core/query.rb +20 -4
- data/lib/daru/dataframe.rb +692 -118
- data/lib/daru/date_time/index.rb +14 -11
- data/lib/daru/date_time/offsets.rb +9 -1
- data/lib/daru/extensions/which_dsl.rb +55 -0
- data/lib/daru/formatters/table.rb +3 -5
- data/lib/daru/index/categorical_index.rb +4 -4
- data/lib/daru/index/index.rb +131 -42
- data/lib/daru/index/multi_index.rb +118 -10
- data/lib/daru/io/csv/converters.rb +21 -0
- data/lib/daru/io/io.rb +105 -33
- data/lib/daru/io/sql_data_source.rb +10 -0
- data/lib/daru/iruby/templates/dataframe.html.erb +4 -51
- data/lib/daru/iruby/templates/dataframe_mi.html.erb +3 -56
- data/lib/daru/iruby/templates/dataframe_mi_tbody.html.erb +35 -0
- data/lib/daru/iruby/templates/dataframe_mi_thead.html.erb +21 -0
- data/lib/daru/iruby/templates/dataframe_tbody.html.erb +28 -0
- data/lib/daru/iruby/templates/dataframe_thead.html.erb +21 -0
- data/lib/daru/iruby/templates/vector.html.erb +3 -25
- data/lib/daru/iruby/templates/vector_mi.html.erb +3 -34
- data/lib/daru/iruby/templates/vector_mi_tbody.html.erb +26 -0
- data/lib/daru/iruby/templates/vector_mi_thead.html.erb +8 -0
- data/lib/daru/iruby/templates/vector_tbody.html.erb +17 -0
- data/lib/daru/iruby/templates/vector_thead.html.erb +8 -0
- data/lib/daru/maths/arithmetic/vector.rb +38 -2
- data/lib/daru/maths/statistics/dataframe.rb +28 -30
- data/lib/daru/maths/statistics/vector.rb +295 -41
- data/lib/daru/plotting/gruff/dataframe.rb +13 -15
- data/lib/daru/plotting/nyaplot/category.rb +1 -1
- data/lib/daru/plotting/nyaplot/dataframe.rb +15 -4
- data/lib/daru/plotting/nyaplot/vector.rb +1 -2
- data/lib/daru/vector.rb +308 -96
- data/lib/daru/version.rb +1 -1
- data/profile/vector_new.rb +9 -0
- data/spec/accessors/gsl_wrapper_spec.rb +38 -35
- data/spec/accessors/nmatrix_wrapper_spec.rb +25 -22
- data/spec/category_spec.rb +24 -20
- data/spec/core/group_by_spec.rb +238 -4
- data/spec/core/merge_spec.rb +1 -1
- data/spec/core/query_spec.rb +65 -50
- data/spec/daru_spec.rb +22 -0
- data/spec/dataframe_spec.rb +473 -16
- data/spec/date_time/date_time_index_helper_spec.rb +72 -0
- data/spec/date_time/index_spec.rb +34 -16
- data/spec/date_time/offsets_spec.rb +14 -0
- data/spec/extensions/rserve_spec.rb +1 -1
- data/spec/extensions/which_dsl_spec.rb +38 -0
- data/spec/fixtures/boolean_converter_test.csv +5 -0
- data/spec/fixtures/duplicates.csv +32 -0
- data/spec/fixtures/eciresults.html +394 -0
- data/spec/fixtures/empty_rows_test.csv +17 -0
- data/spec/fixtures/macau.html +3691 -0
- data/spec/fixtures/macd_data.csv +150 -0
- data/spec/fixtures/matrix_test.csv +55 -55
- data/spec/fixtures/moneycontrol.html +6812 -0
- data/spec/fixtures/string_converter_test.csv +5 -0
- data/spec/fixtures/test_xls.xls +0 -0
- data/spec/fixtures/test_xls_2.xls +0 -0
- data/spec/fixtures/url_test.txt~ +0 -0
- data/spec/fixtures/valid_markup.html +62 -0
- data/spec/fixtures/wiki_climate.html +1243 -0
- data/spec/fixtures/wiki_table_info.html +631 -0
- data/spec/formatters/table_formatter_spec.rb +29 -0
- data/spec/index/categorical_index_spec.rb +33 -33
- data/spec/index/index_spec.rb +160 -41
- data/spec/index/multi_index_spec.rb +143 -33
- data/spec/io/io_spec.rb +246 -2
- data/spec/io/sql_data_source_spec.rb +31 -41
- data/spec/iruby/dataframe_spec.rb +17 -19
- data/spec/iruby/vector_spec.rb +26 -28
- data/spec/maths/arithmetic/dataframe_spec.rb +1 -1
- data/spec/maths/arithmetic/vector_spec.rb +18 -0
- data/spec/maths/statistics/vector_spec.rb +153 -15
- data/spec/plotting/gruff/category_spec.rb +3 -3
- data/spec/plotting/gruff/dataframe_spec.rb +14 -4
- data/spec/plotting/gruff/vector_spec.rb +9 -9
- data/spec/plotting/nyaplot/category_spec.rb +5 -9
- data/spec/plotting/nyaplot/dataframe_spec.rb +95 -47
- data/spec/plotting/nyaplot/vector_spec.rb +5 -11
- data/spec/shared/vector_display_spec.rb +12 -14
- data/spec/spec_helper.rb +30 -7
- data/spec/support/matchers.rb +5 -0
- data/spec/vector_spec.rb +306 -72
- metadata +96 -55
- data/spec/fixtures/stock_data.csv +0 -500
|
@@ -12,24 +12,21 @@ describe Daru::Vector, 'plotting' do
|
|
|
12
12
|
|
|
13
13
|
it 'plots the vector' do
|
|
14
14
|
expect(plot).to receive(:add).with(:box, [11, 22, 33]).ordered
|
|
15
|
-
expect(plot).to receive(:show).ordered
|
|
16
15
|
|
|
17
|
-
vector.plot(type: :box)
|
|
16
|
+
expect(vector.plot(type: :box)).to eq plot
|
|
18
17
|
end
|
|
19
18
|
|
|
20
19
|
context 'scatter' do
|
|
21
20
|
it 'is default type' do
|
|
22
21
|
expect(plot).to receive(:add).with(:scatter, instance_of(Array), instance_of(Array)).ordered
|
|
23
|
-
expect(plot).to receive(:show).ordered
|
|
24
22
|
|
|
25
|
-
vector.plot
|
|
23
|
+
expect(vector.plot).to eq plot
|
|
26
24
|
end
|
|
27
25
|
|
|
28
26
|
it 'sets x_axis to 0...size' do
|
|
29
27
|
expect(plot).to receive(:add).with(:scatter, [0, 1, 2], [11, 22, 33]).ordered
|
|
30
|
-
expect(plot).to receive(:show).ordered
|
|
31
28
|
|
|
32
|
-
vector.plot(type: :scatter)
|
|
29
|
+
expect(vector.plot(type: :scatter)).to eq plot
|
|
33
30
|
end
|
|
34
31
|
end
|
|
35
32
|
|
|
@@ -37,9 +34,8 @@ describe Daru::Vector, 'plotting' do
|
|
|
37
34
|
context type.to_s do
|
|
38
35
|
it 'does not set x axis' do
|
|
39
36
|
expect(plot).to receive(:add).with(type, [11, 22, 33]).ordered
|
|
40
|
-
expect(plot).to receive(:show).ordered
|
|
41
37
|
|
|
42
|
-
vector.plot(type: type)
|
|
38
|
+
expect(vector.plot(type: type)).to eq plot
|
|
43
39
|
end
|
|
44
40
|
end
|
|
45
41
|
end
|
|
@@ -48,9 +44,8 @@ describe Daru::Vector, 'plotting' do
|
|
|
48
44
|
context type.to_s do
|
|
49
45
|
it 'sets x axis to index' do
|
|
50
46
|
expect(plot).to receive(:add).with(type, [:a, :b, :c], [11, 22, 33]).ordered
|
|
51
|
-
expect(plot).to receive(:show).ordered
|
|
52
47
|
|
|
53
|
-
vector.plot(type: type)
|
|
48
|
+
expect(vector.plot(type: type)).to eq plot
|
|
54
49
|
end
|
|
55
50
|
end
|
|
56
51
|
end
|
|
@@ -58,7 +53,6 @@ describe Daru::Vector, 'plotting' do
|
|
|
58
53
|
context 'with block provided' do
|
|
59
54
|
it 'yields plot and diagram' do
|
|
60
55
|
expect(plot).to receive(:add).with(:box, [11, 22, 33]).ordered.and_return(diagram)
|
|
61
|
-
expect(plot).to receive(:show).ordered
|
|
62
56
|
|
|
63
57
|
expect { |b| vector.plot(type: :box, &b) }.to yield_with_args(plot, diagram)
|
|
64
58
|
end
|
|
@@ -109,7 +109,7 @@ describe Daru::Vector do
|
|
|
109
109
|
context '#to_html' do
|
|
110
110
|
let(:doc) { Nokogiri::HTML(vector.to_html) }
|
|
111
111
|
subject(:table) { doc.at('table') }
|
|
112
|
-
let(:header) {
|
|
112
|
+
let(:header) { doc.at('b') }
|
|
113
113
|
|
|
114
114
|
context 'simple' do
|
|
115
115
|
let(:vector) { Daru::Vector.new [1,nil,3],
|
|
@@ -119,13 +119,12 @@ describe Daru::Vector do
|
|
|
119
119
|
describe 'header' do
|
|
120
120
|
subject { header }
|
|
121
121
|
it { is_expected.not_to be_nil }
|
|
122
|
-
its(
|
|
123
|
-
|
|
124
|
-
"#{":category" if type == :category}" }
|
|
122
|
+
its(:text) { is_expected.to eq " Daru::Vector(3)"\
|
|
123
|
+
"#{":category" if type == :category} " }
|
|
125
124
|
end
|
|
126
125
|
|
|
127
126
|
describe 'name' do
|
|
128
|
-
subject(:name) { table.at('tr:
|
|
127
|
+
subject(:name) { table.at('thead > tr:first-child > th:nth-child(2)') }
|
|
129
128
|
it { is_expected.not_to be_nil }
|
|
130
129
|
its(:text) { is_expected.to eq 'test' }
|
|
131
130
|
|
|
@@ -151,18 +150,18 @@ describe Daru::Vector do
|
|
|
151
150
|
|
|
152
151
|
context 'large vector' do
|
|
153
152
|
subject(:vector) { Daru::Vector.new [1,2,3] * 100, name: 'test', type: type }
|
|
154
|
-
it 'has only 30 rows (+
|
|
155
|
-
expect(table.search('tr').size).to eq
|
|
153
|
+
it 'has only 30 rows (+ 1 header rows, + 2 finishing rows)' do
|
|
154
|
+
expect(table.search('tr').size).to eq 33
|
|
156
155
|
end
|
|
157
156
|
|
|
158
157
|
describe '"skipped" row' do
|
|
159
|
-
subject(:row) { table.search('tr:nth-child(
|
|
158
|
+
subject(:row) { table.search('tr:nth-child(31) td').map(&:text) }
|
|
160
159
|
its(:count) { is_expected.to eq 2 }
|
|
161
160
|
it { is_expected.to eq ['...', '...'] }
|
|
162
161
|
end
|
|
163
162
|
|
|
164
163
|
describe 'last row' do
|
|
165
|
-
subject(:row) { table.search('tr:nth-child(
|
|
164
|
+
subject(:row) { table.search('tr:nth-child(32) td').map(&:text) }
|
|
166
165
|
its(:count) { is_expected.to eq 2 }
|
|
167
166
|
it { is_expected.to eq ['299', '3'] }
|
|
168
167
|
end
|
|
@@ -189,19 +188,18 @@ describe Daru::Vector do
|
|
|
189
188
|
describe 'header' do
|
|
190
189
|
subject { header }
|
|
191
190
|
it { is_expected.not_to be_nil }
|
|
192
|
-
its(
|
|
193
|
-
|
|
194
|
-
"#{":category" if type == :category}" }
|
|
191
|
+
its(:text) { is_expected.to eq " Daru::Vector(7)"\
|
|
192
|
+
"#{":category" if type == :category} " }
|
|
195
193
|
end
|
|
196
194
|
|
|
197
195
|
describe 'name row' do
|
|
198
|
-
subject(:row) { table.at('tr:nth-child(
|
|
196
|
+
subject(:row) { table.at('thead > tr:nth-child(1)').search('th') }
|
|
199
197
|
its(:count) { should == 2 }
|
|
200
198
|
it { expect(row.first['colspan']).to eq '2' }
|
|
201
199
|
end
|
|
202
200
|
|
|
203
201
|
describe 'first data row' do
|
|
204
|
-
let(:row) { table.at('tr:
|
|
202
|
+
let(:row) { table.at('tbody > tr:first-child') }
|
|
205
203
|
subject { row.inner_html.scan(/<t[dh].+?<\/t[dh]>/) }
|
|
206
204
|
it { is_expected.to eq [
|
|
207
205
|
'<th rowspan="3">foo</th>',
|
data/spec/spec_helper.rb
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
require 'rspec'
|
|
2
2
|
require 'rspec/its'
|
|
3
|
+
require 'rspec/expectations'
|
|
3
4
|
require 'matrix'
|
|
4
5
|
require 'awesome_print'
|
|
5
6
|
require 'distribution'
|
|
@@ -7,6 +8,7 @@ require 'tempfile'
|
|
|
7
8
|
require 'pry-byebug'
|
|
8
9
|
require 'nokogiri'
|
|
9
10
|
require 'gruff'
|
|
11
|
+
require 'webmock/rspec'
|
|
10
12
|
|
|
11
13
|
def mri?
|
|
12
14
|
RUBY_ENGINE == 'ruby'
|
|
@@ -16,25 +18,27 @@ def jruby?
|
|
|
16
18
|
RUBY_ENGINE == 'jruby'
|
|
17
19
|
end
|
|
18
20
|
|
|
19
|
-
if jruby?
|
|
20
|
-
require 'mdarray'
|
|
21
|
-
else
|
|
22
|
-
require 'nmatrix/nmatrix'
|
|
23
|
-
end
|
|
24
|
-
|
|
25
21
|
RSpec::Expectations.configuration.warn_about_potential_false_positives = false
|
|
26
22
|
|
|
27
23
|
require 'simplecov'
|
|
28
24
|
SimpleCov.start do
|
|
29
25
|
add_filter 'vendor'
|
|
30
26
|
add_filter 'spec'
|
|
31
|
-
minimum_coverage_by_file 95
|
|
27
|
+
# minimum_coverage_by_file 95 -- too strict for now. Reconsider after specs redesign.
|
|
32
28
|
end
|
|
33
29
|
|
|
34
30
|
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
|
35
31
|
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
|
36
32
|
require 'daru'
|
|
37
33
|
|
|
34
|
+
if jruby?
|
|
35
|
+
require 'mdarray'
|
|
36
|
+
else
|
|
37
|
+
if Daru.has_nmatrix?
|
|
38
|
+
require 'nmatrix/nmatrix'
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
38
42
|
ALL_DTYPES = [:nmatrix, :gsl, :array]
|
|
39
43
|
|
|
40
44
|
# FIXME: This must go! Need to be able to use be_within
|
|
@@ -51,6 +55,25 @@ def expect_correct_df_in_delta df1, df2, delta
|
|
|
51
55
|
end
|
|
52
56
|
end
|
|
53
57
|
|
|
58
|
+
RSpec::Matchers.define :be_all_within do |delta|
|
|
59
|
+
match do |actual|
|
|
60
|
+
expect(@expected).to_not be_nil
|
|
61
|
+
expect(actual.size).to equal(actual.size)
|
|
62
|
+
(@act, @exp), @idx = actual.zip(@expected).each_with_index.detect { |(a, e), _| (a - e).abs > delta }
|
|
63
|
+
@idx.nil?
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
chain :of do |expected|
|
|
67
|
+
@expected = expected
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
failure_message do |actual|
|
|
71
|
+
return "expected value must be provided using '.of'." if @expected.nil?
|
|
72
|
+
return "expected.size must equal actual.size." if @expected.size != actual.size
|
|
73
|
+
"at index=[#{@idx}], expected '#{actual[@idx]}' to be within '#{delta}' of '#{@expected[@idx]}'."
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
|
|
54
77
|
class String
|
|
55
78
|
# allows to pretty test agains multiline strings:
|
|
56
79
|
# %Q{
|
data/spec/vector_spec.rb
CHANGED
|
@@ -84,6 +84,11 @@ describe Daru::Vector do
|
|
|
84
84
|
expect(dv.index.to_a).to eq(['a', 'b', :r, 0])
|
|
85
85
|
end
|
|
86
86
|
|
|
87
|
+
it "initializes array with nils with dtype NMatrix" do
|
|
88
|
+
dv = Daru::Vector.new [2, nil], dtype: :nmatrix
|
|
89
|
+
expect(dv.to_a).to eq([2, nil])
|
|
90
|
+
expect(dv.index.to_a).to eq([0, 1])
|
|
91
|
+
end
|
|
87
92
|
end
|
|
88
93
|
|
|
89
94
|
context "#reorder!" do
|
|
@@ -358,6 +363,9 @@ describe Daru::Vector do
|
|
|
358
363
|
let (:idx) { Daru::Index.new [1, 0, :c] }
|
|
359
364
|
let (:dv) { Daru::Vector.new ['a', 'b', 'c'], index: idx }
|
|
360
365
|
|
|
366
|
+
let (:idx_dt) { Daru::DateTimeIndex.new(['2017-01-01', '2017-02-01', '2017-03-01']) }
|
|
367
|
+
let (:dv_dt) { Daru::Vector.new(['a', 'b', 'c'], index: idx_dt) }
|
|
368
|
+
|
|
361
369
|
context "single position" do
|
|
362
370
|
it { expect(dv.at 1).to eq 'b' }
|
|
363
371
|
end
|
|
@@ -405,6 +413,15 @@ describe Daru::Vector do
|
|
|
405
413
|
its(:to_a) { is_expected.to eq ['a'] }
|
|
406
414
|
its(:'index.to_a') { is_expected.to eq [1] }
|
|
407
415
|
end
|
|
416
|
+
|
|
417
|
+
context "Splat .at on DateTime index" do
|
|
418
|
+
subject { dv_dt.at(*[1,2]) }
|
|
419
|
+
|
|
420
|
+
it { is_expected.to be_a Daru::Vector }
|
|
421
|
+
its(:size) { is_expected.to eq 2 }
|
|
422
|
+
its(:to_a) { is_expected.to eq ['b', 'c'] }
|
|
423
|
+
its(:'index.to_a') { is_expected.to eq ['2017-02-01', '2017-03-01'] }
|
|
424
|
+
end
|
|
408
425
|
end
|
|
409
426
|
|
|
410
427
|
context Daru::MultiIndex do
|
|
@@ -833,6 +850,24 @@ describe Daru::Vector do
|
|
|
833
850
|
end
|
|
834
851
|
end
|
|
835
852
|
|
|
853
|
+
context '#last' do
|
|
854
|
+
subject(:vector) do
|
|
855
|
+
Daru::Vector.new (1..20).to_a, dtype: dtype
|
|
856
|
+
end
|
|
857
|
+
|
|
858
|
+
it 'takes 1 by default' do
|
|
859
|
+
expect(vector.last).to eq 20
|
|
860
|
+
end
|
|
861
|
+
|
|
862
|
+
it 'takes num if provided' do
|
|
863
|
+
expect(vector.last(3)).to eq Daru::Vector.new (18..20).to_a, index: (17..19).to_a
|
|
864
|
+
end
|
|
865
|
+
|
|
866
|
+
it 'does not fail on too large num' do
|
|
867
|
+
expect(vector.last(3000)).to eq vector
|
|
868
|
+
end
|
|
869
|
+
end
|
|
870
|
+
|
|
836
871
|
context "#concat" do
|
|
837
872
|
before :each do
|
|
838
873
|
@dv = Daru::Vector.new [1,2,3,4,5], name: :yoga,
|
|
@@ -998,6 +1033,26 @@ describe Daru::Vector do
|
|
|
998
1033
|
its(:to_json) { is_expected.to eq(vector.to_h.to_json) }
|
|
999
1034
|
end
|
|
1000
1035
|
|
|
1036
|
+
context "#to_s" do
|
|
1037
|
+
before do
|
|
1038
|
+
@v = Daru::Vector.new ["a", "b"], index: [1, 2]
|
|
1039
|
+
end
|
|
1040
|
+
|
|
1041
|
+
it 'produces a class, size description' do
|
|
1042
|
+
expect(@v.to_s).to eq("#<Daru::Vector(2)>")
|
|
1043
|
+
end
|
|
1044
|
+
|
|
1045
|
+
it 'produces a class, name, size description' do
|
|
1046
|
+
@v.name = "Test"
|
|
1047
|
+
expect(@v.to_s).to eq("#<Daru::Vector: Test(2)>")
|
|
1048
|
+
end
|
|
1049
|
+
|
|
1050
|
+
it 'produces a class, name, size description when the name is a symbol' do
|
|
1051
|
+
@v.name = :Test
|
|
1052
|
+
expect(@v.to_s).to eq("#<Daru::Vector: Test(2)>")
|
|
1053
|
+
end
|
|
1054
|
+
end
|
|
1055
|
+
|
|
1001
1056
|
context "#uniq" do
|
|
1002
1057
|
before do
|
|
1003
1058
|
@v = Daru::Vector.new [1, 2, 2, 2.0, 3, 3.0], index:[:a, :b, :c, :d, :e, :f]
|
|
@@ -1359,8 +1414,75 @@ describe Daru::Vector do
|
|
|
1359
1414
|
end
|
|
1360
1415
|
|
|
1361
1416
|
context "#summary" do
|
|
1362
|
-
|
|
1363
|
-
|
|
1417
|
+
subject { dv.summary }
|
|
1418
|
+
|
|
1419
|
+
context 'all types' do
|
|
1420
|
+
let(:dv) { Daru::Vector.new([1,2,3,4,5], name: 'vector') }
|
|
1421
|
+
|
|
1422
|
+
it { is_expected.to include dv.name }
|
|
1423
|
+
|
|
1424
|
+
it { is_expected.to include "n :#{dv.size}" }
|
|
1425
|
+
|
|
1426
|
+
it { is_expected.to include "non-missing:#{dv.size - dv.count_values(*Daru::MISSING_VALUES)}" }
|
|
1427
|
+
end
|
|
1428
|
+
|
|
1429
|
+
unless dtype == :nmatrix
|
|
1430
|
+
context "numeric type" do
|
|
1431
|
+
let(:dv) { Daru::Vector.new([1,2,5], name: 'numeric') }
|
|
1432
|
+
|
|
1433
|
+
it { is_expected. to eq %Q{
|
|
1434
|
+
|= numeric
|
|
1435
|
+
| n :3
|
|
1436
|
+
| non-missing:3
|
|
1437
|
+
| median: 2
|
|
1438
|
+
| mean: 2.6667
|
|
1439
|
+
| std.dev.: 2.0817
|
|
1440
|
+
| std.err.: 1.2019
|
|
1441
|
+
| skew: 0.2874
|
|
1442
|
+
| kurtosis: -2.3333
|
|
1443
|
+
}.unindent }
|
|
1444
|
+
end
|
|
1445
|
+
|
|
1446
|
+
context "numeric type with missing values" do
|
|
1447
|
+
let(:dv) { Daru::Vector.new([1,2,5,nil,Float::NAN], name: 'numeric') }
|
|
1448
|
+
|
|
1449
|
+
it { is_expected.not_to include 'skew' }
|
|
1450
|
+
it { is_expected.not_to include 'kurtosis' }
|
|
1451
|
+
end
|
|
1452
|
+
end
|
|
1453
|
+
|
|
1454
|
+
if dtype == :array
|
|
1455
|
+
context "object type" do
|
|
1456
|
+
let(:dv) { Daru::Vector.new([1,1,2,2,"string",nil,Float::NAN], name: 'object') }
|
|
1457
|
+
|
|
1458
|
+
if RUBY_VERSION >= '2.2'
|
|
1459
|
+
it { is_expected.to eq %Q{
|
|
1460
|
+
|= object
|
|
1461
|
+
| n :7
|
|
1462
|
+
| non-missing:5
|
|
1463
|
+
| factors: 1,2,string
|
|
1464
|
+
| mode: 1,2
|
|
1465
|
+
| Distribution
|
|
1466
|
+
| string 1 50.00%
|
|
1467
|
+
| NaN 1 50.00%
|
|
1468
|
+
| 1 2 100.00%
|
|
1469
|
+
| 2 2 100.00%
|
|
1470
|
+
}.unindent }
|
|
1471
|
+
else
|
|
1472
|
+
it { is_expected.to eq %Q{
|
|
1473
|
+
|= object
|
|
1474
|
+
| n :7
|
|
1475
|
+
| non-missing:5
|
|
1476
|
+
| factors: 1,2,string
|
|
1477
|
+
| mode: 1,2
|
|
1478
|
+
| Distribution
|
|
1479
|
+
| NaN 1 50.00%
|
|
1480
|
+
| string 1 50.00%
|
|
1481
|
+
| 2 2 100.00%
|
|
1482
|
+
| 1 2 100.00%
|
|
1483
|
+
}.unindent }
|
|
1484
|
+
end
|
|
1485
|
+
end
|
|
1364
1486
|
end
|
|
1365
1487
|
end
|
|
1366
1488
|
|
|
@@ -1388,27 +1510,19 @@ describe Daru::Vector do
|
|
|
1388
1510
|
end
|
|
1389
1511
|
end
|
|
1390
1512
|
|
|
1391
|
-
context
|
|
1392
|
-
|
|
1393
|
-
@with_md = Daru::Vector.new([1,2,nil,3,4,nil])
|
|
1394
|
-
@without_md = Daru::Vector.new([1,2,3,4,5,6])
|
|
1395
|
-
end
|
|
1396
|
-
|
|
1397
|
-
it "verifies missing data presence" do
|
|
1398
|
-
expect(@with_md.is_nil?) .to eq(Daru::Vector.new([false,false,true,false,false,true]))
|
|
1399
|
-
expect(@without_md.is_nil?).to eq(Daru::Vector.new([false,false,false,false,false,false]))
|
|
1400
|
-
end
|
|
1401
|
-
end
|
|
1513
|
+
context '#is_values' do
|
|
1514
|
+
let(:dv) { Daru::Vector.new [10, 11, 10, nil, nil] }
|
|
1402
1515
|
|
|
1403
|
-
|
|
1404
|
-
|
|
1405
|
-
|
|
1406
|
-
|
|
1516
|
+
context 'single value' do
|
|
1517
|
+
subject { dv.is_values 10 }
|
|
1518
|
+
it { is_expected.to be_a Daru::Vector }
|
|
1519
|
+
its(:to_a) { is_expected.to eq [true, false, true, false, false] }
|
|
1407
1520
|
end
|
|
1408
1521
|
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1522
|
+
context 'multiple values' do
|
|
1523
|
+
subject { dv.is_values 10, nil }
|
|
1524
|
+
it { is_expected.to be_a Daru::Vector }
|
|
1525
|
+
its(:to_a) { is_expected.to eq [true, false, true, true, true] }
|
|
1412
1526
|
end
|
|
1413
1527
|
end
|
|
1414
1528
|
|
|
@@ -1433,7 +1547,7 @@ describe Daru::Vector do
|
|
|
1433
1547
|
index: 11..18 }
|
|
1434
1548
|
context 'reject only nils' do
|
|
1435
1549
|
subject { dv.reject_values nil }
|
|
1436
|
-
|
|
1550
|
+
|
|
1437
1551
|
it { is_expected.to be_a Daru::Vector }
|
|
1438
1552
|
its(:to_a) { is_expected.to eq [1, 3, :a, Float::NAN, Float::NAN, 1] }
|
|
1439
1553
|
its(:'index.to_a') { is_expected.to eq [11, 13, 14, 15, 17, 18] }
|
|
@@ -1441,7 +1555,7 @@ describe Daru::Vector do
|
|
|
1441
1555
|
|
|
1442
1556
|
context 'reject only float::NAN' do
|
|
1443
1557
|
subject { dv.reject_values Float::NAN }
|
|
1444
|
-
|
|
1558
|
+
|
|
1445
1559
|
it { is_expected.to be_a Daru::Vector }
|
|
1446
1560
|
its(:to_a) { is_expected.to eq [1, nil, 3, :a, nil, 1] }
|
|
1447
1561
|
its(:'index.to_a') { is_expected.to eq [11, 12, 13, 14, 16, 18] }
|
|
@@ -1449,15 +1563,15 @@ describe Daru::Vector do
|
|
|
1449
1563
|
|
|
1450
1564
|
context 'reject both nil and float::NAN' do
|
|
1451
1565
|
subject { dv.reject_values nil, Float::NAN }
|
|
1452
|
-
|
|
1566
|
+
|
|
1453
1567
|
it { is_expected.to be_a Daru::Vector }
|
|
1454
1568
|
its(:to_a) { is_expected.to eq [1, 3, :a, 1] }
|
|
1455
1569
|
its(:'index.to_a') { is_expected.to eq [11, 13, 14, 18] }
|
|
1456
1570
|
end
|
|
1457
|
-
|
|
1571
|
+
|
|
1458
1572
|
context 'reject any other value' do
|
|
1459
1573
|
subject { dv.reject_values 1, 3 }
|
|
1460
|
-
|
|
1574
|
+
|
|
1461
1575
|
it { is_expected.to be_a Daru::Vector }
|
|
1462
1576
|
its(:to_a) { is_expected.to eq [nil, :a, Float::NAN, nil, Float::NAN] }
|
|
1463
1577
|
its(:'index.to_a') { is_expected.to eq [12, 14, 15, 16, 17] }
|
|
@@ -1465,25 +1579,25 @@ describe Daru::Vector do
|
|
|
1465
1579
|
|
|
1466
1580
|
context 'when resultant vector has only one value' do
|
|
1467
1581
|
subject { dv.reject_values 1, :a, nil, Float::NAN }
|
|
1468
|
-
|
|
1582
|
+
|
|
1469
1583
|
it { is_expected.to be_a Daru::Vector }
|
|
1470
1584
|
its(:to_a) { is_expected.to eq [3] }
|
|
1471
1585
|
its(:'index.to_a') { is_expected.to eq [13] }
|
|
1472
1586
|
end
|
|
1473
|
-
|
|
1587
|
+
|
|
1474
1588
|
context 'when resultant vector has no value' do
|
|
1475
1589
|
subject { dv.reject_values 1, 3, :a, nil, Float::NAN, 5 }
|
|
1476
|
-
|
|
1590
|
+
|
|
1477
1591
|
it { is_expected.to be_a Daru::Vector }
|
|
1478
1592
|
its(:to_a) { is_expected.to eq [] }
|
|
1479
1593
|
its(:'index.to_a') { is_expected.to eq [] }
|
|
1480
1594
|
end
|
|
1481
|
-
|
|
1595
|
+
|
|
1482
1596
|
context 'works for gsl' do
|
|
1483
1597
|
let(:dv) { Daru::Vector.new [1, 2, 3, Float::NAN], dtype: :gsl,
|
|
1484
1598
|
index: 11..14 }
|
|
1485
1599
|
subject { dv.reject_values Float::NAN }
|
|
1486
|
-
|
|
1600
|
+
|
|
1487
1601
|
it { is_expected.to be_a Daru::Vector }
|
|
1488
1602
|
its(:dtype) { is_expected.to eq :gsl }
|
|
1489
1603
|
its(:to_a) { is_expected.to eq [1, 2, 3].map(&:to_f) }
|
|
@@ -1501,31 +1615,31 @@ describe Daru::Vector do
|
|
|
1501
1615
|
|
|
1502
1616
|
context 'reject only nils' do
|
|
1503
1617
|
subject { dv.reject_values nil }
|
|
1504
|
-
|
|
1618
|
+
|
|
1505
1619
|
it { is_expected.to be_a Daru::Vector }
|
|
1506
1620
|
its(:to_a) { is_expected.to eq [1, 3, :a, Float::NAN, Float::NAN, 1] }
|
|
1507
1621
|
its(:'index.to_a') { is_expected.to eq [11, 13, 14, 15, 17, 18] }
|
|
1508
1622
|
end
|
|
1509
|
-
|
|
1623
|
+
|
|
1510
1624
|
context 'reject only float::NAN' do
|
|
1511
1625
|
subject { dv.reject_values Float::NAN }
|
|
1512
|
-
|
|
1626
|
+
|
|
1513
1627
|
it { is_expected.to be_a Daru::Vector }
|
|
1514
1628
|
its(:to_a) { is_expected.to eq [1, nil, 3, :a, nil, 1] }
|
|
1515
1629
|
its(:'index.to_a') { is_expected.to eq [11, 12, 13, 14, 16, 18] }
|
|
1516
1630
|
end
|
|
1517
|
-
|
|
1631
|
+
|
|
1518
1632
|
context 'reject both nil and float::NAN' do
|
|
1519
1633
|
subject { dv.reject_values nil, Float::NAN }
|
|
1520
|
-
|
|
1634
|
+
|
|
1521
1635
|
it { is_expected.to be_a Daru::Vector }
|
|
1522
1636
|
its(:to_a) { is_expected.to eq [1, 3, :a, 1] }
|
|
1523
1637
|
its(:'index.to_a') { is_expected.to eq [11, 13, 14, 18] }
|
|
1524
1638
|
end
|
|
1525
|
-
|
|
1639
|
+
|
|
1526
1640
|
context 'reject any other value' do
|
|
1527
1641
|
subject { dv.reject_values 1, 3 }
|
|
1528
|
-
|
|
1642
|
+
|
|
1529
1643
|
it { is_expected.to be_a Daru::Vector }
|
|
1530
1644
|
its(:to_a) { is_expected.to eq [nil, :a, Float::NAN, nil, Float::NAN] }
|
|
1531
1645
|
its(:'index.to_a') { is_expected.to eq [12, 14, 15, 16, 17] }
|
|
@@ -1563,24 +1677,24 @@ describe Daru::Vector do
|
|
|
1563
1677
|
let(:dv) { Daru::Vector.new [1, Float::NAN, 2, 3] }
|
|
1564
1678
|
it { expect(dv.include_values? nil, Float::NAN).to eq true }
|
|
1565
1679
|
end
|
|
1566
|
-
|
|
1680
|
+
|
|
1567
1681
|
context 'true with only Float::NAN' do
|
|
1568
1682
|
let(:dv) { Daru::Vector.new [1, nil, 2, 3] }
|
|
1569
1683
|
it { expect(dv.include_values? nil, Float::NAN).to eq true }
|
|
1570
1684
|
end
|
|
1571
|
-
|
|
1685
|
+
|
|
1572
1686
|
context 'false' do
|
|
1573
1687
|
let(:dv) { Daru::Vector.new [1, 2, 3] }
|
|
1574
1688
|
it { expect(dv.include_values? nil, Float::NAN).to eq false }
|
|
1575
1689
|
end
|
|
1576
1690
|
end
|
|
1577
|
-
|
|
1691
|
+
|
|
1578
1692
|
context 'any other value' do
|
|
1579
1693
|
context 'true' do
|
|
1580
1694
|
let(:dv) { Daru::Vector.new [1, 2, 3, 4, nil] }
|
|
1581
1695
|
it { expect(dv.include_values? 1, 2, 3, 5).to eq true }
|
|
1582
1696
|
end
|
|
1583
|
-
|
|
1697
|
+
|
|
1584
1698
|
context 'false' do
|
|
1585
1699
|
let(:dv) { Daru::Vector.new [1, 2, 3, 4, nil] }
|
|
1586
1700
|
it { expect(dv.include_values? 5, 6).to eq false }
|
|
@@ -1600,12 +1714,12 @@ describe Daru::Vector do
|
|
|
1600
1714
|
context Daru::Index do
|
|
1601
1715
|
let(:dv) { Daru::Vector.new [1, 2, 1, 2, 3, nil, nil, Float::NAN],
|
|
1602
1716
|
index: 11..18 }
|
|
1603
|
-
|
|
1717
|
+
|
|
1604
1718
|
subject { dv.indexes 1, 2, nil, Float::NAN }
|
|
1605
1719
|
it { is_expected.to be_a Array }
|
|
1606
1720
|
it { is_expected.to eq [11, 12, 13, 14, 16, 17, 18] }
|
|
1607
1721
|
end
|
|
1608
|
-
|
|
1722
|
+
|
|
1609
1723
|
context Daru::MultiIndex do
|
|
1610
1724
|
let(:mi) do
|
|
1611
1725
|
Daru::MultiIndex.from_tuples([
|
|
@@ -1621,7 +1735,7 @@ describe Daru::Vector do
|
|
|
1621
1735
|
end
|
|
1622
1736
|
let(:dv) { Daru::Vector.new [1, 2, 1, 2, 3, nil, nil, Float::NAN],
|
|
1623
1737
|
index: mi }
|
|
1624
|
-
|
|
1738
|
+
|
|
1625
1739
|
subject { dv.indexes 1, 2, Float::NAN }
|
|
1626
1740
|
it { is_expected.to be_a Array }
|
|
1627
1741
|
it { is_expected.to eq(
|
|
@@ -1634,7 +1748,7 @@ describe Daru::Vector do
|
|
|
1634
1748
|
]) }
|
|
1635
1749
|
end
|
|
1636
1750
|
end
|
|
1637
|
-
|
|
1751
|
+
|
|
1638
1752
|
context '#replace_values' do
|
|
1639
1753
|
subject do
|
|
1640
1754
|
Daru::Vector.new(
|
|
@@ -1647,13 +1761,13 @@ describe Daru::Vector do
|
|
|
1647
1761
|
before { subject.replace_values [nil, Float::NAN], 10 }
|
|
1648
1762
|
its(:to_a) { is_expected.to eq [1, 2, 1, 4, 10, 10, 10, 10] }
|
|
1649
1763
|
end
|
|
1650
|
-
|
|
1764
|
+
|
|
1651
1765
|
context 'replace arbitrary values' do
|
|
1652
1766
|
before { subject.replace_values [1, 2], 10 }
|
|
1653
1767
|
its(:to_a) { is_expected.to eq(
|
|
1654
1768
|
[10, 10, 10, 4, nil, Float::NAN, nil, Float::NAN]) }
|
|
1655
1769
|
end
|
|
1656
|
-
|
|
1770
|
+
|
|
1657
1771
|
context 'works for single value' do
|
|
1658
1772
|
before { subject.replace_values nil, 10 }
|
|
1659
1773
|
its(:to_a) { is_expected.to eq(
|
|
@@ -1673,6 +1787,61 @@ describe Daru::Vector do
|
|
|
1673
1787
|
end
|
|
1674
1788
|
end
|
|
1675
1789
|
|
|
1790
|
+
context '#rolling_fillna!' do
|
|
1791
|
+
subject do
|
|
1792
|
+
Daru::Vector.new(
|
|
1793
|
+
[Float::NAN, 2, 1, 4, nil, Float::NAN, 3, nil, Float::NAN]
|
|
1794
|
+
)
|
|
1795
|
+
end
|
|
1796
|
+
|
|
1797
|
+
context 'rolling_fillna! forwards' do
|
|
1798
|
+
before { subject.rolling_fillna!(:forward) }
|
|
1799
|
+
its(:to_a) { is_expected.to eq [0, 2, 1, 4, 4, 4, 3, 3, 3] }
|
|
1800
|
+
end
|
|
1801
|
+
|
|
1802
|
+
context 'rolling_fillna! backwards' do
|
|
1803
|
+
before { subject.rolling_fillna!(direction: :backward) }
|
|
1804
|
+
its(:to_a) { is_expected.to eq [2, 2, 1, 4, 3, 3, 3, 0, 0] }
|
|
1805
|
+
end
|
|
1806
|
+
|
|
1807
|
+
context 'all invalid vector' do
|
|
1808
|
+
subject do
|
|
1809
|
+
Daru::Vector.new(
|
|
1810
|
+
[Float::NAN, Float::NAN, Float::NAN, Float::NAN, Float::NAN]
|
|
1811
|
+
)
|
|
1812
|
+
end
|
|
1813
|
+
before { subject.rolling_fillna!(:forward) }
|
|
1814
|
+
its(:to_a) { is_expected.to eq [0, 0, 0, 0, 0] }
|
|
1815
|
+
end
|
|
1816
|
+
|
|
1817
|
+
context 'with non-default index' do
|
|
1818
|
+
subject do
|
|
1819
|
+
Daru::Vector.new(
|
|
1820
|
+
[Float::NAN, 2, 1, 4, nil, Float::NAN, 3, nil, Float::NAN],
|
|
1821
|
+
index: %w[a b c d e f g h i]
|
|
1822
|
+
)
|
|
1823
|
+
end
|
|
1824
|
+
before { subject.rolling_fillna!(direction: :backward) }
|
|
1825
|
+
it { is_expected.to eq Daru::Vector.new([2, 2, 1, 4, 3, 3, 3, 0, 0], index: %w[a b c d e f g h i]) }
|
|
1826
|
+
end
|
|
1827
|
+
end
|
|
1828
|
+
|
|
1829
|
+
context '#rolling_fillna' do
|
|
1830
|
+
subject do
|
|
1831
|
+
Daru::Vector.new(
|
|
1832
|
+
[Float::NAN, 2, 1, 4, nil, Float::NAN, 3, nil, Float::NAN]
|
|
1833
|
+
)
|
|
1834
|
+
end
|
|
1835
|
+
|
|
1836
|
+
context 'rolling_fillna forwards' do
|
|
1837
|
+
it { expect(subject.rolling_fillna(:forward).to_a).to eq [0, 2, 1, 4, 4, 4, 3, 3, 3] }
|
|
1838
|
+
end
|
|
1839
|
+
|
|
1840
|
+
context 'rolling_fillna backwards' do
|
|
1841
|
+
it { expect(subject.rolling_fillna(direction: :backward).to_a).to eq [2, 2, 1, 4, 3, 3, 3, 0, 0] }
|
|
1842
|
+
end
|
|
1843
|
+
end
|
|
1844
|
+
|
|
1676
1845
|
context "#type" do
|
|
1677
1846
|
before(:each) do
|
|
1678
1847
|
@numeric = Daru::Vector.new([1,2,3,4,5])
|
|
@@ -1741,7 +1910,7 @@ describe Daru::Vector do
|
|
|
1741
1910
|
|
|
1742
1911
|
context '#to_nmatrix' do
|
|
1743
1912
|
let(:dv) { Daru::Vector.new [1, 2, 3, 4, 5] }
|
|
1744
|
-
|
|
1913
|
+
|
|
1745
1914
|
context 'horizontal axis' do
|
|
1746
1915
|
subject { dv.to_nmatrix }
|
|
1747
1916
|
|
|
@@ -1749,19 +1918,19 @@ describe Daru::Vector do
|
|
|
1749
1918
|
its(:shape) { is_expected.to eq [1, 5] }
|
|
1750
1919
|
its(:to_a) { is_expected.to eq [1, 2, 3, 4, 5] }
|
|
1751
1920
|
end
|
|
1752
|
-
|
|
1921
|
+
|
|
1753
1922
|
context 'vertical axis' do
|
|
1754
1923
|
subject { dv.to_nmatrix :vertical }
|
|
1755
|
-
|
|
1924
|
+
|
|
1756
1925
|
it { is_expected.to be_a NMatrix }
|
|
1757
1926
|
its(:shape) { is_expected.to eq [5, 1] }
|
|
1758
1927
|
its(:to_a) { is_expected.to eq [1, 2, 3, 4, 5].map { |i| [i] } }
|
|
1759
1928
|
end
|
|
1760
|
-
|
|
1929
|
+
|
|
1761
1930
|
context 'invalid axis' do
|
|
1762
1931
|
it { expect { dv.to_nmatrix :hello }.to raise_error ArgumentError }
|
|
1763
1932
|
end
|
|
1764
|
-
|
|
1933
|
+
|
|
1765
1934
|
context 'vector contain non-numeric' do
|
|
1766
1935
|
let(:dv) { Daru::Vector.new [1, 2, nil, 4] }
|
|
1767
1936
|
it { expect { dv.to_nmatrix }.to raise_error ArgumentError }
|
|
@@ -1904,52 +2073,90 @@ describe Daru::Vector do
|
|
|
1904
2073
|
end
|
|
1905
2074
|
end
|
|
1906
2075
|
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
|
|
2076
|
+
describe '#lag' do
|
|
2077
|
+
let(:source) { Daru::Vector.new(1..5) }
|
|
2078
|
+
|
|
2079
|
+
context 'by default' do
|
|
2080
|
+
subject { source.lag }
|
|
2081
|
+
it { is_expected.to eq Daru::Vector.new([nil, 1, 2, 3, 4]) }
|
|
1911
2082
|
end
|
|
1912
2083
|
|
|
1913
|
-
|
|
1914
|
-
lag1 = @xiu.lag
|
|
2084
|
+
subject { source.lag(amount) }
|
|
1915
2085
|
|
|
1916
|
-
|
|
1917
|
-
|
|
2086
|
+
context '0' do
|
|
2087
|
+
let(:amount) { 0 }
|
|
2088
|
+
it { is_expected.to eq Daru::Vector.new([1, 2, 3, 4, 5]) }
|
|
2089
|
+
end
|
|
1918
2090
|
|
|
1919
|
-
|
|
1920
|
-
|
|
2091
|
+
context 'same as vector size' do
|
|
2092
|
+
let(:amount) { source.size }
|
|
2093
|
+
it { is_expected.to eq Daru::Vector.new([nil]*source.size) }
|
|
2094
|
+
end
|
|
2095
|
+
|
|
2096
|
+
context 'same as vector -ve size' do
|
|
2097
|
+
let(:amount) { -source.size }
|
|
2098
|
+
it { is_expected.to eq Daru::Vector.new([nil]*source.size) }
|
|
2099
|
+
end
|
|
2100
|
+
|
|
2101
|
+
context 'positive' do
|
|
2102
|
+
let(:amount) { 2 }
|
|
2103
|
+
it { is_expected.to eq Daru::Vector.new([nil, nil, 1, 2, 3]) }
|
|
2104
|
+
end
|
|
2105
|
+
|
|
2106
|
+
context 'negative' do
|
|
2107
|
+
let(:amount) { -1 }
|
|
2108
|
+
it { is_expected.to eq Daru::Vector.new([2, 3, 4, 5, nil]) }
|
|
2109
|
+
end
|
|
1921
2110
|
|
|
1922
|
-
|
|
1923
|
-
|
|
2111
|
+
context 'large positive' do
|
|
2112
|
+
let(:amount) { source.size + 100 }
|
|
2113
|
+
it { is_expected.to eq Daru::Vector.new([nil]*source.size) }
|
|
1924
2114
|
end
|
|
2115
|
+
|
|
2116
|
+
context 'large negative' do
|
|
2117
|
+
let(:amount) { -(source.size + 100) }
|
|
2118
|
+
it { is_expected.to eq Daru::Vector.new([nil]*source.size) }
|
|
2119
|
+
end
|
|
2120
|
+
|
|
1925
2121
|
end
|
|
1926
|
-
|
|
2122
|
+
|
|
1927
2123
|
context "#group_by" do
|
|
1928
2124
|
let(:dv) { Daru::Vector.new [:a, :b, :a, :b, :c] }
|
|
1929
|
-
|
|
2125
|
+
|
|
1930
2126
|
context 'vector not specified' do
|
|
1931
|
-
subject { dv.group_by }
|
|
1932
|
-
|
|
2127
|
+
subject { dv.group_by }
|
|
2128
|
+
|
|
1933
2129
|
it { is_expected.to be_a Daru::Core::GroupBy }
|
|
1934
2130
|
its(:'groups.size') { is_expected.to eq 3 }
|
|
1935
2131
|
its(:groups) { is_expected.to eq({[:a]=>[0, 2], [:b]=>[1, 3], [:c]=>[4]}) }
|
|
1936
2132
|
end
|
|
1937
|
-
|
|
2133
|
+
|
|
1938
2134
|
context 'vector name specified' do
|
|
1939
2135
|
before { dv.name = :hello }
|
|
1940
2136
|
subject { dv.group_by :hello }
|
|
1941
|
-
|
|
2137
|
+
|
|
1942
2138
|
it { is_expected.to be_a Daru::Core::GroupBy }
|
|
1943
2139
|
its(:'groups.size') { is_expected.to eq 3 }
|
|
1944
|
-
its(:groups) { is_expected.to eq({[:a]=>[0, 2], [:b]=>[1, 3], [:c]=>[4]}) }
|
|
2140
|
+
its(:groups) { is_expected.to eq({[:a]=>[0, 2], [:b]=>[1, 3], [:c]=>[4]}) }
|
|
1945
2141
|
end
|
|
1946
|
-
|
|
2142
|
+
|
|
1947
2143
|
context 'vector name invalid' do
|
|
1948
2144
|
before { dv.name = :hello }
|
|
1949
2145
|
it { expect { dv.group_by :abc }.to raise_error }
|
|
1950
2146
|
end
|
|
1951
2147
|
end
|
|
1952
2148
|
|
|
2149
|
+
context '#match' do
|
|
2150
|
+
subject { dv.match(regexp) }
|
|
2151
|
+
|
|
2152
|
+
context 'returns matching array for a given regexp' do
|
|
2153
|
+
let(:dv) { Daru::Vector.new ['3 days', '5 weeks', '2 weeks'] }
|
|
2154
|
+
let(:regexp) { /weeks/ }
|
|
2155
|
+
|
|
2156
|
+
it { is_expected.to eq([false, true, true]) }
|
|
2157
|
+
end
|
|
2158
|
+
end
|
|
2159
|
+
|
|
1953
2160
|
context '#method_missing' do
|
|
1954
2161
|
context 'getting' do
|
|
1955
2162
|
subject(:vector) { Daru::Vector.new [1,2,3], index: [:a, :b, :c] }
|
|
@@ -1974,6 +2181,24 @@ describe Daru::Vector do
|
|
|
1974
2181
|
end
|
|
1975
2182
|
end
|
|
1976
2183
|
|
|
2184
|
+
context "#sort_by_index" do
|
|
2185
|
+
let(:asc) { vector.sort_by_index }
|
|
2186
|
+
let(:desc) { vector.sort_by_index(ascending: false) }
|
|
2187
|
+
|
|
2188
|
+
context 'numeric vector' do
|
|
2189
|
+
let(:vector) { Daru::Vector.new [11, 13, 12], index: [23, 21, 22] }
|
|
2190
|
+
specify { expect(asc.to_a).to eq [13, 12, 11] }
|
|
2191
|
+
specify { expect(desc.to_a).to eq [11, 12, 13] }
|
|
2192
|
+
end
|
|
2193
|
+
|
|
2194
|
+
context 'mix variable type index' do
|
|
2195
|
+
let(:vector) { Daru::Vector.new [11, Float::NAN, nil],
|
|
2196
|
+
index: [21, 23, 22] }
|
|
2197
|
+
specify { expect(asc.to_a).to eq [11, nil, Float::NAN] }
|
|
2198
|
+
specify { expect(desc.to_a).to eq [Float::NAN, nil, 11] }
|
|
2199
|
+
end
|
|
2200
|
+
end
|
|
2201
|
+
|
|
1977
2202
|
context '#db_type' do
|
|
1978
2203
|
it 'is DATE for vector with any date in it' do
|
|
1979
2204
|
# FIXME: is it sane?.. - zverok
|
|
@@ -2003,4 +2228,13 @@ describe Daru::Vector do
|
|
|
2003
2228
|
end
|
|
2004
2229
|
end
|
|
2005
2230
|
|
|
2231
|
+
context '#where clause when Nan, nil data value is present' do
|
|
2232
|
+
let(:v) { Daru::Vector.new([1,2,3,Float::NAN, nil]) }
|
|
2233
|
+
|
|
2234
|
+
it 'missing/undefined data in Vector/DataFrame' do
|
|
2235
|
+
expect(v.where(v.lt(4))).to eq(Daru::Vector.new([1,2,3]))
|
|
2236
|
+
expect(v.where(v.lt(3))).to eq(Daru::Vector.new([1,2]))
|
|
2237
|
+
expect(v.where(v.lt(2))).to eq(Daru::Vector.new([1]))
|
|
2238
|
+
end
|
|
2239
|
+
end
|
|
2006
2240
|
end if mri?
|