daru_lite 0.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +38 -0
  3. data/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  4. data/.github/workflows/ci.yml +20 -0
  5. data/.rubocop_todo.yml +35 -33
  6. data/README.md +19 -115
  7. data/daru_lite.gemspec +1 -0
  8. data/lib/daru_lite/data_frame/aggregatable.rb +165 -0
  9. data/lib/daru_lite/data_frame/calculatable.rb +140 -0
  10. data/lib/daru_lite/data_frame/convertible.rb +107 -0
  11. data/lib/daru_lite/data_frame/duplicatable.rb +64 -0
  12. data/lib/daru_lite/data_frame/fetchable.rb +301 -0
  13. data/lib/daru_lite/data_frame/filterable.rb +144 -0
  14. data/lib/daru_lite/data_frame/i_o_able.rb +179 -0
  15. data/lib/daru_lite/data_frame/indexable.rb +168 -0
  16. data/lib/daru_lite/data_frame/iterable.rb +339 -0
  17. data/lib/daru_lite/data_frame/joinable.rb +152 -0
  18. data/lib/daru_lite/data_frame/missable.rb +75 -0
  19. data/lib/daru_lite/data_frame/pivotable.rb +108 -0
  20. data/lib/daru_lite/data_frame/queryable.rb +67 -0
  21. data/lib/daru_lite/data_frame/setable.rb +109 -0
  22. data/lib/daru_lite/data_frame/sortable.rb +241 -0
  23. data/lib/daru_lite/dataframe.rb +142 -2355
  24. data/lib/daru_lite/index/index.rb +13 -0
  25. data/lib/daru_lite/maths/statistics/vector.rb +1 -1
  26. data/lib/daru_lite/vector/aggregatable.rb +9 -0
  27. data/lib/daru_lite/vector/calculatable.rb +78 -0
  28. data/lib/daru_lite/vector/convertible.rb +77 -0
  29. data/lib/daru_lite/vector/duplicatable.rb +17 -0
  30. data/lib/daru_lite/vector/fetchable.rb +175 -0
  31. data/lib/daru_lite/vector/filterable.rb +128 -0
  32. data/lib/daru_lite/vector/indexable.rb +77 -0
  33. data/lib/daru_lite/vector/iterable.rb +95 -0
  34. data/lib/daru_lite/vector/joinable.rb +17 -0
  35. data/lib/daru_lite/vector/missable.rb +124 -0
  36. data/lib/daru_lite/vector/queryable.rb +45 -0
  37. data/lib/daru_lite/vector/setable.rb +47 -0
  38. data/lib/daru_lite/vector/sortable.rb +113 -0
  39. data/lib/daru_lite/vector.rb +36 -932
  40. data/lib/daru_lite/version.rb +1 -1
  41. data/spec/data_frame/aggregatable_example.rb +65 -0
  42. data/spec/data_frame/buildable_example.rb +109 -0
  43. data/spec/data_frame/calculatable_example.rb +135 -0
  44. data/spec/data_frame/convertible_example.rb +180 -0
  45. data/spec/data_frame/duplicatable_example.rb +111 -0
  46. data/spec/data_frame/fetchable_example.rb +476 -0
  47. data/spec/data_frame/filterable_example.rb +250 -0
  48. data/spec/data_frame/indexable_example.rb +221 -0
  49. data/spec/data_frame/iterable_example.rb +465 -0
  50. data/spec/data_frame/joinable_example.rb +106 -0
  51. data/spec/data_frame/missable_example.rb +47 -0
  52. data/spec/data_frame/pivotable_example.rb +297 -0
  53. data/spec/data_frame/queryable_example.rb +92 -0
  54. data/spec/data_frame/setable_example.rb +482 -0
  55. data/spec/data_frame/sortable_example.rb +350 -0
  56. data/spec/dataframe_spec.rb +181 -3243
  57. data/spec/index/index_spec.rb +8 -0
  58. data/spec/vector/aggregatable_example.rb +27 -0
  59. data/spec/vector/calculatable_example.rb +82 -0
  60. data/spec/vector/convertible_example.rb +126 -0
  61. data/spec/vector/duplicatable_example.rb +48 -0
  62. data/spec/vector/fetchable_example.rb +463 -0
  63. data/spec/vector/filterable_example.rb +165 -0
  64. data/spec/vector/indexable_example.rb +201 -0
  65. data/spec/vector/iterable_example.rb +111 -0
  66. data/spec/vector/joinable_example.rb +25 -0
  67. data/spec/vector/missable_example.rb +88 -0
  68. data/spec/vector/queryable_example.rb +91 -0
  69. data/spec/vector/setable_example.rb +300 -0
  70. data/spec/vector/sortable_example.rb +242 -0
  71. data/spec/vector_spec.rb +111 -1805
  72. metadata +102 -3
  73. data/.github/ISSUE_TEMPLATE.md +0 -18
