red_amber 0.1.6 → 0.1.7

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.
data/doc/Vector.md CHANGED
@@ -38,10 +38,11 @@ Class `RedAmber::Vector` represents a series of data in the DataFrame.
38
38
 
39
39
  ### `indices`, `indexes`, `indeces`
40
40
 
41
- Return indices in an Array
41
+ Return indices in an Array.
42
42
 
43
43
  ### `to_ary`
44
- Vector has `#to_ary`. It implicitly converts a Vector to an Array when required.
44
+
45
+ It implicitly converts a Vector to an Array when required.
45
46
 
46
47
  ```ruby
47
48
  [1, 2] + Vector.new([3, 4])
@@ -60,13 +61,9 @@ Class `RedAmber::Vector` represents a series of data in the DataFrame.
60
61
 
61
62
  ### `type_class`
62
63
 
63
- ### [ ] `each` (not impremented yet)
64
-
65
- ### [ ] `chunked?` (not impremented yet)
66
-
67
- ### [ ] `n_chunks` (not impremented yet)
64
+ ### `each`
68
65
 
69
- ### [ ] `each_chunk` (not impremented yet)
66
+ If block is not given, returns Enumerator.
70
67
 
71
68
  ### `n_nils`, `n_nans`
72
69
 
@@ -78,7 +75,7 @@ Class `RedAmber::Vector` represents a series of data in the DataFrame.
78
75
 
79
76
  ### `inspect(limit: 80)`
80
77
 
81
- - `limit` sets size limit to display long array.
78
+ - `limit` sets size limit to display a long array.
82
79
 
83
80
  ```ruby
84
81
  vector = RedAmber::Vector.new((1..50).to_a)
@@ -167,9 +164,9 @@ double = RedAmber::Vector.new([1, 0/0.0, -1/0.0, 1/0.0, nil, ""])
167
164
  [1.0, NaN, -Infinity, Infinity, nil, 0.0]
168
165
 
169
166
  double.count #=> 5
170
- double.count(opts: {mode: :only_valid}) #=> 5, default
171
- double.count(opts: {mode: :only_null}) #=> 1
172
- double.count(opts: {mode: :all}) #=> 6
167
+ double.count(mode: :only_valid) #=> 5, default
168
+ double.count(mode: :only_null) #=> 1
169
+ double.count(mode: :all) #=> 6
173
170
 
174
171
  boolean = RedAmber::Vector.new([true, true, nil])
175
172
  #=>
@@ -177,8 +174,8 @@ boolean = RedAmber::Vector.new([true, true, nil])
177
174
  [true, true, nil]
178
175
 
179
176
  boolean.all #=> true
180
- boolean.all(opts: {skip_nulls: true}) #=> true
181
- boolean.all(opts: {skip_nulls: false}) #=> false
177
+ boolean.all(skip_nulls: true) #=> true
178
+ boolean.all(skip_nulls: false) #=> false
182
179
  ```
183
180
 
184
181
  ### Unary element-wise: `vector.func => vector`
@@ -212,6 +209,37 @@ boolean.all(opts: {skip_nulls: false}) #=> false
212
209
  | ✓ `tan` | | ✓ | | | |
213
210
  | ✓ `trunc` | | ✓ | | | |
214
211
 
212
+ Examples of options for `#round`;
213
+
214
+ - `:n-digits` The number of digits to show.
215
+ - `round_mode` Specify rounding mode.
216
+
217
+ ```ruby
218
+ double = RedAmber::Vector.new([15.15, 2.5, 3.5, -4.5, -5.5])
219
+ # => [15.15, 2.5, 3.5, -4.5, -5.5]
220
+ double.round
221
+ # => [15.0, 2.0, 4.0, -4.0, -6.0]
222
+ double.round(mode: :half_to_even)
223
+ # => Default. Same as double.round
224
+ double.round(mode: :towards_infinity)
225
+ # => [16.0, 3.0, 4.0, -5.0, -6.0]
226
+ double.round(mode: :half_up)
227
+ # => [15.0, 3.0, 4.0, -4.0, -5.0]
228
+ double.round(mode: :half_towards_zero)
229
+ # => [15.0, 2.0, 3.0, -4.0, -5.0]
230
+ double.round(mode: :half_towards_infinity)
231
+ # => [15.0, 3.0, 4.0, -5.0, -6.0]
232
+ double.round(mode: :half_to_odd)
233
+ # => [15.0, 3.0, 3.0, -5.0, -5.0]
234
+
235
+ double.round(n_digits: 0)
236
+ # => Default. Same as double.round
237
+ double.round(n_digits: 1)
238
+ # => [15.2, 2.5, 3.5, -4.5, -5.5]
239
+ double.round(n_digits: -1)
240
+ # => [20.0, 0.0, 0.0, -0.0, -10.0]
241
+ ```
242
+
215
243
  ### Binary element-wise: `vector.func(vector) => vector`
