red_amber 0.2.3 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +133 -51
- data/.yardopts +2 -0
- data/CHANGELOG.md +203 -1
- data/Gemfile +2 -1
- data/LICENSE +1 -1
- data/README.md +61 -45
- data/benchmark/basic.yml +11 -4
- data/benchmark/combine.yml +3 -4
- data/benchmark/dataframe.yml +62 -0
- data/benchmark/group.yml +7 -1
- data/benchmark/reshape.yml +6 -2
- data/benchmark/vector.yml +63 -0
- data/doc/DataFrame.md +35 -12
- data/doc/DataFrame_Comparison.md +65 -0
- data/doc/SubFrames.md +11 -0
- data/doc/Vector.md +295 -1
- data/doc/yard-templates/default/fulldoc/html/css/common.css +6 -0
- data/lib/red_amber/data_frame.rb +537 -68
- data/lib/red_amber/data_frame_combinable.rb +776 -123
- data/lib/red_amber/data_frame_displayable.rb +248 -18
- data/lib/red_amber/data_frame_indexable.rb +122 -19
- data/lib/red_amber/data_frame_loadsave.rb +81 -10
- data/lib/red_amber/data_frame_reshaping.rb +216 -21
- data/lib/red_amber/data_frame_selectable.rb +781 -120
- data/lib/red_amber/data_frame_variable_operation.rb +561 -85
- data/lib/red_amber/group.rb +195 -21
- data/lib/red_amber/helper.rb +114 -32
- data/lib/red_amber/refinements.rb +206 -0
- data/lib/red_amber/subframes.rb +1066 -0
- data/lib/red_amber/vector.rb +435 -58
- data/lib/red_amber/vector_aggregation.rb +312 -0
- data/lib/red_amber/vector_binary_element_wise.rb +387 -0
- data/lib/red_amber/vector_selectable.rb +321 -69
- data/lib/red_amber/vector_unary_element_wise.rb +436 -0
- data/lib/red_amber/vector_updatable.rb +397 -24
- data/lib/red_amber/version.rb +2 -1
- data/lib/red_amber.rb +15 -1
- data/red_amber.gemspec +4 -3
- metadata +19 -11
- data/doc/image/dataframe/reshaping_DataFrames.png +0 -0
- data/lib/red_amber/vector_functions.rb +0 -294
@@ -4,17 +4,117 @@
|
|
4
4
|
# reference: https://arrow.apache.org/docs/cpp/compute.html
|
5
5
|
|
6
6
|
module RedAmber
|
7
|
-
#
|
7
|
+
# Mix-in for class Vector
|
8
8
|
# Functions to make up some data (especially missing) for new data.
|
9
9
|
module VectorUpdatable
|
10
|
-
#
|
11
|
-
|
12
|
-
|
13
|
-
#
|
14
|
-
#
|
10
|
+
# Add properties to Arrow::Array and Arrow::ChunkedArray
|
11
|
+
using RefineArrayLike
|
12
|
+
|
13
|
+
# Replace data in self by position specifier and replacer.
|
14
|
+
#
|
15
|
+
# - Scalar value may be broadcasted.
|
16
|
+
# - Returned value type may be automatically up-casted by replacer.
|
17
|
+
#
|
18
|
+
# @overload replace(booleans, replacer_by_scalar)
|
19
|
+
# Replace the value where true in boolean specifier to scalar replacer.
|
20
|
+
#
|
21
|
+
# @param booleans [Array, Vector, Arrow::Array]
|
22
|
+
# boolean position specifier to specify the position to be replaced by true.
|
23
|
+
# @param replacer_by_scalar [Scalar]
|
24
|
+
# new data to replace for.
|
25
|
+
# @return [Vector]
|
26
|
+
# a new replaced Vector.
|
27
|
+
# If specifier has no true, returns self.
|
28
|
+
# @example Replace with boolean specifier and scalar replacer
|
29
|
+
# Vector.new([1, 2, 3]).replace([true, false, true], 0)
|
30
|
+
#
|
31
|
+
# # =>
|
32
|
+
# #<RedAmber::Vector(:uint8, size=3):0x000000000001ee10>
|
33
|
+
# [0, 2, 0]
|
34
|
+
#
|
35
|
+
# @example Type of result is up-casted by replacer.
|
36
|
+
# ector.new([1, 2, 3]).replace([true, false, true], -1.0)
|
37
|
+
#
|
38
|
+
# # =>
|
39
|
+
# #<RedAmber::Vector(:double, size=3):0x0000000000025d78>
|
40
|
+
# [-1.0, 2.0, -1.0]
|
41
|
+
#
|
42
|
+
# @example Position of nil in booleans is replaced with nil
|
43
|
+
# Vector.new([1, 2, 3]).replace([true, false, nil], -1)
|
44
|
+
#
|
45
|
+
# # =>
|
46
|
+
# #<RedAmber::Vector(:int8, size=3):0x00000000000304d0>
|
47
|
+
# [-1, 2, nil]
|
48
|
+
#
|
49
|
+
# @example Replace 'NA' to nil
|
50
|
+
# vector = Vector.new(['A', 'B', 'NA'])
|
51
|
+
# vector.replace(vector == 'NA', nil)
|
52
|
+
#
|
53
|
+
# # =>
|
54
|
+
# #<RedAmber::Vector(:string, size=3):0x000000000000f8ac>
|
55
|
+
# ["A", "B", nil]
|
56
|
+
#
|
57
|
+
# @overload replace(indices, replacer_by_scalar)
|
58
|
+
# Replace the value at the index specifier to scalar replacer.
|
59
|
+
#
|
60
|
+
# @param indices [Array, Vector, Arrow::Array]
|
61
|
+
# index specifier to specify the position to be replaced.
|
62
|
+
# @param replacer_by_scalar [Scalar]
|
63
|
+
# new data to replace for.
|
64
|
+
# @return [Vector]
|
65
|
+
# a new replaced Vector.
|
66
|
+
# If specifier is empty, returns self.
|
67
|
+
# @example Replace with index specifier and scalar replacer
|
68
|
+
# Vector.new([1, 2, 3]).replace([0, 2], 0)
|
69
|
+
#
|
70
|
+
# # =>
|
71
|
+
# #<RedAmber::Vector(:uint8, size=3):0x000000000000c15c>
|
72
|
+
# [0, 2, 0]
|
73
|
+
#
|
74
|
+
# @overload replace(booleans, replacer_array)
|
75
|
+
# Replace the value where true in boolean specifier to replacer array.
|
76
|
+
#
|
77
|
+
# @param booleans [Array, Vector, Arrow::Array]
|
78
|
+
# boolean position specifier to specify the position to be replaced by true.
|
79
|
+
# @param replacer_array [Vector, Array, Arrow::Array]
|
80
|
+
# new data to replace for.
|
81
|
+
# The number of true in booleans must be equal to the length of replacer array.
|
82
|
+
# @return [Vector]
|
83
|
+
# a new replaced Vector.
|
84
|
+
# If specifier has no true, returns self.
|
85
|
+
# @example Replace with boolean specifier and replacer array
|
86
|
+
# vector = Vector.new([1, 2, 3])
|
87
|
+
# booleans = [true, false, true]
|
88
|
+
# replacer = [4, 5]
|
89
|
+
# vector.replace(booleans, replacer)
|
90
|
+
#
|
91
|
+
# # =>
|
92
|
+
# #<RedAmber::Vector(:uint8, size=3):0x000000000001ee10>
|
93
|
+
# [4, 2, 5]
|
94
|
+
#
|
95
|
+
# @overload replace(indices, replacer_array)
|
96
|
+
# Replace the value at the index specifier to replacer array.
|
97
|
+
#
|
98
|
+
# @param indices [Array, Vector, Arrow::Array]
|
99
|
+
# index specifier to specify the position to be replaced.
|
100
|
+
# @param replacer_array [Vector, Array, Arrow::Array]
|
101
|
+
# new data to replace for.
|
102
|
+
# The length of index specifier must be equal to the length of replacer array.
|
103
|
+
# @return [Vector]
|
104
|
+
# a new replaced Vector.
|
105
|
+
# If specifier is empty, returns self.
|
106
|
+
# @example Replace with index specifier and replacer array
|
107
|
+
# vector = Vector.new([1, 2, 3])
|
108
|
+
# indices = [0, 2]
|
109
|
+
# replacer = [4, 5]
|
110
|
+
# vector.replace(indices, replacer)
|
111
|
+
#
|
112
|
+
# # =>
|
113
|
+
# #<RedAmber::Vector(:uint8, size=3):0x000000000001ee10>
|
114
|
+
# [4, 2, 5]
|
15
115
|
#
|
16
116
|
def replace(specifier, replacer)
|
17
|
-
vector =
|
117
|
+
vector = Vector.new(parse_args(Array(specifier), size))
|
18
118
|
return self if vector.empty? || empty?
|
19
119
|
|
20
120
|
booleans =
|
@@ -34,7 +134,7 @@ module RedAmber
|
|
34
134
|
in nil | [nil]
|
35
135
|
return replace_to_nil(booleans.data)
|
36
136
|
in Arrow::Array
|
37
|
-
|
137
|
+
replacer
|
38
138
|
in Vector
|
39
139
|
replacer.data
|
40
140
|
in Array
|
@@ -42,49 +142,319 @@ module RedAmber
|
|
42
142
|
else # Broadcast scalar to Array
|
43
143
|
Arrow::Array.new(Array(replacer) * booleans.to_a.count(true))
|
44
144
|
end
|
45
|
-
|
145
|
+
if booleans.sum != replacer_array.length
|
146
|
+
raise VectorArgumentError, 'Replacements size unmatch'
|
147
|
+
end
|
46
148
|
|
47
149
|
replace_with(booleans.data, replacer_array)
|
48
150
|
end
|
49
151
|
|
50
|
-
#
|
51
|
-
#
|
52
|
-
|
53
|
-
#
|
152
|
+
# Choose values based on self.
|
153
|
+
#
|
154
|
+
# [Ternary element-wise function] Returns a Vector.
|
155
|
+
# - Self must be a boolean Vector.
|
156
|
+
# - `true_choice`, `false_choice` must be of the same type scalar / array / Vector.
|
157
|
+
# - `nil` values in self will be promoted to the output.
|
158
|
+
#
|
159
|
+
# @overload if_else(true_choise, false_choise)
|
160
|
+
# replace with a scalar.
|
161
|
+
#
|
162
|
+
# @param true_choice [scalar]
|
163
|
+
# a value to be replaced with true.
|
164
|
+
# @param false_choice [scalar]
|
165
|
+
# a value to be replaced with false.
|
166
|
+
# @return [Vector]
|
167
|
+
# replaced result.
|
168
|
+
# @example Replace with scalar choices
|
169
|
+
# Vector.new(true, true, false, nil, false).if_else(1, 2)
|
170
|
+
#
|
171
|
+
# # =>
|
172
|
+
# #<RedAmber::Vector(:uint8, size=5):0x000000000000c198>
|
173
|
+
# [1, 1, 2, nil, 2]
|
174
|
+
#
|
175
|
+
# @overload if_else(true_choise, false_choise)
|
176
|
+
# replace with a scalar.
|
177
|
+
#
|
178
|
+
# @param true_choice [Vector, Array, Arrow::Array]
|
179
|
+
# values to be replaced with true.
|
180
|
+
# The size of true_choice must be same as self.
|
181
|
+
# @param false_choice [Vector, Array, Arrow::Array]
|
182
|
+
# values to be replaced with false.
|
183
|
+
# The size of false_choice must be same as self.
|
184
|
+
# @return [Vector]
|
185
|
+
# replaced result.
|
186
|
+
# @example Replace with Array choices
|
187
|
+
# boolean_vector = Vector.new(true, true, false, nil, false)
|
188
|
+
# true_choise = Vector.new([1.1, 2.2, 3.3, 4.4, 5.5])
|
189
|
+
# false_choise = -true_choise
|
190
|
+
# boolean_vector.if_else(true_choise, false_choise)
|
191
|
+
#
|
192
|
+
# # =>
|
193
|
+
# #<RedAmber::Vector(:double, size=5):0x000000000000cd28>
|
194
|
+
# [1.1, 2.2, -3.3, nil, -5.5]
|
195
|
+
#
|
196
|
+
# @example Normalize negative indices to positive ones
|
197
|
+
# indices = Vector.new([1, -1, 3, -4])
|
198
|
+
# array_size = 10
|
199
|
+
# normalized_indices = (indices < 0).if_else(indices + array_size, indices)
|
200
|
+
#
|
201
|
+
# # =>
|
202
|
+
# #<RedAmber::Vector(:int16, size=4):0x000000000000f85c>
|
203
|
+
# [1, 9, 3, 6]
|
204
|
+
#
|
54
205
|
def if_else(true_choice, false_choice)
|
55
206
|
true_choice = true_choice.data if true_choice.is_a? Vector
|
56
207
|
false_choice = false_choice.data if false_choice.is_a? Vector
|
57
208
|
raise VectorTypeError, 'Reciever must be a boolean' unless boolean?
|
58
209
|
|
59
210
|
datum = find(:if_else).execute([data, true_choice, false_choice])
|
60
|
-
Vector.
|
211
|
+
Vector.create(datum.value)
|
61
212
|
end
|
62
213
|
|
63
|
-
# same behavior as Ruby's invert
|
214
|
+
# Another #invert which is same behavior as Ruby's invert.
|
215
|
+
#
|
64
216
|
# ![true, false, nil] #=> [false, true, true]
|
217
|
+
# @return [Vector]
|
218
|
+
# follows Ruby's BasicObject#!'s behavior.
|
219
|
+
# @example
|
220
|
+
# vector = Vector.new([true, true, false, nil])
|
221
|
+
#
|
222
|
+
# # =>
|
223
|
+
# #<RedAmber::Vector(:boolean, size=4):0x000000000000fa8c>
|
224
|
+
# [true, true, false, nil]
|
225
|
+
#
|
226
|
+
# # nil is converted to nil by Vector#invert.
|
227
|
+
# vector.invert
|
228
|
+
# # or
|
229
|
+
# !vector
|
230
|
+
#
|
231
|
+
# #<RedAmber::Vector(:boolean, size=4):0x000000000000faa0>
|
232
|
+
# [false, false, true, nil]
|
233
|
+
#
|
234
|
+
# # On the other hand,
|
235
|
+
# # Vector#primitive_invert follows Ruby's BasicObject#!'s behavior.
|
236
|
+
# vector.primitive_invert
|
237
|
+
#
|
238
|
+
# # =>
|
239
|
+
# #<RedAmber::Vector(:boolean, size=4):0x000000000000fab4>
|
240
|
+
# [false, false, true, true]
|
241
|
+
#
|
65
242
|
def primitive_invert
|
66
243
|
raise VectorTypeError, "Not a boolean Vector: #{self}" unless boolean?
|
67
244
|
|
68
245
|
is_nil.if_else(false, self).invert
|
69
246
|
end
|
70
247
|
|
248
|
+
# Shift elements in self.
|
249
|
+
#
|
250
|
+
# @param amount [Integer]
|
251
|
+
# amount of shift. Positive value will shift right, negative will shift left.
|
252
|
+
# @param fill [Object]
|
253
|
+
# complementary element to fill the new seat.
|
254
|
+
# @return [Vector]
|
255
|
+
# shifted Vector.
|
256
|
+
#
|
71
257
|
def shift(amount = 1, fill: nil)
|
72
|
-
raise VectorArgumentError, 'Shift amount is too large' if amount.abs
|
258
|
+
raise VectorArgumentError, 'Shift amount is too large' if amount.abs >= size
|
73
259
|
|
74
260
|
if amount.positive?
|
75
|
-
|
261
|
+
filler = [fill] * amount
|
262
|
+
Vector.new(filler.concat(Array(self[0...-amount])))
|
76
263
|
elsif amount.negative?
|
77
|
-
|
264
|
+
filler = [fill] * -amount
|
265
|
+
Vector.new(Array(self[-amount...]).concat(filler))
|
78
266
|
else # amount == 0
|
79
267
|
self
|
80
268
|
end
|
81
269
|
end
|
82
270
|
|
271
|
+
# Split string Vector and returns Array of columns.
|
272
|
+
#
|
273
|
+
# @param sep [nil, String, Regexp]
|
274
|
+
# separator.
|
275
|
+
# If separator is nil (or no argeument given),
|
276
|
+
# the column will be splitted by Arrow's split function
|
277
|
+
# using any ASCII whitespace.
|
278
|
+
# Otherwise, sep will passed to String#split.
|
279
|
+
# @param limit [Integer]
|
280
|
+
# maximum number to limit separation. Passed to String#split.
|
281
|
+
# @return [Array<Vector>]
|
282
|
+
# an Array of Vectors.
|
283
|
+
# @note nil will separated as nil's at same row.
|
284
|
+
# ex) `nil => [nil, nil]`
|
285
|
+
#
|
286
|
+
def split_to_columns(sep = nil, limit = 0)
|
287
|
+
l = split(sep, limit)
|
288
|
+
l.list_separate
|
289
|
+
end
|
290
|
+
|
291
|
+
# Split string Vector and flatten into rows.
|
292
|
+
#
|
293
|
+
# @param sep [nil, String, Regexp]
|
294
|
+
# separater.
|
295
|
+
# If separator is nil (or no argeument given),
|
296
|
+
# the column will be splitted by Arrow's split function
|
297
|
+
# using any ASCII whitespace.
|
298
|
+
# Otherwise, sep will passed to String#split.
|
299
|
+
# @param limit [Integer]
|
300
|
+
# maximum number to limit separation. Passed to String#split.
|
301
|
+
# @return [Vector]
|
302
|
+
# a flatten Vector.
|
303
|
+
# @note nil will separated as nil's at same row.
|
304
|
+
# ex) `nil => [nil, nil]`
|
305
|
+
#
|
306
|
+
def split_to_rows(sep = nil, limit = 0)
|
307
|
+
l = split(sep, limit)
|
308
|
+
l.list_flatten
|
309
|
+
end
|
310
|
+
|
311
|
+
# Return element size Array for list Vector.
|
312
|
+
#
|
313
|
+
# @api private
|
314
|
+
#
|
315
|
+
def list_sizes
|
316
|
+
Vector.create find(:list_value_length).execute([data]).value
|
317
|
+
end
|
318
|
+
|
319
|
+
# Separate list Vector by columns.
|
320
|
+
#
|
321
|
+
# @api private
|
322
|
+
#
|
323
|
+
def list_separate
|
324
|
+
len = list_sizes.data
|
325
|
+
min, max = Arrow::Function.find(:min_max).execute([len]).value.value.map(&:value)
|
326
|
+
|
327
|
+
result = []
|
328
|
+
(0...min).each do |i|
|
329
|
+
result << Vector.create(find(:list_element).execute([data, i]).value)
|
330
|
+
end
|
331
|
+
return result if min == max
|
332
|
+
|
333
|
+
(min...max).each do |i|
|
334
|
+
result << Vector.new(data.map { |e| e&.[](i) })
|
335
|
+
end
|
336
|
+
result
|
337
|
+
end
|
338
|
+
|
339
|
+
# Flatten list Vector for rows.
|
340
|
+
#
|
341
|
+
# @api private
|
342
|
+
#
|
343
|
+
def list_flatten
|
344
|
+
Vector.create find(:list_flatten).execute([data]).value
|
345
|
+
end
|
346
|
+
|
347
|
+
# Split string Vector by each element with separator and returns list Array.
|
348
|
+
#
|
349
|
+
# @note if sep is not specified, use Arrow's ascii_split_whitespace.
|
350
|
+
# It will separate string by ascii whitespaces.
|
351
|
+
# @note if sep specified, sep and limit will passed to String#split.
|
352
|
+
#
|
353
|
+
def split(sep = nil, limit = 0)
|
354
|
+
if empty? || !string?
|
355
|
+
raise VectorTypeError, "self is not a valid string Vector: #{self}"
|
356
|
+
end
|
357
|
+
if self[0].nil? && uniq.to_a == [nil] # Avoid heavy check to be activated always.
|
358
|
+
raise VectorTypeError, 'self contains only nil'
|
359
|
+
end
|
360
|
+
|
361
|
+
list =
|
362
|
+
if sep
|
363
|
+
Arrow::Array.new(to_a.map { |e| e&.split(sep, limit) })
|
364
|
+
else
|
365
|
+
find(:ascii_split_whitespace).execute([data]).value
|
366
|
+
end
|
367
|
+
Vector.create(list)
|
368
|
+
end
|
369
|
+
|
370
|
+
# Merge String or other string Vector to self.
|
371
|
+
# Self must be a string Vector.
|
372
|
+
#
|
373
|
+
# @param other [String, Vector]
|
374
|
+
# merger from right. It will be broadcasted if it is a scalar String.
|
375
|
+
# @param sep [String]
|
376
|
+
# separator.
|
377
|
+
# @return [Vector]
|
378
|
+
# merged Vector
|
379
|
+
#
|
380
|
+
def merge(other, sep: ' ')
|
381
|
+
if empty? || !string?
|
382
|
+
raise VectorTypeError,
|
383
|
+
"self is not a string Vector: #{self}"
|
384
|
+
end
|
385
|
+
unless sep.is_a?(String)
|
386
|
+
raise VectorArgumentError, "separator is not a String: #{sep}"
|
387
|
+
end
|
388
|
+
|
389
|
+
other_array =
|
390
|
+
case other
|
391
|
+
in String => s
|
392
|
+
[s] * size
|
393
|
+
in (Vector | Arrow::Array | Arrow::ChunkedArray) => x if x.string?
|
394
|
+
x.to_a
|
395
|
+
else
|
396
|
+
raise VectorArgumentError,
|
397
|
+
"other is not a String or a string Vector: #{self}"
|
398
|
+
end
|
399
|
+
|
400
|
+
list = Arrow::Array.new(to_a.zip(other_array))
|
401
|
+
datum = find(:binary_join).execute([list, sep])
|
402
|
+
Vector.create(datum.value)
|
403
|
+
end
|
404
|
+
|
405
|
+
# Concatenate other array-like to self.
|
406
|
+
#
|
407
|
+
# @param other [Vector, Array, Arrow::Array, Arrow::ChunkedArray]
|
408
|
+
# other array-like to concatenate.
|
409
|
+
# @return [Vector]
|
410
|
+
# concatenated Vector.
|
411
|
+
# @example Concatenate to string
|
412
|
+
# string_vector
|
413
|
+
#
|
414
|
+
# # =>
|
415
|
+
# #<RedAmber::Vector(:string, size=2):0x00000000000037b4>
|
416
|
+
# ["A", "B"]
|
417
|
+
#
|
418
|
+
# string_vector.concatenate([1, 2])
|
419
|
+
#
|
420
|
+
# # =>
|
421
|
+
# #<RedAmber::Vector(:string, size=4):0x0000000000003818>
|
422
|
+
# ["A", "B", "1", "2"]
|
423
|
+
#
|
424
|
+
# @example Concatenate to integer
|
425
|
+
# integer_vector
|
426
|
+
#
|
427
|
+
# # =>
|
428
|
+
# #<RedAmber::Vector(:uint8, size=2):0x000000000000382c>
|
429
|
+
# [1, 2]
|
430
|
+
#
|
431
|
+
# integer_vector.concatenate(["A", "B"])
|
432
|
+
# # =>
|
433
|
+
# #<RedAmber::Vector(:uint8, size=4):0x0000000000003840>
|
434
|
+
# [1, 2, 65, 66]
|
435
|
+
#
|
436
|
+
# @since 0.4.0
|
437
|
+
#
|
438
|
+
def concatenate(other)
|
439
|
+
concatenated_array =
|
440
|
+
case other
|
441
|
+
when Vector
|
442
|
+
data + other.data
|
443
|
+
when Arrow::ChunkedArray
|
444
|
+
data + other.pack
|
445
|
+
else
|
446
|
+
data + other
|
447
|
+
end
|
448
|
+
Vector.create(concatenated_array)
|
449
|
+
end
|
450
|
+
alias_method :concat, :concatenate
|
451
|
+
|
83
452
|
private
|
84
453
|
|
85
454
|
# Replace elements selected with a boolean mask
|
86
455
|
#
|
87
|
-
# @param boolean_mask [Arrow::BooleanArray]
|
456
|
+
# @param boolean_mask [Arrow::BooleanArray]
|
457
|
+
# Boolean mask which indicates the position to be replaced.
|
88
458
|
# - Position with true will be replaced.
|
89
459
|
# - Position with nil will be nil.
|
90
460
|
#
|
@@ -94,7 +464,8 @@ module RedAmber
|
|
94
464
|
# - `replacer.size` must be equal to `mask.count(true)`.
|
95
465
|
# - Types of self and replacer must be same
|
96
466
|
#
|
97
|
-
# @return [Vector]
|
467
|
+
# @return [Vector]
|
468
|
+
# replaced vector.
|
98
469
|
# Type of returned Vector is upcasted if needed.
|
99
470
|
#
|
100
471
|
def replace_with(boolean_mask, replacer)
|
@@ -104,20 +475,22 @@ module RedAmber
|
|
104
475
|
values = replacer.class.new(data) # Upcast
|
105
476
|
|
106
477
|
datum = find(:replace_with_mask).execute([values, boolean_mask, replacer])
|
107
|
-
Vector.
|
478
|
+
Vector.create(datum.value)
|
108
479
|
end
|
109
480
|
|
110
481
|
# Replace elements selected with a boolean mask by nil
|
111
482
|
#
|
112
|
-
# @param boolean_mask [Arrow::BooleanArray]
|
483
|
+
# @param boolean_mask [Arrow::BooleanArray]
|
484
|
+
# Boolean mask which indicates the position to be replaced.
|
113
485
|
# - Position with true will be replaced by nil
|
114
486
|
# - Position with nil will remain as nil.
|
115
|
-
# @return [Vector]
|
487
|
+
# @return [Vector]
|
488
|
+
# replaced vector.
|
116
489
|
#
|
117
490
|
def replace_to_nil(boolean_mask)
|
118
491
|
nil_array = data.class.new([nil] * size) # Casted nil Array
|
119
492
|
datum = find(:if_else).execute([boolean_mask, nil_array, data])
|
120
|
-
Vector.
|
493
|
+
Vector.create(datum.value)
|
121
494
|
end
|
122
495
|
end
|
123
496
|
end
|
data/lib/red_amber/version.rb
CHANGED
data/lib/red_amber.rb
CHANGED
@@ -2,7 +2,9 @@
|
|
2
2
|
|
3
3
|
require 'arrow'
|
4
4
|
|
5
|
+
require_relative 'red_amber/refinements'
|
5
6
|
require_relative 'red_amber/helper'
|
7
|
+
|
6
8
|
require_relative 'red_amber/data_frame_combinable'
|
7
9
|
require_relative 'red_amber/data_frame_displayable'
|
8
10
|
require_relative 'red_amber/data_frame_indexable'
|
@@ -12,20 +14,32 @@ require_relative 'red_amber/data_frame_selectable'
|
|
12
14
|
require_relative 'red_amber/data_frame_variable_operation'
|
13
15
|
require_relative 'red_amber/data_frame'
|
14
16
|
require_relative 'red_amber/group'
|
15
|
-
require_relative 'red_amber/
|
17
|
+
require_relative 'red_amber/subframes'
|
18
|
+
require_relative 'red_amber/vector_aggregation'
|
19
|
+
require_relative 'red_amber/vector_binary_element_wise'
|
20
|
+
require_relative 'red_amber/vector_unary_element_wise'
|
16
21
|
require_relative 'red_amber/vector_updatable'
|
17
22
|
require_relative 'red_amber/vector_selectable'
|
18
23
|
require_relative 'red_amber/vector'
|
19
24
|
require_relative 'red_amber/version'
|
20
25
|
|
21
26
|
module RedAmber
|
27
|
+
# Generic error
|
22
28
|
class Error < StandardError; end
|
23
29
|
|
30
|
+
# Argument error in DataFrame
|
24
31
|
class DataFrameArgumentError < ArgumentError; end
|
32
|
+
# Data type error in DataFrame
|
25
33
|
class DataFrameTypeError < TypeError; end
|
26
34
|
|
35
|
+
# Argument error in Vector
|
27
36
|
class VectorArgumentError < ArgumentError; end
|
37
|
+
# Data type error in DataFrame
|
28
38
|
class VectorTypeError < TypeError; end
|
29
39
|
|
40
|
+
# Argument error in Group
|
30
41
|
class GroupArgumentError < ArgumentError; end
|
42
|
+
|
43
|
+
# Argument error in SubFrames
|
44
|
+
class SubFramesArgumentError < ArgumentError; end
|
31
45
|
end
|
data/red_amber.gemspec
CHANGED
@@ -9,10 +9,11 @@ Gem::Specification.new do |spec|
|
|
9
9
|
spec.email = ['heronshoes877@gmail.com']
|
10
10
|
|
11
11
|
spec.summary = 'Simple dataframe library for Ruby'
|
12
|
-
spec.description = 'RedAmber is a simple dataframe library
|
12
|
+
spec.description = 'RedAmber is a simple dataframe library ' \
|
13
|
+
'inspired by Rover-df and powered by Red Arrow.'
|
13
14
|
spec.homepage = 'https://github.com/heronshoes/red_amber'
|
14
15
|
spec.license = 'MIT'
|
15
|
-
spec.required_ruby_version = '>=
|
16
|
+
spec.required_ruby_version = '>= 3.0'
|
16
17
|
|
17
18
|
spec.metadata['homepage_uri'] = spec.homepage
|
18
19
|
spec.metadata['source_code_uri'] = 'https://github.com/heronshoes/red_amber'
|
@@ -30,7 +31,7 @@ Gem::Specification.new do |spec|
|
|
30
31
|
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
31
32
|
spec.require_paths = ['lib']
|
32
33
|
|
33
|
-
spec.add_dependency 'red-arrow', '~>
|
34
|
+
spec.add_dependency 'red-arrow', '~> 11.0.0'
|
34
35
|
|
35
36
|
# Development dependency has gone to the Gemfile (rubygems/bundler#7237)
|
36
37
|
|
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.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Hirokazu SUZUKI (heronshoes)
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-02-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: red-arrow
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 11.0.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 11.0.0
|
27
27
|
description: RedAmber is a simple dataframe library inspired by Rover-df and powered
|
28
28
|
by Red Arrow.
|
29
29
|
email:
|
@@ -42,6 +42,7 @@ files:
|
|
42
42
|
- Rakefile
|
43
43
|
- benchmark/basic.yml
|
44
44
|
- benchmark/combine.yml
|
45
|
+
- benchmark/dataframe.yml
|
45
46
|
- benchmark/drop_nil.yml
|
46
47
|
- benchmark/group.yml
|
47
48
|
- benchmark/reshape.yml
|
@@ -50,8 +51,11 @@ files:
|
|
50
51
|
- benchmark/rover/penguins.yml
|
51
52
|
- benchmark/rover/planes.yml
|
52
53
|
- benchmark/rover/weather.yml
|
54
|
+
- benchmark/vector.yml
|
53
55
|
- doc/CODE_OF_CONDUCT.md
|
54
56
|
- doc/DataFrame.md
|
57
|
+
- doc/DataFrame_Comparison.md
|
58
|
+
- doc/SubFrames.md
|
55
59
|
- doc/Vector.md
|
56
60
|
- doc/image/arrow_table_new.png
|
57
61
|
- doc/image/basic_verbs.png
|
@@ -64,7 +68,6 @@ files:
|
|
64
68
|
- doc/image/dataframe/remove.png
|
65
69
|
- doc/image/dataframe/rename.png
|
66
70
|
- doc/image/dataframe/rename_operation.png
|
67
|
-
- doc/image/dataframe/reshaping_DataFrames.png
|
68
71
|
- doc/image/dataframe/set_and_bind.png
|
69
72
|
- doc/image/dataframe/slice.png
|
70
73
|
- doc/image/dataframe/slice_operation.png
|
@@ -83,6 +86,7 @@ files:
|
|
83
86
|
- doc/image/vector/unary_element_wise.png
|
84
87
|
- doc/tdr.md
|
85
88
|
- doc/tdr_ja.md
|
89
|
+
- doc/yard-templates/default/fulldoc/html/css/common.css
|
86
90
|
- lib/red-amber.rb
|
87
91
|
- lib/red_amber.rb
|
88
92
|
- lib/red_amber/data_frame.rb
|
@@ -95,9 +99,13 @@ files:
|
|
95
99
|
- lib/red_amber/data_frame_variable_operation.rb
|
96
100
|
- lib/red_amber/group.rb
|
97
101
|
- lib/red_amber/helper.rb
|
102
|
+
- lib/red_amber/refinements.rb
|
103
|
+
- lib/red_amber/subframes.rb
|
98
104
|
- lib/red_amber/vector.rb
|
99
|
-
- lib/red_amber/
|
105
|
+
- lib/red_amber/vector_aggregation.rb
|
106
|
+
- lib/red_amber/vector_binary_element_wise.rb
|
100
107
|
- lib/red_amber/vector_selectable.rb
|
108
|
+
- lib/red_amber/vector_unary_element_wise.rb
|
101
109
|
- lib/red_amber/vector_updatable.rb
|
102
110
|
- lib/red_amber/version.rb
|
103
111
|
- red_amber.gemspec
|
@@ -110,7 +118,7 @@ metadata:
|
|
110
118
|
source_code_uri: https://github.com/heronshoes/red_amber
|
111
119
|
changelog_uri: https://github.com/heronshoes/red_amber/blob/main/CHANGELOG.md
|
112
120
|
rubygems_mfa_required: 'true'
|
113
|
-
post_install_message:
|
121
|
+
post_install_message:
|
114
122
|
rdoc_options: []
|
115
123
|
require_paths:
|
116
124
|
- lib
|
@@ -118,15 +126,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
118
126
|
requirements:
|
119
127
|
- - ">="
|
120
128
|
- !ruby/object:Gem::Version
|
121
|
-
version: '
|
129
|
+
version: '3.0'
|
122
130
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
123
131
|
requirements:
|
124
132
|
- - ">="
|
125
133
|
- !ruby/object:Gem::Version
|
126
134
|
version: '0'
|
127
135
|
requirements: []
|
128
|
-
rubygems_version: 3.
|
129
|
-
signing_key:
|
136
|
+
rubygems_version: 3.2.33
|
137
|
+
signing_key:
|
130
138
|
specification_version: 4
|
131
139
|
summary: Simple dataframe library for Ruby
|
132
140
|
test_files: []
|
Binary file
|