histogram 0.2.2.0 → 0.2.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 50a58993942b0878e8dbe58afc139a880d094a33
4
- data.tar.gz: 0ff8419d39eae42dddb713cecc00c8b4e76f73a1
3
+ metadata.gz: 87b16b66fb1ed20c22d818250d368d39fc3445fc
4
+ data.tar.gz: f6bf7bd712834fc3028a6e8c2ade8a20274ce004
5
5
  SHA512:
6
- metadata.gz: c4d286bb8e206c0121149ede1f464c5ad8807cbcd2076a3c73b1b2e5add968c55c9dd087168afedd45f0718584897c99e39c3b98d80196b3414a8ed9b5d51313
7
- data.tar.gz: a224cd19415ebb82a5222601fb0a44fb85edd7f1c0568bdddca13a0aa93417ee312628384ee7da110cfe1ef3bd50bd004e03a034d0e49994496d52e3761399ae
6
+ metadata.gz: d19f5747ea74d6a9b70d9b9c22a0d0321f2be8b82679fbd1cbd4226bc9fae828775ded31c7c033bd3153c3528d5b238c1a8ff37bd6e77dcf2759137700fb690a
7
+ data.tar.gz: 6dadf8f32857060dc8b70bf30493f21b9a63e8caaf99f612a4db42877bc6a00350775cd24d6e9c38b24042cb7b1c6c9bc6be6aeac43d3f040dabd0e13e751d5a
data/README.md CHANGED
@@ -65,7 +65,7 @@ Big thanks to those who have made contributions!
65
65
 