216
244
 
217
245
  ![binary element-wise](doc/image/../../image/vector/binary_element_wise.png)
@@ -286,7 +314,32 @@ boolean.all(opts: {skip_nulls: false}) #=> false
286
314
  ### [ ] (index functions)
287
315
  ### [ ] (other functions)
288
316
 
289
- ## Coerce (not impremented)
317
+ ## Coerce
318
+
319
+ ```ruby
320
+ vector = RedAmber::Vector.new(1,2,3)
321
+ # =>
322
+ #<RedAmber::Vector(:uint8, size=3):0x00000000000decc4>
323
+ [1, 2, 3]
324
+
325
+ # Vector's `#*` method
326
+ vector * -1
327
+ # =>
328
+ #<RedAmber::Vector(:int16, size=3):0x00000000000e3698>
329
+ [-1, -2, -3]
330
+
331
+ # coerced calculation
332
+ -1 * vector
333
+ # =>
334
+ #<RedAmber::Vector(:int16, size=3):0x00000000000ea4ac>
335
+ [-1, -2, -3]
336
+
337
+ # `@-` operator
338
+ -vector
339
+ # =>
340
+ #<RedAmber::Vector(:uint8, size=3):0x00000000000ee7b4>
341
+ [255, 254, 253]
342
+ ```
290
343
 
291
344
  ## Update vector's value
292
345
  ### `replace(specifier, replacer)` => vector
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
data/lib/red-amber.rb CHANGED
@@ -1,27 +1,3 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'arrow'
4
- require 'rover-df'
5
-
6
- require_relative 'red_amber/helper'
7
- require_relative 'red_amber/data_frame_displayable'
8
- require_relative 'red_amber/data_frame_indexable'
9
- require_relative 'red_amber/data_frame_selectable'
10
- require_relative 'red_amber/data_frame_observation_operation'
11
- require_relative 'red_amber/data_frame_variable_operation'
12
- require_relative 'red_amber/data_frame'
13
- require_relative 'red_amber/vector_functions'
14
- require_relative 'red_amber/vector_updatable'
15
- require_relative 'red_amber/vector_selectable'
16
- require_relative 'red_amber/vector'
17
- require_relative 'red_amber/version'
18
-
19
- module RedAmber
20
- class Error < StandardError; end
21
-
22
- class DataFrameArgumentError < ArgumentError; end
23
- class DataFrameTypeError < TypeError; end
24
-
25
- class VectorArgumentError < ArgumentError; end
26
- class VectorTypeError < TypeError; end
27
- end
3
+ require_relative 'red_amber'
@@ -8,7 +8,6 @@ module RedAmber
8
8
  include DataFrameDisplayable
9
9
  include DataFrameIndexable
10
10
  include DataFrameSelectable
11
- include DataFrameObservationOperation
12
11
  include DataFrameVariableOperation
13
12
  include Helper
14
13
 
@@ -130,6 +129,7 @@ module RedAmber
130
129
  end
131
130
 
132
131
  def to_rover
132
+ require 'rover'
133
133
  Rover::DataFrame.new(to_h)
134
134
  end
135
135
 
@@ -137,15 +137,17 @@ module RedAmber
137
137
  require 'iruby'
138
138
  return ['text/plain', '(empty DataFrame)'] if empty?
139
139
 
140
- if ENV.fetch('RED_AMBER_OUTPUT_MODE', 'tdr') == 'table'
141
- ['text/html', html_table]
142
- elsif size <= 5
143
- ['text/plain', tdr_str(tally: 0)]
140
+ if ENV.fetch('RED_AMBER_OUTPUT_MODE', 'Table') == 'TDR'
141
+ size <= 5 ? ['text/plain', tdr_str(tally: 0)] : ['text/plain', tdr_str]
144
142
  else
145
- ['text/plain', tdr_str]
143
+ ['text/html', html_table]
146
144
  end
147
145
  end
148
146
 
147
+ def group(*group_keys)
148
+ Group.new(self, group_keys)
149
+ end
150
+
149
151
  private
150
152
 
151
153
  # initialize @variable, @keys, @vectors and return one of them
@@ -178,7 +180,7 @@ module RedAmber
178
180
  end
179
181
 
180
182
  html = IRuby::HTML.table(converted.to_h, maxrows: 8, maxcols: 15)
181
- "#{size} x #{n_keys} vector#{pl(n_keys)} ; #{html}"
183
+ "#{self.class} <#{size} x #{n_keys} vector#{pl(n_keys)}> #{html}"
182
184
  end
183
185
  end
184
186
  end
@@ -6,7 +6,9 @@ module RedAmber
6
6
  # mix-ins for the class DataFrame
7
7
  module DataFrameDisplayable
8
8
  def to_s
9
- @table.to_s
9
+ return '' if empty?
10
+
11
+ format_table(width: 80)
10
12
  end
11
13
 
12
14
  # def describe() end
@@ -14,10 +16,10 @@ module RedAmber
14
16
  # def summary() end
15
17
 
16
18
  def inspect
17
- if ENV.fetch('RED_AMBER_OUTPUT_MODE', 'tdr') == 'table'
18
- "#<#{shape_str(with_id: true)}>\n#{self}"
19
- else
19
+ if ENV.fetch('RED_AMBER_OUTPUT_MODE', 'Table') == 'TDR'
20
20
  "#<#{shape_str(with_id: true)}>\n#{dataframe_info(3)}"
21
+ else
22
+ "#<#{shape_str(with_id: true)}>\n#{self}"
21
23
  end
22
24
  end
23
25
 
@@ -128,5 +130,78 @@ module RedAmber
128
130
  a << "#{n_nil} nil#{pl(n_nil)}" unless n_nil.zero?
129
131
  a
130
132
  end
133
+
134
+ def format_table(width: 80)
135
+ head = 5
136
+ tail = 3
137
+ n_digit = 1
138
+
139
+ original = self
140
+ indices = size > head + tail ? [*0...head, *(size - tail)...size] : [*0...size]
141
+ df = slice(indices).assign do
142
+ assigner = { '': indices.map { |i| (i + 1).to_s } }
143
+ vectors.each_with_object(assigner) do |v, a|
144
+ a[v.key] = v.to_a.map do |e|
145
+ if e.nil?
146
+ '(nil)'
147
+ elsif v.float?
148
+ e.round(n_digit).to_s
149
+ elsif v.string?
150
+ e
151
+ else
152
+ e.to_s
153
+ end
154
+ end
155
+ end
156
+ end
157
+
158
+ df = df.pick { [keys[-1], keys[0..-2]] }
159
+ df = size > head + tail ? df[0, 0, 0...head, 0, -tail..-1] : df[0, 0, 0..-1]
160
+ df = df.assign do
161
+ vectors.each_with_object({}) do |v, assigner|
162
+ vec = v.replace(0, v.key.to_s)
163
+ .replace(1, v.key == :'' ? '' : "<#{original[v.key].type}>")
164
+ assigner[v.key] = size > head + tail ? vec.replace(head + 2, ':') : vec
165
+ end
166
+ end
167
+
168
+ width_list = df.vectors.map { |v| v.to_a.map(&:length).max }
169
+ total_length = width_list[-1] # reserved for last column
170
+
171
+ formats = []
172
+ row_ellipsis = nil
173
+ df.vectors.each_with_index do |v, i|
174
+ w = width_list[i]
175
+ if total_length + w > width && i < df.n_keys - 1
176
+ row_ellipsis = i
177
+ formats << '%3s'
178
+ formats << format_for_column(df.vectors[-1], original, width_list[-1])
179
+ break
180
+ end
181
+ formats << format_for_column(v, original, w)
182
+ total_length += w
183
+ end
184
+ format_str = formats.join(' ')
185
+
186
+ str = StringIO.new
187
+ if row_ellipsis
188
+ df = df[df.keys[0..row_ellipsis], df.keys[-1]]
189
+ df = df.assign(df.keys[row_ellipsis] => ['...'] * df.size)
190
+ end
191
+
192
+ df.to_a.each do |row|
193
+ str.puts format(format_str, *row).rstrip
194
+ end
195
+
196
+ str.string
197
+ end
198
+
199
+ def format_for_column(vector, original, width)
200
+ if vector.key != :'' && !original[vector.key].numeric?
201
+ "%-#{width}s"
202
+ else
203
+ "%#{width}s"
204
+ end
205
+ end
131
206
  end
132
207
  end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RedAmber
4
+ # group class
5
+ class Group
6
+ def initialize(dataframe, *group_keys)
7
+ @dataframe = dataframe
8
+ @table = @dataframe.table
9
+ @group_keys = group_keys.flatten
10
+
11
+ raise GroupArgumentError, 'group_keys is empty.' if @group_keys.empty?
12
+
13
+ d = @group_keys - @dataframe.keys
14
+ raise GroupArgumentError, "#{d} is not a key of\n #{@dataframe}." unless d.empty?
15
+
16
+ @group = @table.group(*@group_keys)
17
+ end
18
+
19
+ def count(*summary_keys)
20
+ by(:count, summary_keys)
21
+ end
22
+
23
+ def sum(*summary_keys)
24
+ by(:sum, summary_keys)
25
+ end
26
+
27
+ def product(*summary_keys)
28
+ by(:product, summary_keys)
29
+ end
30
+
31
+ def mean(*summary_keys)
32
+ by(:mean, summary_keys)
33
+ end
34
+
35
+ def min(*summary_keys)
36
+ by(:min, summary_keys)
37
+ end
38
+
39
+ def max(*summary_keys)
40
+ by(:max, summary_keys)
41
+ end
42
+
43
+ def stddev(*summary_keys)
44
+ by(:stddev, summary_keys)
45
+ end
46
+
47
+ def variance(*summary_keys)
48
+ by(:variance, summary_keys)
49
+ end
50
+
51
+ private
52
+
53
+ def by(func, summary_keys)
54
+ summary_keys = Array(summary_keys).flatten
55
+ d = summary_keys - @dataframe.keys
56
+ raise GroupArgumentError, "#{d} is not a key of\n #{@dataframe}." unless summary_keys.empty? || d.empty?
57
+
58
+ RedAmber::DataFrame.new(@group.send(func, *summary_keys))
59
+ end
60
+ end
61
+ end
@@ -91,15 +91,23 @@ module RedAmber
91
91
  end
92
92
 
93
93
  def boolean?
94
- type == :boolean
94
+ type_class == Arrow::BooleanDataType
95
95
  end
96
96
 
97
97
  def numeric?
98
98
  type_class < Arrow::NumericDataType
99
99
  end
100
100
 
101
+ def float?
102
+ type_class < Arrow::FloatingPointDataType
103
+ end
104
+
105
+ def integer?
106
+ type_class < Arrow::IntegerDataType
107
+ end
108
+
101
109
  def string?
102
- type == :string
110
+ type_class == Arrow::StringDataType
103
111
  end
104
112
 
105
113
  def temporal?
@@ -110,7 +118,13 @@ module RedAmber
110
118
  @data.value_data_type.class
111
119
  end
112
120
 
113
- # def each() end
121
+ def each
122
+ return enum_for(:each) unless block_given?
123
+
124
+ size.times do |i|
125
+ yield self[i]
126
+ end
127
+ end
114
128
 
115
129
  def chunked?
116
130
  @data.is_a? Arrow::ChunkedArray
@@ -14,8 +14,8 @@ module RedAmber
14
14
  unary_aggregations =
15
15
  %i[all any approximate_median count count_distinct max mean min min_max product stddev sum variance]
16
16
  unary_aggregations.each do |function|
17
- define_method(function) do |opts: nil|
18
- datum = exec_func_unary(function, options: opts)
17
+ define_method(function) do |**options|
18
+ datum = exec_func_unary(function, options)
19
19
  get_scalar(datum)
20
20
  end
21
21
  end
@@ -25,12 +25,12 @@ module RedAmber
25
25
  alias_method :any?, :any
26
26
 
27
27
  def unbiased_variance
28
- variance(opts: { ddof: 1 })
28
+ variance(ddof: 1)
29
29
  end
30
30
  alias_method :var, :unbiased_variance
31
31
 
32
32
  def sd
33
- stddev(opts: { ddof: 1 })
33
+ stddev(ddof: 1)
34
34
  end
35
35
  alias_method :std, :sd
36
36
 
@@ -47,8 +47,8 @@ module RedAmber
47
47
  %i[abs array_sort_indices atan bit_wise_not ceil cos fill_null_backward fill_null_forward floor is_finite
48
48
  is_inf is_nan is_null is_valid round round_to_multiple sign sin tan trunc unique]
49
49
  unary_element_wise.each do |function|
50
- define_method(function) do |opts: nil|
51
- datum = exec_func_unary(function, options: opts)
50
+ define_method(function) do |**options|
51
+ datum = exec_func_unary(function, options)
52
52
  Vector.new(datum.value)
53
53
  end
54
54
  end
@@ -72,13 +72,13 @@ module RedAmber
72
72
  negate: '-@',
73
73
  }
74
74
  unary_element_wise_op.each do |function, operator|
75
- define_method(function) do |opts: nil|
76
- datum = exec_func_unary(function, options: opts)
75
+ define_method(function) do |**options|
76
+ datum = exec_func_unary(function, options)
77
77
  Vector.new(datum.value)
78
78
  end
79
79
 
80
- define_method(operator) do |opts: nil|
81
- datum = exec_func_unary(function, options: opts)
80
+ define_method(operator) do |**options|
81
+ datum = exec_func_unary(function, options)
82
82
  Vector.new(datum.value)
83
83
  end
84
84
  end
@@ -95,8 +95,8 @@ module RedAmber
95
95
  binary_element_wise =
96
96
  %i[atan2 and_not and_not_kleene bit_wise_and bit_wise_or bit_wise_xor]
97
97
  binary_element_wise.each do |function|
98
- define_method(function) do |other, opts: nil|
99
- datum = exec_func_binary(function, other, options: opts)
98
+ define_method(function) do |other, **options|
99
+ datum = exec_func_binary(function, other, options)
100
100
  Vector.new(datum.value)
101
101
  end
102
102
  end
@@ -111,8 +111,8 @@ module RedAmber
111
111
  or_org: :or,
112
112
  }
113
113
  logical_binary_element_wise.each do |method, function|
114
- define_method(method) do |other, opts: nil|
115
- datum = exec_func_binary(function, other, options: opts)
114
+ define_method(method) do |other, **options|
115
+ datum = exec_func_binary(function, other, options)
116
116
  Vector.new(datum.value)
117
117
  end
118
118
  end
@@ -144,13 +144,13 @@ module RedAmber
144
144
  not_equal: '!=',
145
145
  }
146
146
  binary_element_wise_op.each do |function, operator|
147
- define_method(function) do |other, opts: nil|
148
- datum = exec_func_binary(function, other, options: opts)
147
+ define_method(function) do |other, **options|
148
+ datum = exec_func_binary(function, other, options)
149
149
  Vector.new(datum.value)
150
150
  end
151
151
 
152
- define_method(operator) do |other, opts: nil|
153
- datum = exec_func_binary(function, other, options: opts)
152
+ define_method(operator) do |other, **options|
153
+ datum = exec_func_binary(function, other, options)
154
154
  Vector.new(datum.value)
155
155
  end
156
156
  end
@@ -217,11 +217,13 @@ module RedAmber
217
217
 
218
218
  private # =======
219
219
 
220
- def exec_func_unary(function, options: nil)
220
+ def exec_func_unary(function, options)
221
+ options = nil if options.empty?
221
222
  find(function).execute([data], options)
222
223
  end
223
224
 
224
- def exec_func_binary(function, other, options: nil)
225
+ def exec_func_binary(function, other, options)
226
+ options = nil if options.empty?
225
227
  case other
226
228
  when Vector
227
229
  find(function).execute([data, other.data], options)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RedAmber
4
- VERSION = '0.1.6'
4
+ VERSION = '0.1.7'
5
5
  end
data/lib/red_amber.rb CHANGED
@@ -1,3 +1,29 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'red-amber'
3
+ require 'arrow'
4
+ require 'rover-df'
5
+
6
+ require_relative 'red_amber/helper'
7
+ require_relative 'red_amber/data_frame_displayable'
8
+ require_relative 'red_amber/data_frame_indexable'
9
+ require_relative 'red_amber/data_frame_selectable'
10
+ require_relative 'red_amber/data_frame_variable_operation'
11
+ require_relative 'red_amber/data_frame'
12
+ require_relative 'red_amber/group'
13
+ require_relative 'red_amber/vector_functions'
14
+ require_relative 'red_amber/vector_updatable'
15
+ require_relative 'red_amber/vector_selectable'
16
+ require_relative 'red_amber/vector'
17
+ require_relative 'red_amber/version'
18
+
19
+ module RedAmber
20
+ class Error < StandardError; end
21
+
22
+ class DataFrameArgumentError < ArgumentError; end
23
+ class DataFrameTypeError < TypeError; end
24
+
25
+ class VectorArgumentError < ArgumentError; end
26
+ class VectorTypeError < TypeError; end
27
+
28
+ class GroupArgumentError < ArgumentError; end
29
+ end
data/red_amber.gemspec CHANGED
@@ -31,8 +31,6 @@ Gem::Specification.new do |spec|
31
31
  spec.require_paths = ['lib']
32
32
 
33
33
  spec.add_dependency 'red-arrow', '>= 8.0.0'
34
- spec.add_dependency 'red-parquet', '>= 8.0.0'
35
- spec.add_dependency 'rover-df', '~> 0.3.0'
36
34
 
37
35
  # Development dependency has gone to the Gemfile (rubygems/bundler#7237)
38
36
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: red_amber
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.6
4
+ version: 0.1.7
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hirokazu SUZUKI (heronshoes)
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-06-26 00:00:00.000000000 Z
11
+ date: 2022-07-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: red-arrow
@@ -24,34 +24,6 @@ dependencies:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
26
  version: 8.0.0
27
- - !ruby/object:Gem::Dependency
28
- name: red-parquet
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
32
- - !ruby/object:Gem::Version
33
- version: 8.0.0
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: 8.0.0
41
- - !ruby/object:Gem::Dependency
42
- name: rover-df
43
- requirement: !ruby/object:Gem::Requirement
44
- requirements:
45
- - - "~>"
46
- - !ruby/object:Gem::Version
47
- version: 0.3.0
48
- type: :runtime
49
- prerelease: false
50
- version_requirements: !ruby/object:Gem::Requirement
51
- requirements:
52
- - - "~>"
53
- - !ruby/object:Gem::Version
54
- version: 0.3.0
55
27
  description: RedAmber is a simple dataframe library inspired by Rover-df and powered
56
28
  by Red Arrow.
57
29
  email:
@@ -69,6 +41,7 @@ files:
69
41
  - Rakefile
70
42
  - benchmark/csv_load_penguins.yml
71
43
  - benchmark/drop_nil.yml
44
+ - doc/47_examples_of_red_amber.ipynb
72
45
  - doc/CODE_OF_CONDUCT.md
73
46
  - doc/DataFrame.md
74
47
  - doc/Vector.md
@@ -95,9 +68,9 @@ files:
95
68
  - lib/red_amber/data_frame.rb
96
69
  - lib/red_amber/data_frame_displayable.rb
97
70
  - lib/red_amber/data_frame_indexable.rb
98
- - lib/red_amber/data_frame_observation_operation.rb
99
71
  - lib/red_amber/data_frame_selectable.rb
100
72
  - lib/red_amber/data_frame_variable_operation.rb
73
+ - lib/red_amber/group.rb
101
74
  - lib/red_amber/helper.rb
102
75
  - lib/red_amber/vector.rb
103
76
  - lib/red_amber/vector_functions.rb
@@ -1,11 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module RedAmber
4
- # mix-ins for the class DataFrame
5
- module DataFrameObservationOperation
6
- def group(aggregating_keys, func, target_keys)
7
- t = table.group(*aggregating_keys)
8
- RedAmber::DataFrame.new(t.send(func, *target_keys))
9
- end
10
- end
11
- end