fpgrowth 0.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.
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