fpgrowth 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/test/tc_node.rb ADDED
@@ -0,0 +1,101 @@
1
+ require 'test/unit'
2
+ require "fpgrowth/fp_tree/node"
3
+
4
+ class TestNode < Test::Unit::TestCase
5
+
6
+ # Called before every test method runs. Can be used
7
+ # to set up fixture information.
8
+ def setup
9
+ # Do nothing
10
+ end
11
+
12
+ # Called after every test method runs. Can be used to tear
13
+ # down fixture information.
14
+
15
+ def teardown
16
+ # Do nothing
17
+ end
18
+
19
+ # Test initialize
20
+ def test_initialize
21
+ # Test initialize for node = nil
22
+ node = nil
23
+ assert_nothing_raised { node = FpGrowth::FpTree::Node.new() }
24
+ assert_equal(nil, node.item)
25
+ assert_equal(1, node.support)
26
+ assert_equal([], node.children)
27
+ assert_equal(nil, node.lateral)
28
+
29
+ # Test initialize for node with first parameter
30
+ assert_nothing_raised { node = FpGrowth::FpTree::Node.new(14) }
31
+ assert_equal(14, node.item)
32
+ assert_equal(1, node.support)
33
+
34
+ # Test initialize for node with two parameter
35
+ assert_nothing_raised { node = FpGrowth::FpTree::Node.new(14, 32) }
36
+ assert_equal(14, node.item)
37
+ assert_equal(32, node.support)
38
+
39
+ end
40
+
41
+ def test_clone_tail_deep
42
+ node = FpGrowth::FpTree::Node.new('a')
43
+
44
+ nodeChild10 = FpGrowth::FpTree::Node.new('b')
45
+ nodeChild11 = FpGrowth::FpTree::Node.new('b')
46
+ nodeChild12 = FpGrowth::FpTree::Node.new('b')
47
+
48
+ node.children += [nodeChild10, nodeChild11, nodeChild12]
49
+
50
+ nodeChild20 = FpGrowth::FpTree::Node.new('c')
51
+ nodeChild21 = FpGrowth::FpTree::Node.new('c')
52
+ nodeChild22 = FpGrowth::FpTree::Node.new('c')
53
+
54
+
55
+ node.children.first.children += [nodeChild20, nodeChild21, nodeChild22]
56
+
57
+ assert_equal(nodeChild11, nodeChild12)
58
+
59
+ result = nil
60
+
61
+ assert_nothing_raised { result = node.clone_tail_deep }
62
+
63
+ for i in (0..result.size-1)
64
+ assert_not_same(node.children[i], result[i])
65
+ assert_equal(node.children[i], result[i])
66
+ end
67
+
68
+ assert_not_same(node.children, result)
69
+ assert_equal(node.children, result)
70
+
71
+
72
+ node = node.children.first
73
+ result = result.first.children
74
+
75
+ assert_not_same(node.children, result)
76
+ assert_equal(node.children, result)
77
+ for i in (0..result.size-1)
78
+ assert_not_same(node.children[i], result[i])
79
+ assert_equal(node.children[i], result[i])
80
+ end
81
+
82
+ end
83
+
84
+ def test_equal
85
+ a = FpGrowth::FpTree::Node.new('c', 2)
86
+ b = FpGrowth::FpTree::Node.new('c', 2)
87
+
88
+ assert_equal(a, a)
89
+ assert_equal(a, b)
90
+
91
+ end
92
+
93
+ def test_clone
94
+ a = FpGrowth::FpTree::Node.new('c', 2)
95
+ b = FpGrowth::FpTree::Node.new('c', 2)
96
+
97
+ assert_equal(a, b)
98
+ assert_not_same(a, b)
99
+ end
100
+
101
+ end
@@ -0,0 +1,49 @@
1
+ require 'test/unit'
2
+ require 'fpgrowth'
3
+ require 'csv'
4
+
5
+ class TestOpenDataMTLSondage < Test::Unit::TestCase
6
+
7
+
8
+ def setup
9
+
10
+ @transactions = []
11
+ CSV.foreach("test/montreal-sondage/mtlsat12.csv", {:headers => true, :header_converters => :symbol, :header_converters => :symbol, :converters => :all, :encoding => 'windows-1251:utf-8'}) do |row|
12
+ transaction = row.to_a
13
+ transaction.delete_if { |item|
14
+ item[0].to_s.include?("dm") or (item[0].to_s.include?("sd80m") and item[1].to_s == '2') or item[1] == nil or item[1] == nil or item[1].to_s == " " or item[1].to_s.empty?
15
+ }
16
+ @transactions << transaction
17
+
18
+ end
19
+
20
+ end
21
+
22
+
23
+ def teardown
24
+ # Do nothing
25
+ end
26
+
27
+ # Fake test
28
+ def test_fp_growth
29
+
30
+ d = Time.now
31
+ puts "Start time : "+d.to_s
32
+
33
+ fp_tree = FpGrowth::FpTree.build(@transactions, 1)
34
+
35
+ puts "Tree built at :"+Time.now.to_s
36
+ patterns = FpGrowth::Miner.fp_growth(fp_tree)
37
+
38
+ f=Time.now
39
+ puts "Mining took #{(f-d)}sec"
40
+
41
+ patterns.sort! { |a, b| a.support <=> b.support }.reverse!
42
+
43
+ for pattern in patterns
44
+ puts "#{pattern.content} #{pattern.support}"
45
+ end
46
+
47
+ assert_not_equal(0, patterns.size)
48
+ end
49
+ end
@@ -0,0 +1,58 @@
1
+ require 'test/unit'
2
+ require 'fpgrowth'
3
+ require 'csv'
4
+
5
+ class TestOpenDataVelo < Test::Unit::TestCase
6
+
7
+
8
+ def setup
9
+
10
+ @transactions = []
11
+ CSV.foreach("test/montreal-velos-comptage/2012.csv", {:headers => true, :header_converters => :symbol, :header_converters => :symbol, :converters => :all, :encoding => 'windows-1251:utf-8', :col_sep => ";"}) do |row|
12
+ date = Date.parse(row[:date])
13
+ @transactions << [ [:wday, date.wday], [:month, date.month], [:date, row[:date]], [:berri, row[:berri_1]], [:ctesaintecatherine, row[:ctesaintecatherine]], [:maisonneuve_1, row[:maisonneuve_1]], [:maisonneuve_2, row[:maisonneuve_2]], [:du_parc, row[:du_parc]], [:pierredupuy, row[:pierredupuy]], [:rachel, row[:rachel1]]]
14
+ end
15
+
16
+
17
+ CSV.foreach("test/montreal-velos-comptage/2011.csv", {:headers => true, :header_converters => :symbol, :header_converters => :symbol, :converters => :all, :encoding => 'windows-1251:utf-8', :col_sep => ";"}) do |row|
18
+
19
+ date = Date.parse(row[:date])
20
+ mois = date.month
21
+ mois = 2 if row[:date].to_s.match("/f.vr/")
22
+ mois = 3 if row[:date].to_s.include?("avr")
23
+ mois = 5 if row[:date].to_s.include?("mai")
24
+ mois = 6 if row[:date].to_s.include?("juin")
25
+ mois = 7 if row[:date].to_s.include?("juil")
26
+ mois = 8 if row[:date].to_s.match("/ao.t/")
27
+ mois = 9 if row[:date].to_s.match("/d.c/")
28
+ date = Date.new(2011, mois, date.day)
29
+ transaction = [ [:wday, date.wday], [:month, date.month], [:date, row[:date]], [:berri, row[:berri]], [:ctesaintecatherine, row[:ctesaintecatherine]], [:maisonneuve_1, row[:maisonneuve_1]], [:maisonneuve_2, row[:maisonneuve_2]], [:du_parc, row[:du_parc]], [:pierredupuy, row[:pierredupuy]], [:rachel, row[:rachel]]]
30
+
31
+ transaction.delete_if { |x| x[1]==nil }
32
+ @transactions << transaction
33
+ end
34
+
35
+
36
+ end
37
+
38
+
39
+ def teardown
40
+ # Do nothing
41
+ end
42
+
43
+ # Fake test
44
+ def test_fp_growth
45
+ fp_tree = FpGrowth::FpTree.build(@transactions, 1)
46
+ patterns = FpGrowth::Miner.fp_growth(fp_tree)
47
+
48
+ patterns.sort! { |a, b| a.support <=> b.support }.reverse!
49
+
50
+ =begin
51
+ for pattern in patterns
52
+ puts "#{pattern.content} #{pattern.support}"
53
+ end
54
+ =end
55
+
56
+ assert_not_equal(0, patterns.size)
57
+ end
58
+ end
@@ -0,0 +1,56 @@
1
+ require 'test/unit'
2
+ require 'fpgrowth/miner/pattern'
3
+
4
+ class TestPattern < Test::Unit::TestCase
5
+
6
+ def test_initialize
7
+ pattern = nil
8
+ assert_nothing_raised { pattern = FpGrowth::Miner::Pattern.new() }
9
+ assert_equal(0, pattern.support)
10
+ assert_equal([], pattern.content)
11
+
12
+ assert_nothing_raised { pattern = FpGrowth::Miner::Pattern.new(['a', 'b', 'c'], 3) }
13
+ assert_equal(['a', 'b', 'c'], pattern.content)
14
+ assert_equal(3, pattern.support)
15
+
16
+ end
17
+
18
+ def test_add
19
+ pattern = FpGrowth::Miner::Pattern.new(['a', 'b', 'c'], 3)
20
+ pattern2 = FpGrowth::Miner::Pattern.new(['d', 'e'], 2)
21
+ union = nil
22
+ assert_nothing_raised { union = pattern + pattern2 }
23
+
24
+ assert_equal(union.size, pattern.size + pattern2.size)
25
+ assert_equal(5, union.size)
26
+ assert_equal(['a', 'b', 'c', 'd', 'e'], union.content)
27
+ assert_equal(pattern.content + pattern2.content, union.content)
28
+ assert_equal(2, union.support)
29
+ end
30
+
31
+ def test_insert
32
+ pattern = FpGrowth::Miner::Pattern.new(['a', 'b', 'c'], 3)
33
+ node1 = FpGrowth::FpTree::Node.new('d', 2)
34
+ node2 = FpGrowth::FpTree::Node.new('e', 3)
35
+
36
+ node3 = FpGrowth::FpTree::Node.new('f', 1)
37
+ node4 = FpGrowth::FpTree::Node.new('g', 2)
38
+ node_array = [node3, node4]
39
+
40
+ assert_nothing_raised { pattern << node1 }
41
+ assert_equal('d', pattern.content.last)
42
+ assert_equal(2, pattern.support)
43
+
44
+ assert_nothing_raised { pattern << node2 }
45
+ assert_equal('e', pattern.content.last)
46
+ assert_equal(2, pattern.support)
47
+
48
+ assert_nothing_raised { pattern << node_array }
49
+ assert_equal('g', pattern.content[-1])
50
+ assert_equal('f', pattern.content[-2])
51
+ assert_equal(1, pattern.support)
52
+
53
+
54
+ end
55
+
56
+ end
@@ -0,0 +1,148 @@
1
+ require 'test/unit'
2
+ require 'fpgrowth/fp_tree/builder/second_pass'
3
+ require 'fpgrowth/fp_tree/builder/first_pass'
4
+
5
+
6
+ class TestSecondPass < Test::Unit::TestCase
7
+
8
+
9
+ def setup
10
+ items= ['a', 'b', 'c', 'd', 'e']
11
+
12
+ r = Random.new
13
+
14
+ @n = r.rand(100..500)
15
+
16
+ @random_transactions = []
17
+ for i in (0..@n)
18
+
19
+
20
+ @m = r.rand(1..5)
21
+ @random_transactions[i]=[]
22
+ for j in (0..@m)
23
+ x = r.rand(10)
24
+ if x == 9
25
+ # Trick pour que le 'e' se fasse pruner
26
+ then
27
+ @random_transactions[i] << items[r.rand(items.size)]
28
+ else
29
+ @random_transactions[i] << items[r.rand(items.size - 1)]
30
+ end
31
+ end
32
+
33
+ end
34
+
35
+ @non_random = [['a', 'b'], ['b'], ['b', 'c'], ['a', 'b']]
36
+
37
+
38
+ firstPass = FpGrowth::FpTree::Builder::FirstPass.new()
39
+
40
+ @supports_random = firstPass.execute(@random_transactions)
41
+ @supports_non_random = firstPass.execute(@non_random)
42
+ end
43
+
44
+ # Called after every test method runs. Can be used to tear
45
+ # down fixture information.
46
+
47
+ def teardown
48
+ # Do nothing
49
+ end
50
+
51
+ def test_sort_by_support
52
+
53
+ secondPass = FpGrowth::FpTree::Builder::SecondPass.new(@supports_non_random)
54
+
55
+ support_sorted = []
56
+
57
+
58
+ for transaction in @non_random
59
+ support_sorted << secondPass.sort_by_support(transaction)
60
+ end
61
+
62
+ assert_equal(@supports_non_random.keys.first, support_sorted.first.first)
63
+ assert_equal(@supports_non_random.keys[1], support_sorted.first[1])
64
+
65
+
66
+ secondPass = FpGrowth::FpTree::Builder::SecondPass.new(@supports_random)
67
+
68
+ for transaction in @random_transactions
69
+ secondPass.sort_by_support(transaction)
70
+ end
71
+
72
+
73
+ end
74
+
75
+ def test_continue_pattern
76
+ parent = FpGrowth::FpTree::Node.new('a')
77
+ secondPass = FpGrowth::FpTree::Builder::SecondPass.new(@supports_non_random)
78
+
79
+ transaction = ['a', 'b']
80
+
81
+ assert_nothing_raised() { secondPass.continue_pattern(parent, transaction) }
82
+ assert_equal(2, parent.support)
83
+
84
+ end
85
+
86
+ def test_fork_pattern
87
+ parent = FpGrowth::FpTree::Node.new(nil)
88
+ secondPass = FpGrowth::FpTree::Builder::SecondPass.new(@supports_non_random)
89
+
90
+ transaction = ['a', 'b']
91
+
92
+ assert_nothing_raised() { secondPass.fork_pattern(parent, transaction) }
93
+ assert_equal('a', parent.children.last.item)
94
+ assert_equal('b', parent.children.last.children.first.item)
95
+
96
+ # Test 2
97
+
98
+ parent = FpGrowth::FpTree::Node.new('a')
99
+ secondPass = FpGrowth::FpTree::Builder::SecondPass.new(@supports_non_random)
100
+
101
+ transaction = ['a', 'a', 'b']
102
+
103
+ assert_nothing_raised() { secondPass.fork_pattern(parent, transaction) }
104
+ assert_equal('a', parent.children.last.item)
105
+ assert_equal(2, parent.children.last.support)
106
+ assert_equal('b', parent.children.last.children.first.item)
107
+
108
+
109
+ end
110
+
111
+ def test_traverse
112
+
113
+ parent = FpGrowth::FpTree::Node.new(nil)
114
+ secondPass = FpGrowth::FpTree::Builder::SecondPass.new(@supports_non_random)
115
+
116
+ transaction = ['a', 'a', 'b']
117
+
118
+ assert_nothing_raised() { secondPass.traverse(parent, transaction) }
119
+ assert_equal(2, parent.children.first.support)
120
+ assert_equal('a', parent.children.first.item)
121
+
122
+ assert_equal('b', parent.children.first.children.first.item)
123
+ assert_equal(1, parent.children.first.children.first.support)
124
+
125
+ end
126
+
127
+ def test_initialize
128
+ secondPass = nil
129
+ assert_nothing_raised { secondPass = FpGrowth::FpTree::Builder::SecondPass.new(@supports_non_random) }
130
+
131
+ assert_not_nil(secondPass.fp_tree)
132
+ assert_equal(@supports_non_random.keys, secondPass.fp_tree.heads.keys)
133
+ assert_equal(@supports_non_random, secondPass.fp_tree.supports)
134
+ end
135
+
136
+ def test_execute
137
+ secondPass = nil
138
+ assert_nothing_raised { secondPass = FpGrowth::FpTree::Builder::SecondPass.new(@supports_non_random) }
139
+
140
+ assert_nothing_raised { secondPass.execute(@non_random) }
141
+ for key in secondPass.fp_tree.heads.keys
142
+ assert_not_nil(secondPass.fp_tree.heads[key])
143
+ end
144
+
145
+
146
+ end
147
+
148
+ end
metadata ADDED
@@ -0,0 +1,131 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: fpgrowth
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - thedamfr
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-05-29 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.3'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.3'
30
+ - !ruby/object:Gem::Dependency
31
+ name: ruby-graphviz
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ description: FP-Growth implementation
47
+ email:
48
+ - dam.cavailles@laposte.net
49
+ executables: []
50
+ extensions: []
51
+ extra_rdoc_files: []
52
+ files:
53
+ - .gitignore
54
+ - .idea/.name
55
+ - .idea/.rakeTasks
56
+ - .idea/encodings.xml
57
+ - .idea/fp-growth-ruby.iml
58
+ - .idea/misc.xml
59
+ - .idea/modules.xml
60
+ - .idea/scopes/scope_settings.xml
61
+ - .idea/vcs.xml
62
+ - Gemfile
63
+ - LICENSE.txt
64
+ - README.md
65
+ - Rakefile
66
+ - fpgrowth-ruby.gemspec
67
+ - lib/fpgrowth.rb
68
+ - lib/fpgrowth/fp_tree.rb
69
+ - lib/fpgrowth/fp_tree/builder.rb
70
+ - lib/fpgrowth/fp_tree/builder/first_pass.rb
71
+ - lib/fpgrowth/fp_tree/builder/second_pass.rb
72
+ - lib/fpgrowth/fp_tree/node.rb
73
+ - lib/fpgrowth/miner.rb
74
+ - lib/fpgrowth/miner/conditional_tree_builder.rb
75
+ - lib/fpgrowth/miner/pattern.rb
76
+ - lib/fpgrowth/miner/pattern_base_extractor.rb
77
+ - lib/fpgrowth/version.rb
78
+ - test/montreal-sondage/mtlsat12.csv
79
+ - test/montreal-velos-comptage/2009.csv
80
+ - test/montreal-velos-comptage/2010.csv
81
+ - test/montreal-velos-comptage/2011.csv
82
+ - test/montreal-velos-comptage/2012.csv
83
+ - test/tc_builder.rb
84
+ - test/tc_first_pass.rb
85
+ - test/tc_fp_tree.rb
86
+ - test/tc_miner.rb
87
+ - test/tc_node.rb
88
+ - test/tc_open_data_sondage_montreal.rb
89
+ - test/tc_open_data_velo_montreal.rb
90
+ - test/tc_pattern.rb
91
+ - test/tc_second_pass.rb
92
+ homepage: ''
93
+ licenses:
94
+ - MIT
95
+ post_install_message:
96
+ rdoc_options: []
97
+ require_paths:
98
+ - lib
99
+ required_ruby_version: !ruby/object:Gem::Requirement
100
+ none: false
101
+ requirements:
102
+ - - ! '>='
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ required_rubygems_version: !ruby/object:Gem::Requirement
106
+ none: false
107
+ requirements:
108
+ - - ! '>='
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ requirements: []
112
+ rubyforge_project:
113
+ rubygems_version: 1.8.25
114
+ signing_key:
115
+ specification_version: 3
116
+ summary: FP-Growth is mean to detect
117
+ test_files:
118
+ - test/montreal-sondage/mtlsat12.csv
119
+ - test/montreal-velos-comptage/2009.csv
120
+ - test/montreal-velos-comptage/2010.csv
121
+ - test/montreal-velos-comptage/2011.csv
122
+ - test/montreal-velos-comptage/2012.csv
123
+ - test/tc_builder.rb
124
+ - test/tc_first_pass.rb
125
+ - test/tc_fp_tree.rb
126
+ - test/tc_miner.rb
127
+ - test/tc_node.rb
128
+ - test/tc_open_data_sondage_montreal.rb
129
+ - test/tc_open_data_velo_montreal.rb
130
+ - test/tc_pattern.rb
131
+ - test/tc_second_pass.rb