split-export 1.1.0 → 2.0.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4eb50c9d3b73cdee33dbc24f31fd16ffed14db47
4
- data.tar.gz: 992e61be20fe22fbe0d66c498acd666c489f1e14
3
+ metadata.gz: 5a3924dc7806addaed71fd465447688c864c6c19
4
+ data.tar.gz: d58689307780d65717c55729771986f78a942a4a
5
5
  SHA512:
6
- metadata.gz: c6040350a4a1faa7c022e7ad81c01bc0804abc46540f3da7aaf239df0aeadfc32391dad5d6a99a0ee9e92c6340e978ad0e60417d9edbd27695ba79972e5054cc
7
- data.tar.gz: 184e50d61b67432c132eb54e5e6c36e4de2f0dea93f822451a3a731d77678fd462b6c7fd1fd07534d45561aed51644500d7d0a5164e236b0fde68f426cae3ce0
6
+ metadata.gz: fafaabcf0f9e880e6954a99782fa2fdec20f11e84741a375c563a021a4d56345b50778f1099659300c62c6b0279bdefea03351a4bbaefeb1ef9e8a4b717b9963
7
+ data.tar.gz: 8cec501deac0ebced73ea509ce4afcb89ccecde1c776ff9e0cddfbe3abe591c60313965b4b93f184042fb8f45ae5c2122cac00efd4ecdffb9427ed600557e26a
@@ -26,10 +26,18 @@ and require it in your project:
26
26
 
27
27
  ## Usage
28
28
 
29
+ This exports data for all experiments. This data set does not break down conversions by goals:
30
+
29
31
  require 'split/export'
30
32
  csv_data = Split::Export.to_csv
31
33
  File.open('path/to/my.csv', 'w') {|f| f.write(csv_data) }
32
34
 
35
+ This exports data for a single experiment, and breaks it down by group and goal:
36
+
37
+ require 'split/export'
38
+ csv_data = Split::Export.experiment_to_csv("my_experiment")
39
+ File.open('path/to/my.csv', 'w') {|f| f.write(csv_data) }
40
+
33
41
  ## Development
34
42
 
