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.
- checksums.yaml +4 -4
- data/.rubocop.yml +3 -0
- data/CHANGELOG.md +44 -18
- data/Gemfile +4 -1
- data/README.md +51 -76
- data/Rakefile +1 -0
- data/benchmark/csv_load_penguins.yml +1 -1
- data/doc/47_examples_of_red_amber.ipynb +4872 -0
- data/doc/DataFrame.md +370 -210
- data/doc/Vector.md +68 -15
- data/doc/image/dataframe/assign.png +0 -0
- data/doc/image/dataframe/drop.png +0 -0
- data/doc/image/dataframe/pick.png +0 -0
- data/doc/image/dataframe/remove.png +0 -0
- data/doc/image/dataframe/rename.png +0 -0
- data/doc/image/dataframe/slice.png +0 -0
- data/doc/image/dataframe_model.png +0 -0
- data/doc/image/vector/binary_element_wise.png +0 -0
- data/doc/image/vector/unary_aggregation.png +0 -0
- data/doc/image/vector/unary_aggregation_w_option.png +0 -0
- data/doc/image/vector/unary_element_wise.png +0 -0
- data/lib/red-amber.rb +1 -25
- data/lib/red_amber/data_frame.rb +9 -7
- data/lib/red_amber/data_frame_displayable.rb +79 -4
- data/lib/red_amber/group.rb +61 -0
- data/lib/red_amber/vector.rb +17 -3
- data/lib/red_amber/vector_functions.rb +22 -20
- data/lib/red_amber/version.rb +1 -1
- data/lib/red_amber.rb +27 -1
- data/red_amber.gemspec +0 -2
- metadata +4 -31
- data/lib/red_amber/data_frame_observation_operation.rb +0 -11
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
|
-
|
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
|
-
###
|
64
|
-
|
65
|
-
### [ ] `chunked?` (not impremented yet)
|
66
|
-
|
67
|
-
### [ ] `n_chunks` (not impremented yet)
|
64
|
+
### `each`
|
68
65
|
|
69
|
-
|
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(
|
171
|
-
double.count(
|
172
|
-
double.count(
|
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(
|
181
|
-
boolean.all(
|
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
|

|
@@ -286,7 +314,32 @@ boolean.all(opts: {skip_nulls: false}) #=> false
|
|
286
314
|
### [ ] (index functions)
|
287
315
|
### [ ] (other functions)
|
288
316
|
|
289
|
-
## Coerce
|
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
|
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
|
-
|
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'
|
data/lib/red_amber/data_frame.rb
CHANGED
@@ -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', '
|
141
|
-
['text/
|
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/
|
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)}
|
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
|
-
|
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', '
|
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
|
data/lib/red_amber/vector.rb
CHANGED
@@ -91,15 +91,23 @@ module RedAmber
|
|
91
91
|
end
|
92
92
|
|
93
93
|
def boolean?
|
94
|
-
|
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
|
-
|
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
|
-
|
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 |
|
18
|
-
datum = exec_func_unary(function, options
|
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(
|
28
|
+
variance(ddof: 1)
|
29
29
|
end
|
30
30
|
alias_method :var, :unbiased_variance
|
31
31
|
|
32
32
|
def sd
|
33
|
-
stddev(
|
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 |
|
51
|
-
datum = exec_func_unary(function, options
|
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 |
|
76
|
-
datum = exec_func_unary(function, options
|
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 |
|
81
|
-
datum = exec_func_unary(function, options
|
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,
|
99
|
-
datum = exec_func_binary(function, other, options
|
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,
|
115
|
-
datum = exec_func_binary(function, other, options
|
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,
|
148
|
-
datum = exec_func_binary(function, other, options
|
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,
|
153
|
-
datum = exec_func_binary(function, other, options
|
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
|
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
|
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)
|
data/lib/red_amber/version.rb
CHANGED
data/lib/red_amber.rb
CHANGED
@@ -1,3 +1,29 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
|
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.
|
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-
|
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
|