kuku 0.1
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 +15 -0
- data/README.rdoc +17 -0
- data/lib/kuku.rb +158 -0
- metadata +45 -0
checksums.yaml
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
---
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
OGYxYTU5NjJjYmU3OWNiM2Q5MjFkMzYxNWQ4MzQ5ODRhNTk0MTZkMA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
NWYwZWViNGIzMjYxYWFkZjI4ODJlODM2YzIzMjhjZjFjOTQ5ZDZkYw==
|
7
|
+
!binary "U0hBNTEy":
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
ZjVkMzY2YTVkZDU2OTA3MjU1MmQ0NDJiOTg3YTUwYmQwM2IxNGRjYjljMmQ0
|
10
|
+
YzllMWYyZTBjZmFmZGIxMTZjNGZiY2U5NjY0NzE1MDhiMTJjODk3N2RiYjgy
|
11
|
+
OGY2MGUxNDBmZmVhZjY0MmJiZWFjOTg3ZDlmYTk2MDMzODRlMzU=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
YjQ2ZmY4MDFiMDdhZDdlMjFmYWU1OTdiZmVmY2UzMWZlZGMwMTk1ZDJhY2Nh
|
14
|
+
ODlmMmVkOGZkZWY2ZWY4MTg3MTU3MGQzYzIyZTc1ZGE0ZjE4ZDE2NGE0ODMx
|
15
|
+
MWJjMGYzMDM2MGYwODM1N2Y3ZDFiZjZjZmY2NjU2MzZjOGVhNGQ=
|
data/README.rdoc
ADDED
data/lib/kuku.rb
ADDED
@@ -0,0 +1,158 @@
|
|
1
|
+
module ChainAnalysis
|
2
|
+
def stability method_name, n=8
|
3
|
+
elements(method_name, n).stability
|
4
|
+
end
|
5
|
+
def average_growth method_name, n=8
|
6
|
+
elements(method_name, n).average_growth
|
7
|
+
end
|
8
|
+
def mean method_name, n=8
|
9
|
+
elements(method_name, n).mean
|
10
|
+
end
|
11
|
+
def elements method_name, n=8
|
12
|
+
as_unchained_array[0..(n-1)].map{|s| s.method(method_name).call}
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
class Object
|
18
|
+
include ChainAnalysis
|
19
|
+
attr_accessor :next, :previous
|
20
|
+
def nvl v
|
21
|
+
v ? v : 0
|
22
|
+
end
|
23
|
+
def as_number
|
24
|
+
return self if self.class != String
|
25
|
+
signing = start_with?("(") && end_with?(")") ? -1 : 1
|
26
|
+
s = gsub(",", "").gsub("--", "").gsub("(", "").gsub(")", "")
|
27
|
+
!s.empty? ? s.to_i * signing : 0
|
28
|
+
end
|
29
|
+
def as_unchained_array
|
30
|
+
return Array[self] if self.next == nil
|
31
|
+
a = Array[self] << self.next.as_unchained_array
|
32
|
+
a.flatten
|
33
|
+
end
|
34
|
+
def update_attributes hash
|
35
|
+
hash.each { |name, value| instance_variable_set("@#{name}", value) }
|
36
|
+
end
|
37
|
+
def attributes
|
38
|
+
!instance_variables.empty? ?
|
39
|
+
(instance_variables_as_hash) :
|
40
|
+
(struct_as_hash self)
|
41
|
+
end
|
42
|
+
def instance_variables_as_hash
|
43
|
+
hash = Hash.new
|
44
|
+
instance_variables.each{|v|
|
45
|
+
hash[hash_key_for(v)] = instance_variable_get(v)
|
46
|
+
}
|
47
|
+
hash
|
48
|
+
end
|
49
|
+
def struct_as_hash obj
|
50
|
+
hash = Hash.new
|
51
|
+
obj.each_pair {|name, value| hash[name] = value}
|
52
|
+
hash
|
53
|
+
end
|
54
|
+
def hash_key_for v
|
55
|
+
v.to_s.gsub("@","").to_sym
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
class Array
|
61
|
+
def as_chain
|
62
|
+
self.size.times{|i|
|
63
|
+
a = self[i+1]
|
64
|
+
b = self[i-1]
|
65
|
+
(self[i].next = a) if a
|
66
|
+
(self[i].previous = b) if (b && i > 0)
|
67
|
+
}
|
68
|
+
self[0]
|
69
|
+
end
|
70
|
+
def rank
|
71
|
+
Rank.new self
|
72
|
+
end
|
73
|
+
def total
|
74
|
+
Totaler.new self
|
75
|
+
end
|
76
|
+
def product
|
77
|
+
reduce{|k,v| k*v}
|
78
|
+
end
|
79
|
+
def geometric_mean
|
80
|
+
product ** (1/size.to_f)
|
81
|
+
end
|
82
|
+
def sum
|
83
|
+
reduce{|k,v| k+v}
|
84
|
+
end
|
85
|
+
def mean
|
86
|
+
sum / size
|
87
|
+
end
|
88
|
+
def standard_deviation
|
89
|
+
Math.sqrt variance
|
90
|
+
end
|
91
|
+
def variance
|
92
|
+
((reduce(0){|k,v| k+(v-mean)**2})) / size.to_f
|
93
|
+
end
|
94
|
+
def stability
|
95
|
+
mean / (standard_deviation > 1.0 ? standard_deviation : 1)
|
96
|
+
end
|
97
|
+
def growth
|
98
|
+
result = Array.new
|
99
|
+
(size-1).times {|i| result << ((self[i].to_f - self[i+1].to_f)/self[i+1].to_f) * 100 }
|
100
|
+
result
|
101
|
+
end
|
102
|
+
def average_growth
|
103
|
+
growth.mean
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
|
108
|
+
class Range
|
109
|
+
def percent n
|
110
|
+
a = last - first
|
111
|
+
b = n - first
|
112
|
+
((b / a) * 100).round(2)
|
113
|
+
end
|
114
|
+
def near_top? n, definition = 25.0
|
115
|
+
percent(n).between?((100-definition), 100+definition)
|
116
|
+
end
|
117
|
+
def near_bottom? n, definition = 25.0
|
118
|
+
percent(n).between?(0, definition)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
|
123
|
+
RankedObject = Struct.new(:rank, :object)
|
124
|
+
class Rank
|
125
|
+
def initialize objects
|
126
|
+
@objects = objects
|
127
|
+
@all_rankings = Array.new
|
128
|
+
end
|
129
|
+
def size
|
130
|
+
@objects.size
|
131
|
+
end
|
132
|
+
def higher_is_better criteria
|
133
|
+
rank_reverse true, criteria
|
134
|
+
end
|
135
|
+
def lower_is_better criteria
|
136
|
+
rank_reverse false, criteria
|
137
|
+
end
|
138
|
+
def rank_reverse do_reverse, criteria
|
139
|
+
criteria.each{|criterion|
|
140
|
+
i = 0
|
141
|
+
sorted = @objects.sort_by {|o| eval("o.#{criterion}")}
|
142
|
+
sorted = sorted.reverse if do_reverse
|
143
|
+
@all_rankings << sorted.collect{|o| RankedObject.new(i+=1, o) }
|
144
|
+
}
|
145
|
+
self
|
146
|
+
end
|
147
|
+
def total_for a
|
148
|
+
@all_rankings.collect{|rank|
|
149
|
+
rank.select{|ranked_item| ranked_item.object == a}[0].rank}.
|
150
|
+
inject{|sum, i| sum + i}
|
151
|
+
end
|
152
|
+
def execute
|
153
|
+
@objects.
|
154
|
+
collect{|o| RankedObject.new(total_for(o), o)}.
|
155
|
+
sort_by{|r| r.rank}.
|
156
|
+
collect{|r| r.object}
|
157
|
+
end
|
158
|
+
end
|
metadata
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: kuku
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.1'
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Craig Davidson
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2013-09-20 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: General helpers.
|
14
|
+
email: craig@craigdavidson.co.uk
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- README.rdoc
|
20
|
+
- lib/kuku.rb
|
21
|
+
homepage: https://github.com/craigmdavidson/kuku
|
22
|
+
licenses:
|
23
|
+
- MIT
|
24
|
+
metadata: {}
|
25
|
+
post_install_message:
|
26
|
+
rdoc_options: []
|
27
|
+
require_paths:
|
28
|
+
- lib
|
29
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ! '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - ! '>='
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
requirements: []
|
40
|
+
rubyforge_project:
|
41
|
+
rubygems_version: 2.0.5
|
42
|
+
signing_key:
|
43
|
+
specification_version: 4
|
44
|
+
summary: Kuku.
|
45
|
+
test_files: []
|