retention_magic 0.1beta2 → 0.1beta3
Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 62db181a49bfa473329ed2b6b1b29a8a74245a82
|
4
|
+
data.tar.gz: d4ffc7246b4af371d0aeb94c78b5b87e583c0a50
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9de9f5e839cabb2ab01dd6d1070eace1fe0e6b77ba234c4c7c5a62f45f5149f80bb6a3e07443f974c555b7ab36376bbed9411be43294c28fb218e5d65e5c36db
|
7
|
+
data.tar.gz: fe7f26162a7814ed340ac0f44b6ac072645f52ba1dff147d9de986f9dee4d7a9214f79e72355cf732c0e75097c73ad2471364b75b1a4ad5e022a0cefe3c05d4c
|
@@ -6,15 +6,15 @@ module RetentionMagic
|
|
6
6
|
# RetentionMagic configuration setup
|
7
7
|
@user_class = RetentionMagic.user_class.constantize
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
first_cohort = @first_user.created_at.beginning_of_month
|
9
|
+
@first_user = @user_class.order(:created_at).first
|
10
|
+
first_cohort_week = 12.weeks.ago.to_date.beginning_of_week
|
12
11
|
today = Date.today
|
13
12
|
|
13
|
+
difference_in_days_between_now_and_first_cohort = (today.beginning_of_week - first_cohort_week).to_i
|
14
|
+
|
14
15
|
# For presenting the widgets
|
15
|
-
@
|
16
|
-
@
|
17
|
-
@number_of_months = (today.year * 12 + today.month) - (first_cohort.year * 12 + first_cohort.month)
|
16
|
+
@current_cohort_label = today.strftime("%U/%Y")
|
17
|
+
@number_of_weeks = difference_in_days_between_now_and_first_cohort / 7
|
18
18
|
|
19
19
|
@graphs = {
|
20
20
|
activation: {
|
@@ -28,39 +28,68 @@ module RetentionMagic
|
|
28
28
|
retention_models = RetentionMagic.retention_models.map { |class_name| class_name.constantize }
|
29
29
|
activation_fields_for_query = RetentionMagic.activation_counter_columns.join(" + ")
|
30
30
|
|
31
|
-
0.upto(@
|
32
|
-
cohort_start =
|
33
|
-
cohort_start_end = (cohort_start + 1.
|
31
|
+
0.upto(@number_of_weeks) do |week|
|
32
|
+
cohort_start = first_cohort_week + week.weeks
|
33
|
+
cohort_start_end = (cohort_start + 1.week).beginning_of_week
|
34
34
|
|
35
35
|
cohort_users = @user_class.where(created_at: cohort_start..cohort_start_end)
|
36
|
+
number_of_cohort_users = cohort_users.count
|
37
|
+
|
38
|
+
if number_of_cohort_users == 0
|
39
|
+
signups_without_activation = 0
|
40
|
+
one_activation = 0
|
41
|
+
five_activations = 0
|
42
|
+
else
|
43
|
+
signups_without_activation = cohort_users.where("#{activation_fields_for_query} = 0").count
|
44
|
+
one_activation = cohort_users.where("#{activation_fields_for_query} >= 1 AND #{activation_fields_for_query} < 5").count
|
45
|
+
five_activations = cohort_users.where("#{activation_fields_for_query} >= 5").count
|
46
|
+
end
|
47
|
+
|
48
|
+
if number_of_cohort_users > 0
|
49
|
+
@graphs[:activation][:one_activation][cohort_start] = (one_activation.to_f / number_of_cohort_users.to_f) * 100.0
|
50
|
+
@graphs[:activation][:five_activations][cohort_start] = (five_activations.to_f / number_of_cohort_users.to_f) * 100.0
|
51
|
+
@graphs[:activation][:signup_without_activation][cohort_start] = (signups_without_activation.to_f / number_of_cohort_users.to_f) * 100.0
|
52
|
+
else
|
53
|
+
@graphs[:activation][:one_activation][cohort_start] = 0
|
54
|
+
@graphs[:activation][:five_activations][cohort_start] = 0
|
55
|
+
@graphs[:activation][:signup_without_activation][cohort_start] = 0
|
56
|
+
end
|
36
57
|
|
37
|
-
@graphs[:activation][:signup_without_activation][cohort_start] = cohort_users.where("#{activation_fields_for_query} = 0").count
|
38
|
-
@graphs[:activation][:one_activation][cohort_start] = cohort_users.where("#{activation_fields_for_query} = 1").count
|
39
|
-
@graphs[:activation][:five_activations][cohort_start] = cohort_users.where("#{activation_fields_for_query} >= 5").count
|
40
58
|
|
41
|
-
cohort_start_label = cohort_start.strftime("%
|
59
|
+
cohort_start_label = cohort_start.strftime("w%U %Y")
|
42
60
|
@graphs[:retention][cohort_start_label] = {}
|
43
61
|
cohort_user_ids = cohort_users.pluck(:id)
|
62
|
+
cohort_size = cohort_users.count
|
63
|
+
|
64
|
+
difference_in_days_between_now_and_cohort_start = (today.beginning_of_week - cohort_start.to_date).to_i
|
65
|
+
number_of_weeks_in_this_cohort = difference_in_days_between_now_and_cohort_start / 7
|
66
|
+
|
67
|
+
0.upto(number_of_weeks_in_this_cohort) do |week|
|
68
|
+
retention_week = (cohort_start + week.weeks).beginning_of_week
|
69
|
+
if week == 0
|
70
|
+
@graphs[:retention][cohort_start_label][retention_week] = cohort_size
|
71
|
+
else
|
72
|
+
retention_week_end = (retention_week + 1.week).beginning_of_week
|
73
|
+
|
74
|
+
records_per_user = {}
|
75
|
+
|
76
|
+
retention_models.each do |model|
|
77
|
+
count_per_user = model.where(user_id: cohort_user_ids).where(created_at: retention_week..retention_week_end).group("user_id").count
|
78
|
+
count_per_user.each do |uid, count|
|
79
|
+
records_per_user[uid] ||= 0
|
80
|
+
records_per_user[uid] += count
|
81
|
+
end
|
82
|
+
end
|
44
83
|
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
records_per_user = {}
|
50
|
-
|
51
|
-
retention_models.each do |model|
|
52
|
-
count_per_user = model.where(user_id: cohort_user_ids).where(created_at: retention_month..retention_month_end).group("user_id").count
|
53
|
-
count_per_user.each do |uid, count|
|
54
|
-
records_per_user[uid] ||= 0
|
55
|
-
records_per_user[uid] += count
|
84
|
+
if cohort_user_ids.empty?
|
85
|
+
@graphs[:retention][cohort_start_label][retention_week] = 0
|
86
|
+
else
|
87
|
+
@graphs[:retention][cohort_start_label][retention_week] = records_per_user.keys.size
|
56
88
|
end
|
57
89
|
end
|
58
|
-
|
59
|
-
@graphs[:retention][cohort_start_label][retention_month] = records_per_user.keys.size
|
60
90
|
end
|
61
91
|
end
|
62
92
|
|
63
|
-
|
64
93
|
end
|
65
94
|
end
|
66
95
|
end
|
@@ -24,15 +24,7 @@
|
|
24
24
|
<div class="panel panel-default">
|
25
25
|
<div class="panel-heading">Cohorts</div>
|
26
26
|
<div class="panel-body">
|
27
|
-
<%= @
|
28
|
-
</div>
|
29
|
-
</div>
|
30
|
-
</div>
|
31
|
-
<div class="col-xs-6 col-sm-3">
|
32
|
-
<div class="panel panel-default">
|
33
|
-
<div class="panel-heading">First Cohort</div>
|
34
|
-
<div class="panel-body">
|
35
|
-
<%= @first_cohort %>
|
27
|
+
<%= @number_of_weeks %> weeks
|
36
28
|
</div>
|
37
29
|
</div>
|
38
30
|
</div>
|
@@ -40,7 +32,7 @@
|
|
40
32
|
<div class="panel panel-default">
|
41
33
|
<div class="panel-heading">Current Cohort</div>
|
42
34
|
<div class="panel-body">
|
43
|
-
<%= @
|
35
|
+
<%= @current_cohort_label %>
|
44
36
|
</div>
|
45
37
|
</div>
|
46
38
|
</div>
|
@@ -61,7 +53,7 @@
|
|
61
53
|
data: @graphs[:activation][:five_activations]
|
62
54
|
},
|
63
55
|
{
|
64
|
-
name: "
|
56
|
+
name: "<= 5 interactions",
|
65
57
|
data: @graphs[:activation][:one_activation]
|
66
58
|
},
|
67
59
|
{
|
@@ -78,7 +70,7 @@
|
|
78
70
|
<h3 class="panel-title">Retention</h3>
|
79
71
|
</div>
|
80
72
|
<div class="panel-body">
|
81
|
-
<%= area_chart(@graphs[:retention].map { |k,v| {name: k, data: v}}, library: { legend: { position: "bottom" } } ) %>
|
73
|
+
<%= area_chart(@graphs[:retention].map { |k,v| {name: k, data: v}}, stacked: true, library: { bar: { groupWidth: "98%" }, legend: { position: "bottom" } } ) %>
|
82
74
|
|
83
75
|
</div>
|
84
76
|
</div>
|
data/lib/retention_magic.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: retention_magic
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.1beta3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michiel Sikkes
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-01-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|