red_amber 0.1.6 → 0.1.7

Sign up to get free protection for your applications and to get access to all the features.
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