red_amber 0.1.5 → 0.1.6
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 +24 -5
- data/CHANGELOG.md +98 -13
- data/Gemfile +1 -0
- data/README.md +55 -6
- data/doc/DataFrame.md +23 -9
- data/doc/Vector.md +156 -24
- data/lib/red-amber.rb +27 -0
- data/lib/red_amber/data_frame.rb +39 -7
- data/lib/red_amber/data_frame_displayable.rb +8 -8
- data/lib/red_amber/data_frame_observation_operation.rb +0 -72
- data/lib/red_amber/data_frame_selectable.rb +151 -32
- data/lib/red_amber/data_frame_variable_operation.rb +4 -0
- data/lib/red_amber/helper.rb +61 -0
- data/lib/red_amber/vector.rb +42 -12
- data/lib/red_amber/vector_functions.rb +25 -18
- data/lib/red_amber/vector_selectable.rb +124 -0
- data/lib/red_amber/{vector_compensable.rb → vector_updatable.rb} +52 -16
- data/lib/red_amber/version.rb +1 -1
- data/lib/red_amber.rb +1 -24
- metadata +6 -4
- data/lib/red_amber/data_frame_helper.rb +0 -64
@@ -6,7 +6,52 @@
|
|
6
6
|
module RedAmber
|
7
7
|
# mix-ins for class Vector
|
8
8
|
# Functions to make up some data (especially missing) for new data.
|
9
|
-
module
|
9
|
+
module VectorUpdatable
|
10
|
+
# Replace data
|
11
|
+
# @param arg [Array, Vector, Arrow::Array] index specifier
|
12
|
+
# @param replacer [Array, Vector, Arrow::Array] new data to replace for.
|
13
|
+
# @return [Vector] Replaced new Vector
|
14
|
+
def replace(args, replacer)
|
15
|
+
args = args.is_a?(Array) ? args : Array(args)
|
16
|
+
replacer = Array(replacer)
|
17
|
+
return self if args.empty? || args[0].nil?
|
18
|
+
|
19
|
+
replacer = nil if replacer.empty?
|
20
|
+
vector = parse_to_vector(args)
|
21
|
+
booleans =
|
22
|
+
if vector.boolean?
|
23
|
+
vector
|
24
|
+
elsif vector.numeric?
|
25
|
+
Vector.new(indices).is_in(vector)
|
26
|
+
else
|
27
|
+
raise VectorArgumentError, "Invalid data type #{args}"
|
28
|
+
end
|
29
|
+
replace_with(booleans, replacer)
|
30
|
+
end
|
31
|
+
|
32
|
+
# (related functions)
|
33
|
+
# fill_null_backward, fill_null_forward
|
34
|
+
|
35
|
+
# [Ternary element-wise]: boolean_vector.func(if_true, else) => vector
|
36
|
+
def if_else(true_choice, false_choice)
|
37
|
+
true_choice = true_choice.data if true_choice.is_a? Vector
|
38
|
+
false_choice = false_choice.data if false_choice.is_a? Vector
|
39
|
+
raise VectorTypeError, 'Reciever must be a boolean' unless boolean?
|
40
|
+
|
41
|
+
datum = find(:if_else).execute([data, true_choice, false_choice])
|
42
|
+
Vector.new(datum.value)
|
43
|
+
end
|
44
|
+
|
45
|
+
# same behavior as Ruby's invert
|
46
|
+
# ![true, false, nil] #=> [false, true, true]
|
47
|
+
def primitive_invert
|
48
|
+
raise VectorTypeError, "Not a boolean Vector: #{self}" unless boolean?
|
49
|
+
|
50
|
+
is_nil.if_else(false, self).invert
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
10
55
|
# [Ternary]: replace_with(booleans, replacements) => vector
|
11
56
|
# Replace items selected with a boolean mask
|
12
57
|
#
|
@@ -18,7 +63,7 @@ module RedAmber
|
|
18
63
|
# or with null if the mask is null.
|
19
64
|
# Hence, for replacement arrays, len(replacements) == sum(mask == true).
|
20
65
|
|
21
|
-
def replace_with(booleans,
|
66
|
+
def replace_with(booleans, replacer = nil)
|
22
67
|
specifier =
|
23
68
|
if booleans.is_a?(Arrow::BooleanArray)
|
24
69
|
booleans
|
@@ -32,14 +77,14 @@ module RedAmber
|
|
32
77
|
raise VectorArgumentError, 'Booleans size unmatch' if specifier.length != size
|
33
78
|
raise VectorArgumentError, 'Booleans not have any `true`' unless specifier.any?
|
34
79
|
|
35
|
-
r = Array(
|
80
|
+
r = Array(replacer) # scalar to [scalar]
|
36
81
|
r = [nil] if r.empty?
|
37
82
|
|
38
83
|
replacer =
|
39
84
|
if r.size == 1
|
40
|
-
case
|
41
|
-
when Arrow::Array then
|
42
|
-
when Vector then
|
85
|
+
case replacer
|
86
|
+
when Arrow::Array then replacer
|
87
|
+
when Vector then replacer.data
|
43
88
|
else
|
44
89
|
Arrow::Array.new(r * specifier.to_a.count(true)) # broadcast
|
45
90
|
end
|
@@ -53,16 +98,7 @@ module RedAmber
|
|
53
98
|
values = replacer.class.new(data)
|
54
99
|
|
55
100
|
datum = find('replace_with_mask').execute([values, specifier, replacer])
|
56
|
-
|
57
|
-
end
|
58
|
-
|
59
|
-
# (related functions)
|
60
|
-
# fill_null_backward, fill_null_forward
|
61
|
-
|
62
|
-
private
|
63
|
-
|
64
|
-
def booleans?(enum)
|
65
|
-
enum.all? { |e| e.is_a?(TrueClass) || e.is_a?(FalseClass) || e.is_a?(NilClass) }
|
101
|
+
Vector.new(datum.value)
|
66
102
|
end
|
67
103
|
end
|
68
104
|
end
|
data/lib/red_amber/version.rb
CHANGED
data/lib/red_amber.rb
CHANGED
@@ -1,26 +1,3 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
4
|
-
require 'rover-df'
|
5
|
-
|
6
|
-
require_relative 'red_amber/data_frame_displayable'
|
7
|
-
require_relative 'red_amber/data_frame_helper'
|
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_compensable'
|
14
|
-
require_relative 'red_amber/vector_functions'
|
15
|
-
require_relative 'red_amber/vector'
|
16
|
-
require_relative 'red_amber/version'
|
17
|
-
|
18
|
-
module RedAmber
|
19
|
-
class Error < StandardError; end
|
20
|
-
|
21
|
-
class DataFrameArgumentError < ArgumentError; end
|
22
|
-
class DataFrameTypeError < TypeError; end
|
23
|
-
|
24
|
-
class VectorArgumentError < ArgumentError; end
|
25
|
-
class VectorTypeError < TypeError; end
|
26
|
-
end
|
3
|
+
require_relative 'red-amber'
|
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.
|
4
|
+
version: 0.1.6
|
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-
|
11
|
+
date: 2022-06-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: red-arrow
|
@@ -90,17 +90,19 @@ files:
|
|
90
90
|
- doc/image/vector/unary_element_wise.png
|
91
91
|
- doc/tdr.md
|
92
92
|
- doc/tdr_ja.md
|
93
|
+
- lib/red-amber.rb
|
93
94
|
- lib/red_amber.rb
|
94
95
|
- lib/red_amber/data_frame.rb
|
95
96
|
- lib/red_amber/data_frame_displayable.rb
|
96
|
-
- lib/red_amber/data_frame_helper.rb
|
97
97
|
- lib/red_amber/data_frame_indexable.rb
|
98
98
|
- lib/red_amber/data_frame_observation_operation.rb
|
99
99
|
- lib/red_amber/data_frame_selectable.rb
|
100
100
|
- lib/red_amber/data_frame_variable_operation.rb
|
101
|
+
- lib/red_amber/helper.rb
|
101
102
|
- lib/red_amber/vector.rb
|
102
|
-
- lib/red_amber/vector_compensable.rb
|
103
103
|
- lib/red_amber/vector_functions.rb
|
104
|
+
- lib/red_amber/vector_selectable.rb
|
105
|
+
- lib/red_amber/vector_updatable.rb
|
104
106
|
- lib/red_amber/version.rb
|
105
107
|
- red_amber.gemspec
|
106
108
|
- sig/red_amber.rbs
|
@@ -1,64 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module RedAmber
|
4
|
-
# mix-in for the class DataFrame
|
5
|
-
module DataFrameHelper
|
6
|
-
private
|
7
|
-
|
8
|
-
def expand_range(args)
|
9
|
-
ary = args.each_with_object([]) do |e, a|
|
10
|
-
e.is_a?(Range) ? a.concat(normalized_array(e)) : a.append(e)
|
11
|
-
end
|
12
|
-
ary.map do |e|
|
13
|
-
if e.is_a?(Integer) && e.negative?
|
14
|
-
e + size
|
15
|
-
else
|
16
|
-
e
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def normalized_array(range)
|
22
|
-
both_end = [range.begin, range.end]
|
23
|
-
both_end[1] -= 1 if range.exclude_end? && range.end.is_a?(Integer)
|
24
|
-
|
25
|
-
if both_end.any?(Integer) || both_end.all?(&:nil?)
|
26
|
-
if both_end.any? { |e| e&.>=(size) || e&.<(-size) }
|
27
|
-
raise DataFrameArgumentError, "Index out of range: #{range} for 0..#{size - 1}"
|
28
|
-
end
|
29
|
-
|
30
|
-
(0...size).to_a[range]
|
31
|
-
else
|
32
|
-
range.to_a
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def out_of_range?(indeces)
|
37
|
-
indeces.max >= size || indeces.min < -size
|
38
|
-
end
|
39
|
-
|
40
|
-
def integers?(enum)
|
41
|
-
enum.all?(Integer)
|
42
|
-
end
|
43
|
-
|
44
|
-
def sym_or_str?(enum)
|
45
|
-
enum.all? { |e| e.is_a?(Symbol) || e.is_a?(String) }
|
46
|
-
end
|
47
|
-
|
48
|
-
def booleans?(enum)
|
49
|
-
enum.all? { |e| e.is_a?(TrueClass) || e.is_a?(FalseClass) || e.is_a?(NilClass) }
|
50
|
-
end
|
51
|
-
|
52
|
-
def create_dataframe_from_vector(key, vector)
|
53
|
-
DataFrame.new(key => vector.data)
|
54
|
-
end
|
55
|
-
|
56
|
-
def select_obs_by_boolean(array)
|
57
|
-
DataFrame.new(@table.filter(array))
|
58
|
-
end
|
59
|
-
|
60
|
-
def keys_by_booleans(booleans)
|
61
|
-
keys.select.with_index { |_, i| booleans[i] }
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|