charty 0.2.4 → 0.2.9
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/README.md +64 -15
- data/charty.gemspec +10 -3
- data/lib/charty.rb +5 -2
- data/lib/charty/backends/bokeh.rb +2 -2
- data/lib/charty/backends/google_charts.rb +1 -1
- data/lib/charty/backends/gruff.rb +1 -1
- data/lib/charty/backends/plotly.rb +434 -32
- data/lib/charty/backends/plotly_helpers/html_renderer.rb +203 -0
- data/lib/charty/backends/plotly_helpers/notebook_renderer.rb +87 -0
- data/lib/charty/backends/plotly_helpers/plotly_renderer.rb +121 -0
- data/lib/charty/backends/pyplot.rb +187 -48
- data/lib/charty/backends/rubyplot.rb +1 -1
- data/lib/charty/cache_dir.rb +27 -0
- data/lib/charty/dash_pattern_generator.rb +57 -0
- data/lib/charty/index.rb +1 -1
- data/lib/charty/iruby_helper.rb +18 -0
- data/lib/charty/plot_methods.rb +115 -3
- data/lib/charty/plotter.rb +2 -2
- data/lib/charty/plotters.rb +4 -0
- data/lib/charty/plotters/abstract_plotter.rb +106 -11
- data/lib/charty/plotters/bar_plotter.rb +1 -16
- data/lib/charty/plotters/box_plotter.rb +1 -16
- data/lib/charty/plotters/distribution_plotter.rb +150 -0
- data/lib/charty/plotters/histogram_plotter.rb +242 -0
- data/lib/charty/plotters/line_plotter.rb +300 -0
- data/lib/charty/plotters/relational_plotter.rb +213 -96
- data/lib/charty/plotters/scatter_plotter.rb +8 -43
- data/lib/charty/statistics.rb +11 -2
- data/lib/charty/table.rb +124 -14
- data/lib/charty/table_adapters/base_adapter.rb +97 -0
- data/lib/charty/table_adapters/daru_adapter.rb +2 -0
- data/lib/charty/table_adapters/datasets_adapter.rb +7 -0
- data/lib/charty/table_adapters/hash_adapter.rb +19 -3
- data/lib/charty/table_adapters/pandas_adapter.rb +82 -0
- data/lib/charty/util.rb +28 -0
- data/lib/charty/vector_adapters.rb +5 -1
- data/lib/charty/vector_adapters/array_adapter.rb +2 -10
- data/lib/charty/vector_adapters/daru_adapter.rb +3 -11
- data/lib/charty/vector_adapters/narray_adapter.rb +1 -6
- data/lib/charty/vector_adapters/numpy_adapter.rb +1 -1
- data/lib/charty/vector_adapters/pandas_adapter.rb +0 -1
- data/lib/charty/version.rb +1 -1
- metadata +104 -11
- data/lib/charty/missing_value_support.rb +0 -14
@@ -21,6 +21,10 @@ module Charty
|
|
21
21
|
|
22
22
|
attr_reader :data
|
23
23
|
|
24
|
+
def length
|
25
|
+
data.shape[0]
|
26
|
+
end
|
27
|
+
|
24
28
|
def columns
|
25
29
|
PandasIndex.new(data.columns)
|
26
30
|
end
|
@@ -29,8 +33,10 @@ module Charty
|
|
29
33
|
case new_columns
|
30
34
|
when PandasIndex
|
31
35
|
data.columns = new_columns.values
|
36
|
+
data.columns.name = new_columns.name
|
32
37
|
when Index
|
33
38
|
data.columns = new_columns.to_a
|
39
|
+
data.columns.name = new_columns.name
|
34
40
|
else
|
35
41
|
data.columns = new_columns
|
36
42
|
end
|
@@ -44,8 +50,10 @@ module Charty
|
|
44
50
|
case new_index
|
45
51
|
when PandasIndex
|
46
52
|
data.index = new_index.values
|
53
|
+
data.index.name = new_index.name
|
47
54
|
when Index
|
48
55
|
data.index = new_index.to_a
|
56
|
+
data.index.name = new_index.name
|
49
57
|
else
|
50
58
|
data.index = new_index
|
51
59
|
end
|
@@ -72,10 +80,84 @@ module Charty
|
|
72
80
|
end
|
73
81
|
end
|
74
82
|
|
83
|
+
def drop_na
|
84
|
+
Charty::Table.new(@data.dropna)
|
85
|
+
end
|
86
|
+
|
87
|
+
def sort_values(by, na_position: :last)
|
88
|
+
Charty::Table.new(@data.sort_values(by, na_position: na_position, kind: :mergesort))
|
89
|
+
end
|
90
|
+
|
75
91
|
private def check_type(type, data, name)
|
76
92
|
return data if data.is_a?(type)
|
77
93
|
raise TypeError, "#{name} must be a #{type}"
|
78
94
|
end
|
95
|
+
|
96
|
+
def group_by(_table, grouper, sort, drop_na)
|
97
|
+
GroupBy.new(@data.groupby(by: grouper, sort: sort, dropna: drop_na))
|
98
|
+
end
|
99
|
+
|
100
|
+
def reset_index
|
101
|
+
Charty::Table.new(data.reset_index)
|
102
|
+
end
|
103
|
+
|
104
|
+
class GroupBy < Charty::Table::GroupByBase
|
105
|
+
def initialize(groupby)
|
106
|
+
@groupby = groupby
|
107
|
+
end
|
108
|
+
|
109
|
+
def indices
|
110
|
+
@groupby.indices.map { |k, v|
|
111
|
+
[k, v.to_a]
|
112
|
+
}.to_h
|
113
|
+
end
|
114
|
+
|
115
|
+
def group_keys
|
116
|
+
each_group_key.to_a
|
117
|
+
end
|
118
|
+
|
119
|
+
def each_group_key
|
120
|
+
return enum_for(__method__) unless block_given?
|
121
|
+
|
122
|
+
if PyCall.respond_to?(:iterable)
|
123
|
+
PyCall.iterable(@groupby).each do |key, index|
|
124
|
+
if key.class == PyCall.builtins.tuple
|
125
|
+
key = key.to_a
|
126
|
+
end
|
127
|
+
yield key
|
128
|
+
end
|
129
|
+
else # TODO: Remove this clause after the new PyCall will be released
|
130
|
+
iter = @groupby.__iter__()
|
131
|
+
while true
|
132
|
+
begin
|
133
|
+
key, sub_data = iter.__next__
|
134
|
+
if key.class == PyCall.builtins.tuple
|
135
|
+
key = key.to_a
|
136
|
+
end
|
137
|
+
yield key
|
138
|
+
rescue PyCall::PyError => error
|
139
|
+
if error.type == PyCall.builtins.StopIteration
|
140
|
+
break
|
141
|
+
else
|
142
|
+
raise error
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
|
149
|
+
def apply(*args, &block)
|
150
|
+
res = @groupby.apply(->(data) {
|
151
|
+
res = block.call(Charty::Table.new(data), *args)
|
152
|
+
Pandas::Series.new(data: res)
|
153
|
+
})
|
154
|
+
Charty::Table.new(res)
|
155
|
+
end
|
156
|
+
|
157
|
+
def [](key)
|
158
|
+
Charty::Table.new(@groupby.get_group(key))
|
159
|
+
end
|
160
|
+
end
|
79
161
|
end
|
80
162
|
end
|
81
163
|
end
|
data/lib/charty/util.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
module Charty
|
2
|
+
module Util
|
3
|
+
if [].respond_to?(:filter_map)
|
4
|
+
module_function def filter_map(enum, &block)
|
5
|
+
enum.filter_map(&block)
|
6
|
+
end
|
7
|
+
else
|
8
|
+
module_function def filter_map(enum, &block)
|
9
|
+
enum.inject([]) do |acc, x|
|
10
|
+
y = block.call(x)
|
11
|
+
if y
|
12
|
+
acc.push(y)
|
13
|
+
else
|
14
|
+
acc
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
module_function def missing?(val)
|
21
|
+
val.nil? || nan?(val)
|
22
|
+
end
|
23
|
+
|
24
|
+
module_function def nan?(val)
|
25
|
+
val.respond_to?(:nan?) && val.nan?
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -22,7 +22,6 @@ module Charty
|
|
22
22
|
class BaseAdapter
|
23
23
|
extend Forwardable
|
24
24
|
include Enumerable
|
25
|
-
include MissingValueSupport
|
26
25
|
|
27
26
|
def self.adapter_name
|
28
27
|
name[/:?(\w+)Adapter\z/, 1]
|
@@ -61,6 +60,11 @@ module Charty
|
|
61
60
|
def_delegators :data, :[], :[]=
|
62
61
|
def_delegators :data, :each, :to_a, :empty?
|
63
62
|
|
63
|
+
# Take values at the given positional indices (without indexing)
|
64
|
+
def values_at(*indices)
|
65
|
+
indices.map {|i| data[i] }
|
66
|
+
end
|
67
|
+
|
64
68
|
def where_in_array(mask)
|
65
69
|
mask = check_mask_vector(mask)
|
66
70
|
masked_data = []
|
@@ -30,7 +30,6 @@ module Charty
|
|
30
30
|
include NameSupport
|
31
31
|
include IndexSupport
|
32
32
|
|
33
|
-
# TODO: Reconsider the return value type of values_at
|
34
33
|
def_delegators :data, :values_at
|
35
34
|
|
36
35
|
def where(mask)
|
@@ -80,14 +79,7 @@ module Charty
|
|
80
79
|
|
81
80
|
def drop_na
|
82
81
|
if numeric?
|
83
|
-
Charty::Vector.new(data.reject { |x|
|
84
|
-
case x
|
85
|
-
when Float
|
86
|
-
x.nan?
|
87
|
-
else
|
88
|
-
x.nil?
|
89
|
-
end
|
90
|
-
})
|
82
|
+
Charty::Vector.new(data.reject { |x| Util.missing?(x) })
|
91
83
|
else
|
92
84
|
Charty::Vector.new(data.compact)
|
93
85
|
end
|
@@ -100,7 +92,7 @@ module Charty
|
|
100
92
|
end
|
101
93
|
|
102
94
|
def notnull
|
103
|
-
Charty::Vector.new(data.map {|x| !
|
95
|
+
Charty::Vector.new(data.map {|x| ! Util.missing?(x) },
|
104
96
|
index: index,
|
105
97
|
name: name)
|
106
98
|
end
|
@@ -55,7 +55,7 @@ module Charty
|
|
55
55
|
def_delegators :data, :[]=, :to_a
|
56
56
|
|
57
57
|
def values_at(*indices)
|
58
|
-
indices.map {|i| data
|
58
|
+
indices.map {|i| data.at(i) }
|
59
59
|
end
|
60
60
|
|
61
61
|
def where(mask)
|
@@ -130,15 +130,7 @@ module Charty
|
|
130
130
|
end
|
131
131
|
|
132
132
|
def drop_na
|
133
|
-
values = data.reject
|
134
|
-
case
|
135
|
-
when x.nil?,
|
136
|
-
x.respond_to?(:nan?) && x.nan?
|
137
|
-
true
|
138
|
-
else
|
139
|
-
false
|
140
|
-
end
|
141
|
-
end
|
133
|
+
values = data.reject {|x| Util.missing?(x) }
|
142
134
|
Charty::Vector.new(Daru::Vector.new(values))
|
143
135
|
end
|
144
136
|
|
@@ -149,7 +141,7 @@ module Charty
|
|
149
141
|
end
|
150
142
|
|
151
143
|
def notnull
|
152
|
-
notnull_data = data.map {|x| !
|
144
|
+
notnull_data = data.map {|x| ! Util.missing?(x) }
|
153
145
|
Charty::Vector.new(notnull_data, index: data.index.to_a, name: name)
|
154
146
|
end
|
155
147
|
|
@@ -29,11 +29,6 @@ module Charty
|
|
29
29
|
include NameSupport
|
30
30
|
include IndexSupport
|
31
31
|
|
32
|
-
# TODO: Reconsider the return value type of values_at
|
33
|
-
def values_at(*indices)
|
34
|
-
data[indices].to_a
|
35
|
-
end
|
36
|
-
|
37
32
|
def where(mask)
|
38
33
|
mask = check_mask_vector(mask)
|
39
34
|
case mask.data
|
@@ -157,7 +152,7 @@ module Charty
|
|
157
152
|
i, n = 0, length
|
158
153
|
notnull_data = Numo::Bit.zeros(n)
|
159
154
|
while i < n
|
160
|
-
notnull_data[i] = !
|
155
|
+
notnull_data[i] = ! Util.missing?(data[i])
|
161
156
|
i += 1
|
162
157
|
end
|
163
158
|
when ->(x) { x.respond_to?(:isnan) }
|
data/lib/charty/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: charty
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- youchan
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: exe
|
12
12
|
cert_chain: []
|
13
|
-
date: 2021-
|
13
|
+
date: 2021-06-24 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: red-colors
|
@@ -18,28 +18,84 @@ dependencies:
|
|
18
18
|
requirements:
|
19
19
|
- - ">="
|
20
20
|
- !ruby/object:Gem::Version
|
21
|
-
version:
|
21
|
+
version: 0.3.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
25
|
requirements:
|
26
26
|
- - ">="
|
27
27
|
- !ruby/object:Gem::Version
|
28
|
-
version:
|
28
|
+
version: 0.3.0
|
29
|
+
- !ruby/object:Gem::Dependency
|
30
|
+
name: red-datasets
|
31
|
+
requirement: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - ">="
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: 0.1.2
|
36
|
+
type: :runtime
|
37
|
+
prerelease: false
|
38
|
+
version_requirements: !ruby/object:Gem::Requirement
|
39
|
+
requirements:
|
40
|
+
- - ">="
|
41
|
+
- !ruby/object:Gem::Version
|
42
|
+
version: 0.1.2
|
29
43
|
- !ruby/object:Gem::Dependency
|
30
44
|
name: red-palette
|
31
45
|
requirement: !ruby/object:Gem::Requirement
|
32
46
|
requirements:
|
33
47
|
- - ">="
|
34
48
|
- !ruby/object:Gem::Version
|
35
|
-
version: 0.
|
49
|
+
version: 0.5.0
|
50
|
+
type: :runtime
|
51
|
+
prerelease: false
|
52
|
+
version_requirements: !ruby/object:Gem::Requirement
|
53
|
+
requirements:
|
54
|
+
- - ">="
|
55
|
+
- !ruby/object:Gem::Version
|
56
|
+
version: 0.5.0
|
57
|
+
- !ruby/object:Gem::Dependency
|
58
|
+
name: matplotlib
|
59
|
+
requirement: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: 1.2.0
|
64
|
+
type: :runtime
|
65
|
+
prerelease: false
|
66
|
+
version_requirements: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: 1.2.0
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: pandas
|
73
|
+
requirement: !ruby/object:Gem::Requirement
|
74
|
+
requirements:
|
75
|
+
- - ">="
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: 0.3.5
|
78
|
+
type: :runtime
|
79
|
+
prerelease: false
|
80
|
+
version_requirements: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: 0.3.5
|
85
|
+
- !ruby/object:Gem::Dependency
|
86
|
+
name: playwright-ruby-client
|
87
|
+
requirement: !ruby/object:Gem::Requirement
|
88
|
+
requirements:
|
89
|
+
- - ">="
|
90
|
+
- !ruby/object:Gem::Version
|
91
|
+
version: '0'
|
36
92
|
type: :runtime
|
37
93
|
prerelease: false
|
38
94
|
version_requirements: !ruby/object:Gem::Requirement
|
39
95
|
requirements:
|
40
96
|
- - ">="
|
41
97
|
- !ruby/object:Gem::Version
|
42
|
-
version: 0
|
98
|
+
version: '0'
|
43
99
|
- !ruby/object:Gem::Dependency
|
44
100
|
name: bundler
|
45
101
|
requirement: !ruby/object:Gem::Requirement
|
@@ -83,21 +139,21 @@ dependencies:
|
|
83
139
|
- !ruby/object:Gem::Version
|
84
140
|
version: '0'
|
85
141
|
- !ruby/object:Gem::Dependency
|
86
|
-
name:
|
142
|
+
name: daru
|
87
143
|
requirement: !ruby/object:Gem::Requirement
|
88
144
|
requirements:
|
89
145
|
- - ">="
|
90
146
|
- !ruby/object:Gem::Version
|
91
|
-
version: 0
|
147
|
+
version: '0'
|
92
148
|
type: :development
|
93
149
|
prerelease: false
|
94
150
|
version_requirements: !ruby/object:Gem::Requirement
|
95
151
|
requirements:
|
96
152
|
- - ">="
|
97
153
|
- !ruby/object:Gem::Version
|
98
|
-
version: 0
|
154
|
+
version: '0'
|
99
155
|
- !ruby/object:Gem::Dependency
|
100
|
-
name:
|
156
|
+
name: matrix
|
101
157
|
requirement: !ruby/object:Gem::Requirement
|
102
158
|
requirements:
|
103
159
|
- - ">="
|
@@ -138,6 +194,34 @@ dependencies:
|
|
138
194
|
- - ">="
|
139
195
|
- !ruby/object:Gem::Version
|
140
196
|
version: '0'
|
197
|
+
- !ruby/object:Gem::Dependency
|
198
|
+
name: iruby
|
199
|
+
requirement: !ruby/object:Gem::Requirement
|
200
|
+
requirements:
|
201
|
+
- - ">="
|
202
|
+
- !ruby/object:Gem::Version
|
203
|
+
version: 0.7.0
|
204
|
+
type: :development
|
205
|
+
prerelease: false
|
206
|
+
version_requirements: !ruby/object:Gem::Requirement
|
207
|
+
requirements:
|
208
|
+
- - ">="
|
209
|
+
- !ruby/object:Gem::Version
|
210
|
+
version: 0.7.0
|
211
|
+
- !ruby/object:Gem::Dependency
|
212
|
+
name: csv
|
213
|
+
requirement: !ruby/object:Gem::Requirement
|
214
|
+
requirements:
|
215
|
+
- - ">="
|
216
|
+
- !ruby/object:Gem::Version
|
217
|
+
version: '0'
|
218
|
+
type: :development
|
219
|
+
prerelease: false
|
220
|
+
version_requirements: !ruby/object:Gem::Requirement
|
221
|
+
requirements:
|
222
|
+
- - ">="
|
223
|
+
- !ruby/object:Gem::Version
|
224
|
+
version: '0'
|
141
225
|
description: Visualizing your data in a simple way.
|
142
226
|
email:
|
143
227
|
- youchan01@gmail.com
|
@@ -217,13 +301,18 @@ files:
|
|
217
301
|
- lib/charty/backends/google_charts.rb
|
218
302
|
- lib/charty/backends/gruff.rb
|
219
303
|
- lib/charty/backends/plotly.rb
|
304
|
+
- lib/charty/backends/plotly_helpers/html_renderer.rb
|
305
|
+
- lib/charty/backends/plotly_helpers/notebook_renderer.rb
|
306
|
+
- lib/charty/backends/plotly_helpers/plotly_renderer.rb
|
220
307
|
- lib/charty/backends/pyplot.rb
|
221
308
|
- lib/charty/backends/rubyplot.rb
|
222
309
|
- lib/charty/backends/unicode_plot.rb
|
310
|
+
- lib/charty/cache_dir.rb
|
311
|
+
- lib/charty/dash_pattern_generator.rb
|
223
312
|
- lib/charty/index.rb
|
313
|
+
- lib/charty/iruby_helper.rb
|
224
314
|
- lib/charty/layout.rb
|
225
315
|
- lib/charty/linspace.rb
|
226
|
-
- lib/charty/missing_value_support.rb
|
227
316
|
- lib/charty/plot_methods.rb
|
228
317
|
- lib/charty/plotter.rb
|
229
318
|
- lib/charty/plotters.rb
|
@@ -232,7 +321,10 @@ files:
|
|
232
321
|
- lib/charty/plotters/box_plotter.rb
|
233
322
|
- lib/charty/plotters/categorical_plotter.rb
|
234
323
|
- lib/charty/plotters/count_plotter.rb
|
324
|
+
- lib/charty/plotters/distribution_plotter.rb
|
235
325
|
- lib/charty/plotters/estimation_support.rb
|
326
|
+
- lib/charty/plotters/histogram_plotter.rb
|
327
|
+
- lib/charty/plotters/line_plotter.rb
|
236
328
|
- lib/charty/plotters/random_support.rb
|
237
329
|
- lib/charty/plotters/relational_plotter.rb
|
238
330
|
- lib/charty/plotters/scatter_plotter.rb
|
@@ -248,6 +340,7 @@ files:
|
|
248
340
|
- lib/charty/table_adapters/narray_adapter.rb
|
249
341
|
- lib/charty/table_adapters/nmatrix_adapter.rb
|
250
342
|
- lib/charty/table_adapters/pandas_adapter.rb
|
343
|
+
- lib/charty/util.rb
|
251
344
|
- lib/charty/vector.rb
|
252
345
|
- lib/charty/vector_adapters.rb
|
253
346
|
- lib/charty/vector_adapters/array_adapter.rb
|