lib/split/export.rb in split-export-1.1.0 vs lib/split/export.rb in split-export-2.0.0
- old
+ new
@@ -8,20 +8,64 @@
def round(number, precision = 2)
BigDecimal.new(number.to_s).round(precision).to_f
end
+ # this method calculates the z_score for an alternative including all goals. This behavior should
+ # be added to Alternative#z_score but until then, this method will do. I lifted most of the code from that method.
+ def z_score_all_goals(alternative)
+ goals = alternative.goals + [nil]
+ control = alternative.experiment.control
+
+ return 'N/A' if control.name == alternative.name
+
+ p_a = goals.inject(0) { |sum, g| sum + alternative.conversion_rate(g) }
+ p_c = goals.inject(0) { |sum, g| sum + control.conversion_rate(g) }
+
+ n_a = alternative.participant_count
+ n_c = control.participant_count
+
+ z_score = Split::Zscore.calculate(p_a, n_a, p_c, n_c)
+ end
+
def to_csv
csv = CSV.generate do |csv|
csv << ['Experiment', 'Alternative', 'Participants', 'Completed', 'Conversion Rate', 'Z score', 'Control', 'Winner']
Split::ExperimentCatalog.all.each do |experiment|
+ goals = experiment.goals + [nil] # nil corresponds to conversions without any goals.
+
experiment.alternatives.each do |alternative|
csv << [experiment.name,
alternative.name,
alternative.participant_count,
- alternative.completed_count,
- round(alternative.conversion_rate, 3),
- round(alternative.z_score, 3),
+ goals.inject(0) { |sum, g| sum + alternative.completed_count(g) },
+ round(goals.inject(0) { |sum, g| sum + alternative.conversion_rate(g) }, 3),
+ round(z_score_all_goals(alternative), 3),
+ alternative.control?,
+ alternative.to_s == experiment.winner.to_s]
+ end
+ end
+ end
+ end
+
+ def experiment_to_csv(experiment)
+ csv = CSV.generate do |csv|
+ csv << ["Alternative", "Goal", "Participants", "Completed", "Conversion Rate", "Z Score", "Control", "Winner"]
+
+ experiment = Split::ExperimentCatalog.find(experiment)
+
+ break if !experiment
+
+ goals = [nil] + experiment.goals # nil corresponds to conversions without any goals.
+
+ experiment.alternatives.each do |alternative|
+ goals.each do |goal|
+ csv << [alternative.name,
+ goal,
+ alternative.participant_count,
+ alternative.completed_count(goal),
+ round(alternative.conversion_rate(goal), 3),
+ round(alternative.z_score(goal), 3),
alternative.control?,
alternative.to_s == experiment.winner.to_s]
end
end
end