66
66
  * deal with zero std ([Greg Dean](https://github.com/gsdean))
67
67
  * support for 1.8.7 and jruby ([Kiera Radman](https://github.com/kierarad))
68
- * reorder nan checks (fix zero stdev arrays) [arjun810](https://github.com/arjun810)
68
+ * reorder nan checks to fix zero stdev arrays ([arjun810](https://github.com/arjun810))
69
69
 
70
70
  ## See Also
71
71
 
data/lib/histogram.rb CHANGED
@@ -40,21 +40,27 @@ module Histogram
40
40
  end
41
41
  std_dev = _sum_sq - ((_sum * _sum)/_len)
42
42
  std_dev /= ( _len > 1 ? _len-1 : 1 )
43
- [_sum.to_f/_len, Math.sqrt(std_dev)]
43
+ sqrt_of_std_dev =
44
+ begin
45
+ Math.sqrt(std_dev)
46
+ rescue Math::DomainError
47
+ 0.0
48
+ end
49
+ [_sum.to_f/_len, sqrt_of_std_dev]
44
50
  end
45
51
 
46
- # opts:
52
+ # opts:
47
53
  #
48
54
  # defaults:
49
55
  # :method => :moore_mccabe, :tukey
50
56
  # :sorted => false
51
- #
57
+ #
52
58
  def iqrange(obj, opts={})
53
59
  opt = {:method => DEFAULT_QUARTILE_METHOD, :sorted => false}.merge( opts )
54
60
  srted = opt[:sorted] ? obj : obj.sort
55
61
  sz = srted.size
56
62
  return 0 if sz == 1
57
- answer =
63
+ answer =
58
64
  case opt[:method]
59
65
  when :tukey
60
66
  hi_idx = sz / 2
@@ -90,25 +96,30 @@ module Histogram
90
96
  if methd == :middle
91
97
  [:scott, :sturges, :fd].map {|v| number_of_bins(v) }.sort[1]
92
98
  else
93
- nbins =
99
+ nbins =
94
100
  case methd
95
101
  when :scott
96
102
  range = (self.max - self.min).to_f
97
- (mean, stddev) = Histogram.sample_stats(self)
98
- range / ( 3.5*stddev*(self.size**(-1.0/3)) )
103
+ (mean, stddev) = Histogram.sample_stats(self)
104
+ if stddev == 0.0
105
+ 1
106
+ else
107
+ range / ( 3.5*stddev*(self.size**(-1.0/3)) )
108
+ end
99
109
  when :sturges
100
110
  1 + Math::log2(self.size)
101
111
  when :fd
102
112
  2 * Histogram.iqrange(self, :method => quartile_method) * (self.size**(-1.0/3))
103
113
  end
104
- nbins = 1 if nbins.nan?
105
- nbins = 1 if nbins <= 0
114
+ if nbins > self.size || nbins.to_f.nan? || nbins <= 0
115
+ nbins = 1
116
+ end
106
117
  nbins.ceil.to_i
107
118
  end
108
119
  end
109
120
 
110
121
  # Returns [bins, freqs]
111
- #
122
+ #
112
123
  # histogram(bins, opts)
113
124
  # histogram(opts)
114
125
  #
@@ -127,23 +138,23 @@ module Histogram
127
138
  # :bin_width => <float> width of a bin (overrides :bins)
128
139
  # :min => <float> # explicitly set the min
129
140
  # :max => <float> # explicitly set the max val
130
- #
141
+ #
131
142
  # :other_sets => an array of other sets to histogram
132
143
  #
133
- # Examples
144
+ # Examples
134
145
  #
135
146
  # require 'histogram/array'
136
147
  # ar = [-2,1,2,3,3,3,4,5,6,6]
137
148
  # # these return: [bins, freqencies]
138
149
  # ar.histogram(20) # use 20 bins
139
150
  # ar.histogram([-3,-1,4,5,6], :bin_boundary => :avg) # custom bins
140
- #
151
+ #
141
152
  # # returns [bins, freq1, freq2 ...]
142
153
  # (bins, *freqs) = ar.histogram(30, :bin_boundary => :avg, :other_sets => [3,3,4,4,5], [-1,0,0,3,3,6])
143
154
  # (ar_freqs, other1, other2) = freqs
144
155
  #
145
156
  # # histogramming with weights
146
- # w_weights.histogram(20, :weights => [3,3,8,8,9,9,3,3,3,3])
157
+ # w_weights.histogram(20, :weights => [3,3,8,8,9,9,3,3,3,3])
147
158
  #
148
159
  # # with NArray
149
160
  # require 'histogram/narray'
@@ -165,7 +176,7 @@ module Histogram
165
176
  # to share the exact same bins. In this case returns [bins, freqs(caller),
166
177
  # freqs1, freqs2 ...]
167
178
  # * Can also deal with weights. :weights should provide parallel arrays to
168
- # the caller and any :other_sets provided.
179
+ # the caller and any :other_sets provided.
169
180
  def histogram(*args)
170
181
  make_freqs_proc = lambda do |obj, len|
171
182
  if obj.is_a?(Array)
@@ -202,13 +213,13 @@ module Histogram
202
213
  other_sets = opts[:other_sets]
203
214
 
204
215
  bins_array_like = bins.kind_of?(Array) || bins.kind_of?(NArray) || opts[:bin_width]
205
- all = [self] + other_sets
216
+ all = [self] + other_sets
206
217
 
207
218
  if bins.is_a?(Symbol)
208
219
  bins = number_of_bins(bins)
209
220
  end
210
221
 
211
- weights =
222
+ weights =
212
223
  if opts[:weights]
213
224
  have_frac_freqs = true
214
225
  opts[:weights][0].is_a?(Numeric) ? [ opts[:weights] ] : opts[:weights]
@@ -217,8 +228,8 @@ module Histogram
217
228
  end
218
229
 
219
230
  # we need to know the limits of the bins if we need to define our own bins
220
- if opts[:bin_width] || !bins_array_like
221
- calc_min, calc_max =
231
+ if opts[:bin_width] || !bins_array_like
232
+ calc_min, calc_max =
222
233
  unless opts[:min] && opts[:max]
223
234
  (mins, maxs) = all.map {|ar| Histogram.minmax(ar) }.transpose
224
235
  [mins.min, maxs.max]
@@ -238,9 +249,9 @@ module Histogram
238
249
  ########################################################
239
250
  # ARRAY BINS:
240
251
  ########################################################
241
- _bins =
252
+ _bins =
242
253
  if bins.is_a?(Array)
243
- bins.map {|v| v.to_f }
254
+ bins.map {|v| v.to_f }
244
255
  elsif bins.is_a?(NArray)
245
256
  bins.to_f
246
257
  end
@@ -250,11 +261,11 @@ module Histogram
250
261
 
251
262
  _freqs = make_freqs_proc.call(xvals, bins.size)
252
263
 
253
- break_points = []
264
+ break_points = []
254
265
  (0...(bins.size)).each do |i|
255
266
  bin = bins[i]
256
267
  break if i == (bins.size - 1)
257
- break_points << avg_ints(bin,bins[i+1])
268
+ break_points << avg_ints(bin,bins[i+1])
258
269
  end
259
270
  (0...(xvals.size)).each do |i|
260
271
  val = xvals[i]
@@ -262,9 +273,9 @@ module Histogram
262
273
  if val < break_points.first
263
274
  _freqs[0] += height
264
275
  elsif val >= break_points.last
265
- _freqs[-1] += height
276
+ _freqs[-1] += height
266
277
  else
267
- (0...(break_points.size-1)).each do |i|
278
+ (0...(break_points.size-1)).each do |i|
268
279
  if val >= break_points[i] && val < break_points[i+1]
269
280
  _freqs[i+1] += height
270
281
  break
@@ -272,7 +283,7 @@ module Histogram
272
283
  end
273
284
  end
274
285
  end
275
- _freqs
286
+ _freqs
276
287
  end
277
288
  when :min
278
289
  freqs_ar = all.zip(weights).map do |xvals, yvals|
@@ -305,7 +316,7 @@ module Histogram
305
316
  dmin = _min.to_f
306
317
  conv = _max == _min ? 0 : bins.to_f/(_max - _min)
307
318
 
308
- _bins =
319
+ _bins =
309
320
  if self.is_a?(Array)
310
321
  Array.new(bins)
311
322
  elsif self.is_a?(NArray)
@@ -335,12 +346,20 @@ module Histogram
335
346
  iconv = 1.0/conv
336
347
  case bin_boundary
337
348
  when :avg
338
- (0...bins).each do |i|
339
- _bins[i] = ((i+0.5) * iconv) + dmin
349
+ if bins == 1
350
+ _bins[0] = self.to_a.inject(0.0) {|sum, val| sum + val } / self.size
351
+ else
352
+ (0...bins).each do |i|
353
+ _bins[i] = ((i+0.5) * iconv) + dmin
354
+ end
340
355
  end
341
356
  when :min
342
- (0...bins).each do |i|
343
- _bins[i] = (i * iconv) + dmin
357
+ if bins == 1
358
+ _bins[0] = self.min
359
+ else
360
+ (0...bins).each do |i|
361
+ _bins[i] = (i * iconv) + dmin
362
+ end
344
363
  end
345
364
  end
346
365
  end
@@ -1,3 +1,3 @@
1
1
  module Histogram
2
- VERSION = "0.2.2.0"
2
+ VERSION = "0.2.3.0"
3
3
  end
@@ -106,6 +106,10 @@ shared_examples 'something that can histogram' do
106
106
  bins, freq = obj7.histogram(:middle)
107
107
  end
108
108
 
109
+ it 'can handle all the same value' do
110
+ bins, freq = obj8.histogram
111
+ end
112
+
109
113
  end
110
114
 
111
115
  describe Histogram do
@@ -117,7 +121,8 @@ describe Histogram do
117
121
  :obj4 => [2, 2, 2, 2, 2, 4],
118
122
  :obj5 => [1,2,3,3,3,4,5,6,7,8],
119
123
  :obj6 => [0,0,0,0,0],
120
- :obj7 => [0]
124
+ :obj7 => [0],
125
+ :obj8 => [1e-1, 1e-1, 1e-1, 1e-1],
121
126
  }
122
127
  data = tmp.each {|k,v| [k, v.map(&:to_f).extend(Histogram)] }
123
128
 
data/spec/spec_helper.rb CHANGED
@@ -3,24 +3,8 @@ SimpleCov.start
3
3
 
4
4
  require 'rspec'
5
5
 
6
- require 'rspec/core/formatters/progress_formatter'
7
- # doesn't say so much about pending guys
8
- class QuietPendingFormatter < RSpec::Core::Formatters::ProgressFormatter
9
- def example_pending(example)
10
- output.print pending_color('*')
11
- end
12
- end
13
-
14
- require 'rspec/core/formatters/documentation_formatter'
15
- class QuietPendingDocFormatter < RSpec::Core::Formatters::DocumentationFormatter
16
- def example_pending(example)
17
- output.puts pending_color( "<pending>: #{example.execution_result[:pending_message]}" )
18
- end
19
- end
20
-
21
6
  RSpec.configure do |config|
22
- config.treat_symbols_as_metadata_keys_with_true_values = true
23
- config.formatter = QuietPendingDocFormatter
7
+ config.expect_with(:rspec) { |c| c.syntax = :should }
24
8
  config.color = true
25
9
  end
26
10
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: histogram
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2.0
4
+ version: 0.2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - John T. Prince
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-11-18 00:00:00.000000000 Z
11
+ date: 2015-09-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -136,7 +136,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
136
136
  version: '0'
137
137
  requirements: []
138
138
  rubyforge_project:
139
- rubygems_version: 2.2.2
139
+ rubygems_version: 2.4.5
140
140
  signing_key:
141
141
  specification_version: 4
142
142
  summary: histograms data in different ways