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.
- 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
|
![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
|
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
|