@@ -389,6 +389,14 @@ describe DaruLite::Index do
389
389
 
390
390
  end
391
391
 
392
+ describe '#delete_at' do
393
+ subject { idx.delete_at(1)}
394
+
395
+ let(:idx) { DaruLite::Index.new([:a, :b, 1, 2]) }
396
+
397
+ it { is_expected.to eq DaruLite::Index.new([:a, 1, 2]) }
398
+ end
399
+
392
400
  context '#to_df' do
393
401
  let(:idx) do
394
402
  DaruLite::Index.new(['speaker', 'mic', 'guitar', 'amp'],
@@ -0,0 +1,27 @@
1
+ shared_examples_for 'an aggregatable Vector' do
2
+ context "#group_by" do
3
+ let(:dv) { DaruLite::Vector.new [:a, :b, :a, :b, :c] }
4
+
5
+ context 'vector not specified' do
6
+ subject { dv.group_by }
7
+
8
+ it { is_expected.to be_a DaruLite::Core::GroupBy }
9
+ its(:'groups.size') { is_expected.to eq 3 }
10
+ its(:groups) { is_expected.to eq({[:a]=>[0, 2], [:b]=>[1, 3], [:c]=>[4]}) }
11
+ end
12
+
13
+ context 'vector name specified' do
14
+ before { dv.name = :hello }
15
+ subject { dv.group_by :hello }
16
+
17
+ it { is_expected.to be_a DaruLite::Core::GroupBy }
18
+ its(:'groups.size') { is_expected.to eq 3 }
19
+ its(:groups) { is_expected.to eq({[:a]=>[0, 2], [:b]=>[1, 3], [:c]=>[4]}) }
20
+ end
21
+
22
+ context 'vector name invalid' do
23
+ before { dv.name = :hello }
24
+ it { expect { dv.group_by :abc }.to raise_error }
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,82 @@
1
+ shared_examples_for 'a calculatable Vector' do |dtype|
2
+ describe '#count_values' do
3
+ let(:vector) { DaruLite::Vector.new([1, 2, 3, 1, 2, nil, nil]) }
4
+
5
+ it { expect(vector.count_values 1, 2).to eq 4 }
6
+ it { expect(vector.count_values nil).to eq 2 }
7
+ it { expect(vector.count_values 3, Float::NAN).to eq 1 }
8
+ it { expect(vector.count_values 4).to eq 0 }
9
+ end
10
+
11
+ context "#summary" do
12
+ subject { vector.summary }
13
+
14
+ context 'all types' do
15
+ let(:vector) { DaruLite::Vector.new([1 ,2, 3, 4, 5], name: 'vector') }
16
+
17
+ it { is_expected.to include vector.name }
18
+
19
+ it { is_expected.to include "n :#{vector.size}" }
20
+
21
+ it { is_expected.to include "non-missing:#{vector.size - vector.count_values(*DaruLite::MISSING_VALUES)}" }
22
+ end
23
+
24
+
25
+ context "numeric type" do
26
+ let(:vector) { DaruLite::Vector.new([1,2,5], name: 'numeric') }
27
+
28
+ it { is_expected. to eq %Q{
29
+ |= numeric
30
+ | n :3
31
+ | non-missing:3
32
+ | median: 2
33
+ | mean: 2.6667
34
+ | std.dev.: 2.0817
35
+ | std.err.: 1.2019
36
+ | skew: 0.2874
37
+ | kurtosis: -2.3333
38
+ }.unindent }
39
+ end
40
+
41
+ context "numeric type with missing values" do
42
+ let(:vector) { DaruLite::Vector.new([1,2,5,nil,Float::NAN], name: 'numeric') }
43
+
44
+ it { is_expected.not_to include 'skew' }
45
+ it { is_expected.not_to include 'kurtosis' }
46
+ end
47
+
48
+ if dtype == :array
49
+ context "object type" do
50
+ let(:vector) { DaruLite::Vector.new([1, 1, 2, 2, "string", nil, Float::NAN], name: 'object') }
51
+
52
+ if RUBY_VERSION >= '2.2'
53
+ it { is_expected.to eq %Q{
54
+ |= object
55
+ | n :7
56
+ | non-missing:5
57
+ | factors: 1,2,string
58
+ | mode: 1,2
59
+ | Distribution
60
+ | string 1 50.00%
61
+ | NaN 1 50.00%
62
+ | 1 2 100.00%
63
+ | 2 2 100.00%
64
+ }.unindent }
65
+ else
66
+ it { is_expected.to eq %Q{
67
+ |= object
68
+ | n :7
69
+ | non-missing:5
70
+ | factors: 1,2,string
71
+ | mode: 1,2
72
+ | Distribution
73
+ | NaN 1 50.00%
74
+ | string 1 50.00%
75
+ | 2 2 100.00%
76
+ | 1 2 100.00%
77
+ }.unindent }
78
+ end
79
+ end
80
+ end
81
+ end
82
+ end
@@ -0,0 +1,126 @@
1
+ shared_examples_for 'a convertible Vector' do |dtype|
2
+ describe "#to_df" do
3
+ subject { vector.to_df }
4
+
5
+ let(:vector) do
6
+ DaruLite::Vector.new(['a','b','c'], name: :my_dv, index: ['alpha', 'beta', 'gamma'])
7
+ end
8
+
9
+ it 'is a dataframe' do
10
+ expect(subject).to be_a DaruLite::DataFrame
11
+ end
12
+
13
+ it 'converts the vector to a single-vector dataframe' do
14
+ expect(subject[:my_dv]).to eq vector
15
+ end
16
+
17
+ it 'has the same index as the original vector' do
18
+ expect(subject.index).to eq vector.index
19
+ end
20
+
21
+ it 'has the same name as the vector' do
22
+ expect(subject.name).to eq :my_dv
23
+ end
24
+ end
25
+
26
+ describe "#to_h" do
27
+ context DaruLite::Index do
28
+ subject { vector.to_h }
29
+
30
+ let(:vector) do
31
+ DaruLite::Vector.new(
32
+ [1,2,3,4,5],
33
+ name: :a,
34
+ index: [:one, :two, :three, :four, :five],
35
+ dtype:
36
+ )
37
+ end
38
+
39
+ it "returns the vector as a hash" do
40
+ expect(subject).to eq({one: 1, two: 2, three: 3, four: 4, five: 5})
41
+ end
42
+ end
43
+
44
+ context DaruLite::MultiIndex do
45
+ pending
46
+ # it "returns vector as a Hash" do
47
+ # pending
48
+ # mi = DaruLite::MultiIndex.from_tuples([
49
+ # [:a,:two,:bar],
50
+ # [:a,:two,:baz],
51
+ # [:b,:one,:bar],
52
+ # [:b,:two,:bar]
53
+ # ])
54
+ # vector = DaruLite::Vector.new([1,2,3,4], index: mi, dtype: dtype)
55
+ # expect(vector.to_h).to eq({
56
+ # [:a,:two,:bar] => 1,
57
+ # [:a,:two,:baz] => 2,
58
+ # [:b,:one,:bar] => 3,
59
+ # [:b,:two,:bar] => 4
60
+ # })
61
+ # end
62
+ end
63
+ end
64
+
65
+ describe "#to_json" do
66
+ subject { vector.to_json }
67
+
68
+ let(:vector) do
69
+ DaruLite::Vector.new(
70
+ [1,2,3,4,5],
71
+ name: :a,
72
+ index: [:one, :two, :three, :four, :five],
73
+ dtype: dtype
74
+ )
75
+ end
76
+
77
+ it "returns the vector as json" do
78
+ expect(subject).to eq(vector.to_h.to_json)
79
+ end
80
+
81
+ end
82
+
83
+ describe "#to_s" do
84
+ let(:vector) { DaruLite::Vector.new(["a", "b"], index: [1, 2], name:) }
85
+
86
+ context 'name is nil' do
87
+ let(:name) { nil }
88
+
89
+ it 'produces a class, size description' do
90
+ expect(vector.to_s).to eq("#<DaruLite::Vector(2)>")
91
+ end
92
+ end
93
+
94
+ context 'name is present' do
95
+ let(:name) { "Test" }
96
+
97
+ it 'produces a class, name, size description' do
98
+ expect(vector.to_s).to eq("#<DaruLite::Vector: Test(2)>")
99
+ end
100
+ end
101
+
102
+ context 'name is a symbol' do
103
+ let(:name) { :Test }
104
+
105
+ it 'produces a class, name, size description' do
106
+ expect(vector.to_s).to eq("#<DaruLite::Vector: Test(2)>")
107
+ end
108
+ end
109
+ end
110
+
111
+ describe "#to_matrix" do
112
+ let(:vector) { DaruLite::Vector.new [1, 2, 3, 4, 5, 6] }
113
+
114
+ it "converts DaruLite::Vector to a horizontal Ruby Matrix" do
115
+ expect(vector.to_matrix).to eq(Matrix[[1, 2, 3, 4, 5, 6]])
116
+ end
117
+
118
+ it "converts DaruLite::Vector to a vertical Ruby Matrix" do
119
+ expect(vector.to_matrix(:vertical)).to eq(Matrix.columns([[1, 2, 3, 4, 5, 6]]))
120
+ end
121
+
122
+ it 'raises on wrong axis' do
123
+ expect { vector.to_matrix(:strange) }.to raise_error(ArgumentError)
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,48 @@
1
+ shared_examples_for 'a duplicatable Vector' do
2
+ describe "#dup" do
3
+ subject { vector.dup }
4
+
5
+ let(:vector) do
6
+ DaruLite::Vector.new([1, 2], name: :yoda, index: [:happy, :lightsaber])
7
+ end
8
+
9
+ it "copies the original data" do
10
+ expect(subject.send(:data)).to eq([1,2])
11
+ end
12
+
13
+ it "creates a new data object" do
14
+ expect(subject.send(:data).object_id).not_to eq(vector.send(:data).object_id)
15
+ end
16
+
17
+ it "copies the name" do
18
+ expect(subject.name).to eq(:yoda)
19
+ end
20
+
21
+ it "copies the original index" do
22
+ expect(subject.index).to eq(DaruLite::Index.new([:happy, :lightsaber]))
23
+ end
24
+
25
+ it "creates a new index object" do
26
+ expect(subject.index.object_id).not_to eq(vector.index.object_id)
27
+ end
28
+ end
29
+
30
+ describe "#clone_structure" do
31
+ subject { vector.clone_structure }
32
+ context DaruLite::Index do
33
+ let(:vector) do
34
+ DaruLite::Vector.new([1, 2, 3, 4, 5], index: [:a,:b,:c,:d,:e])
35
+ end
36
+
37
+ it "clones a vector with its index and fills it with nils" do
38
+ expect(subject).to eq(
39
+ DaruLite::Vector.new([nil, nil, nil, nil, nil], index: [:a,:b,:c,:d,:e])
40
+ )
41
+ end
42
+ end
43
+
44
+ context DaruLite::MultiIndex do
45
+ pending
46
+ end
47
+ end
48
+ end