rkneufeld-fuzzy-realty 0.5.0 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION.yml +1 -1
- data/lib/rulebase.rb +59 -55
- data/lib/scores_table.rb +16 -15
- metadata +1 -1
data/VERSION.yml
CHANGED
data/lib/rulebase.rb
CHANGED
@@ -1,62 +1,66 @@
|
|
1
1
|
require 'scores_table.rb'
|
2
2
|
module FuzzyRealty
|
3
|
-
RULES =
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
3
|
+
RULES = lambda do
|
4
|
+
rules = {
|
5
|
+
# Not yet implemented
|
6
|
+
#:bathrooms => ,
|
7
|
+
#:bedrooms => ,
|
8
|
+
#:garage => ,
|
9
|
+
#:deck => ,
|
9
10
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
11
|
+
# Price is match when desired is 90-105% of actual. Otherwise give a
|
12
|
+
# reduced factor.
|
13
|
+
:price =>
|
14
|
+
lambda do |listing,desired|
|
15
|
+
puts "Called price" if $debug
|
16
|
+
actual = listing.price.to_f
|
17
|
+
result = if (desired*0.90..desired*1.05) === actual
|
18
|
+
1.0
|
19
|
+
else
|
20
|
+
1 - ((desired - actual) / actual).abs
|
21
|
+
end
|
22
|
+
puts result if $debug
|
23
|
+
result
|
24
|
+
end,
|
24
25
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
26
|
+
# Location calc. does lookup to find score for desired and actual
|
27
|
+
## Currently just return 1 if exact, 0 otherwise
|
28
|
+
:location =>
|
29
|
+
lambda do |listing,desired|
|
30
|
+
puts "Called location" if $debug
|
31
|
+
# Perform a quick lookup (i.e. FuzzyRealty::LOCN[:A][:A] => 1.0)
|
32
|
+
puts FuzzyRealty::LOCN[desired.to_sym][listing.location.to_sym] if $debug
|
33
|
+
FuzzyRealty::LOCN[desired.to_sym][listing.location.to_sym]
|
34
|
+
end,
|
34
35
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
36
|
+
:sqft =>
|
37
|
+
lambda do |listing,desired|
|
38
|
+
puts "Called sqft" if $debug
|
39
|
+
actual = listing.sqft
|
40
|
+
result = if (actual + 50) >= desired
|
41
|
+
1.0
|
42
|
+
elsif (actual + 150) >= desired
|
43
|
+
0.8
|
44
|
+
elsif (actual + 300) >= desired
|
45
|
+
0.5
|
46
|
+
else
|
47
|
+
0.0
|
48
|
+
end
|
49
|
+
puts result if $debug
|
50
|
+
result
|
51
|
+
end,
|
52
|
+
# Style's follow lookup table similar to Location
|
52
53
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
54
|
+
:style =>
|
55
|
+
lambda do |listing,desired|
|
56
|
+
puts "Called style" if $debug
|
57
|
+
desired = FuzzyRealty::STYLE[:Symbol][desired]
|
58
|
+
actual = FuzzyRealty::STYLE[:Symbol][listing.style]
|
59
|
+
puts FuzzyRealty::STYLE[desired][actual] if $debug
|
60
|
+
FuzzyRealty::STYLE[desired][actual]
|
61
|
+
end
|
62
|
+
}
|
63
|
+
rules.default = lambda {|a,b| raise "Invalid type used in rule lookup"}
|
64
|
+
rules
|
65
|
+
end.call
|
62
66
|
end
|
data/lib/scores_table.rb
CHANGED
@@ -10,12 +10,12 @@ module FuzzyRealty
|
|
10
10
|
# B 0.75 1.00 0.4 0.1
|
11
11
|
# C 0.2 0.4 1.0 0.6
|
12
12
|
# D 0.0 0.1 0.6 1.0
|
13
|
-
LOCN = {
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
13
|
+
LOCN = Hash.new(0).merge({
|
14
|
+
:A => {:A => 1.0, :B => 0.75, :C => 0.2, :D => 0.0},
|
15
|
+
:B => {:A => 0.75, :B => 1.0, :C => 0.4, :D => 0.1},
|
16
|
+
:C => {:A => 0.2, :B => 0.4, :C => 1.0, :D => 0.6},
|
17
|
+
:D => {:A => 0.0, :B => 0.1, :C => 0.6, :D => 1.0}
|
18
|
+
})
|
19
19
|
|
20
20
|
# Table for lookup of score of desired and actual styles
|
21
21
|
# - Arbitrary values provied by my wife, at present the leanings aren't quite right
|
@@ -27,13 +27,14 @@ module FuzzyRealty
|
|
27
27
|
#| Tw | 0.0 | 0.6 | 1 | 0.5 | 0.0 |
|
28
28
|
#| Bi | 0.75 | 0.6 | 0.8 | 1 | 0.0 |
|
29
29
|
#| Co | 0.7 | 0.0 | 0.0 | 0.0 | 1 |
|
30
|
-
STYLE = {
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
30
|
+
STYLE = Hash.new(0).merge({
|
31
|
+
:Symbol => {"Bungalow" => :Bu, "Bi-level" => :Bi, "Split-level" => :Sp,
|
32
|
+
"Two-story" => :Tw, "Condominium" => :Co},
|
33
|
+
:Bu => { :Bu => 1, :Sp => 0.4, :Tw => 0.8, :Bi => 0.65, :Co => 0.1 },
|
34
|
+
:Sp => { :Bu => 0.5, :Sp => 1.0, :Tw => 0.7, :Bi => 0.95, :Co => 0.2 },
|
35
|
+
:Tw => { :Bu => 0.0, :Sp => 0.6, :Tw => 1.0, :Bi => 0.5, :Co => 0.0 },
|
36
|
+
:Bi => { :Bu => 0.75,:Sp => 0.6, :Tw => 0.8, :Bi => 1.0, :Co => 0.0 },
|
37
|
+
:Co => { :Bu => 0.7, :Sp => 0.0, :Tw => 0.0, :Bi => 0.0, :Co => 1.0 }
|
38
|
+
})
|
39
|
+
|
39
40
|
end
|