red_amber 0.2.3 → 0.4.0
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 +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
|