35
43
  Source hosted at [GitHub](http://github.com/splitrb/split-export).
@@ -10,17 +10,61 @@ module Split
10
10
  BigDecimal.new(number.to_s).round(precision).to_f
11
11
  end
12
12
 
13
+ # this method calculates the z_score for an alternative including all goals. This behavior should
14
+ # be added to Alternative#z_score but until then, this method will do. I lifted most of the code from that method.
15
+ def z_score_all_goals(alternative)
16
+ goals = alternative.goals + [nil]
17
+ control = alternative.experiment.control
18
+
19
+ return 'N/A' if control.name == alternative.name
20
+
21
+ p_a = goals.inject(0) { |sum, g| sum + alternative.conversion_rate(g) }
22
+ p_c = goals.inject(0) { |sum, g| sum + control.conversion_rate(g) }
23
+
24
+ n_a = alternative.participant_count
25
+ n_c = control.participant_count
26
+
27
+ z_score = Split::Zscore.calculate(p_a, n_a, p_c, n_c)
28
+ end
29
+
13
30
  def to_csv
14
31
  csv = CSV.generate do |csv|
15
32
  csv << ['Experiment', 'Alternative', 'Participants', 'Completed', 'Conversion Rate', 'Z score', 'Control', 'Winner']
16
33
  Split::ExperimentCatalog.all.each do |experiment|
34
+ goals = experiment.goals + [nil] # nil corresponds to conversions without any goals.
35
+
17
36
  experiment.alternatives.each do |alternative|
18
37
  csv << [experiment.name,
19
38
  alternative.name,
20
39
  alternative.participant_count,
21
- alternative.completed_count,
22
- round(alternative.conversion_rate, 3),
23
- round(alternative.z_score, 3),
40
+ goals.inject(0) { |sum, g| sum + alternative.completed_count(g) },
41
+ round(goals.inject(0) { |sum, g| sum + alternative.conversion_rate(g) }, 3),
42
+ round(z_score_all_goals(alternative), 3),
43
+ alternative.control?,
44
+ alternative.to_s == experiment.winner.to_s]
45
+ end
46
+ end
47
+ end
48
+ end
49
+
50
+ def experiment_to_csv(experiment)
51
+ csv = CSV.generate do |csv|
52
+ csv << ["Alternative", "Goal", "Participants", "Completed", "Conversion Rate", "Z Score", "Control", "Winner"]
53
+
54
+ experiment = Split::ExperimentCatalog.find(experiment)
55
+
56
+ break if !experiment
57
+
58
+ goals = [nil] + experiment.goals # nil corresponds to conversions without any goals.
59
+
60
+ experiment.alternatives.each do |alternative|
61
+ goals.each do |goal|
62
+ csv << [alternative.name,
63
+ goal,
64
+ alternative.participant_count,
65
+ alternative.completed_count(goal),
66
+ round(alternative.conversion_rate(goal), 3),
67
+ round(alternative.z_score(goal), 3),
24
68
  alternative.control?,
25
69
  alternative.to_s == experiment.winner.to_s]
26
70
  end
@@ -1,5 +1,5 @@
1
1
  module Split
2
2
  module Export
3
- VERSION = "1.1.0"
3
+ VERSION = "2.0.0"
4
4
  end
5
5
  end
@@ -2,18 +2,28 @@ require 'spec_helper'
2
2
 
3
3
  describe Split::Export do
4
4
  before :each do
5
- experiment = Split::ExperimentCatalog.find_or_create('link_color', 'blue', 'red', 'green')
5
+ experiment = Split::ExperimentCatalog.find_or_create({'link_color': ["control", "goal"]}, 'blue', 'red', 'green')
6
6
  blue = Split::Alternative.new('blue', 'link_color')
7
- blue.participant_count = 5
8
- blue.set_completed_count(3)
7
+ blue.participant_count = 50
8
+ blue.set_completed_count(20, "control")
9
+ blue.set_completed_count(10, "goal")
9
10
  blue.save
10
11
  red = Split::Alternative.new('red', 'link_color')
11
- red.participant_count = 6
12
- red.set_completed_count(4)
12
+ red.participant_count = 60
13
+ red.set_completed_count(10, "control")
14
+ red.set_completed_count(30, "goal")
13
15
  red.save
14
16
  end
15
17
 
16
18
  it "should generate a csv of split data" do
17
- Split::Export.to_csv.should eql("Experiment,Alternative,Participants,Completed,Conversion Rate,Z score,Control,Winner\nlink_color,blue,5,3,0.6,0.0,true,false\nlink_color,red,6,4,0.667,0.0,false,false\nlink_color,green,0,0,0.0,0.0,false,false\n")
19
+ Split::Export.to_csv.should eql("Experiment,Alternative,Participants,Completed,Conversion Rate,Z score,Control,Winner\nlink_color,blue,50,30,0.6,0.0,true,false\nlink_color,red,60,40,0.667,0.724,false,false\nlink_color,green,0,0,0.0,0.0,false,false\n")
20
+ end
21
+
22
+ it "should generate a detailed csv of split data for a single table" do
23
+ Split::Export.experiment_to_csv("link_color").should eql("Alternative,Goal,Participants,Completed,Conversion Rate,Z Score,Control,Winner\nblue,,50,0,0.0,0.0,true,false\nblue,control,50,20,0.4,0.0,true,false\nblue,goal,50,10,0.2,0.0,true,false\nred,,60,0,0.0,0.0,false,false\nred,control,60,10,0.167,-2.736,false,false\nred,goal,60,30,0.5,3.257,false,false\ngreen,,0,0,0.0,0.0,false,false\ngreen,control,0,0,0.0,0.0,false,false\ngreen,goal,0,0,0.0,0.0,false,false\n")
24
+ end
25
+
26
+ it "should quietly return nil if a bad experiment name is passed in" do
27
+ Split::Export.experiment_to_csv("incorrect_name").should be_nil
18
28
  end
19
29
  end
@@ -23,5 +23,5 @@ Gem::Specification.new do |s|
23
23
  # Development Dependencies
24
24
  s.add_development_dependency "rspec", "~> 2.6"
25
25
  s.add_development_dependency "rake", "~> 11.1"
26
- s.add_development_dependency 'fakeredis', '~> 0.5.0'
26
+ s.add_development_dependency 'fakeredis', '~> 0.6.0'
27
27
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: split-export
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andrew Nesbitt
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-08 00:00:00.000000000 Z
11
+ date: 2016-12-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: split
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: 0.5.0
61
+ version: 0.6.0
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - "~>"
67
67
  - !ruby/object:Gem::Version
68
- version: 0.5.0
68
+ version: 0.6.0
69
69
  description:
70
70
  email:
71
71
  - andrewnez@gmail.com
@@ -111,4 +111,3 @@ summary: Split extension to export your data
111
111
  test_files:
112
112
  - spec/export_spec.rb
113
113
  - spec/spec_helper.rb
114
- has_rdoc: