bitter-lion-34708
02/28/2025, 4:35 PMbitter-lion-34708
02/28/2025, 4:36 PMfunction main() {
// Helper aggregation functions
const sum = (arr) => arr.reduce((sum, x) => sum + x, 0);
const count = (arr) => arr.length;
const countDistinct = (arr) => new Set(arr).size;
const min = (arr) => Math.min(...arr);
const max = (arr) => Math.max(...arr);
const avg = (arr) => count(arr)>0?(sum(arr)/count(arr)):0;
const percentile = (arr, p) => {
const s = [...arr].sort((a,b)=>a-b);
if(!s.length) return 0;
if(p<=0) return s[0];
if(p>=100) return s[arr.length-1];
const r = (s.length-1)*p/100;
const rf = Math.ceil(r) - r;
return s[Math.floor(r)]*rf + s[Math.ceil(r)]*(1-rf);
};
const median = (arr) => percentile(arr, 50);
// [Test] Purchase revenue
function isMetric(event) {
return event.name === "web_purchase";
}
// Last 90 days - Metric value ([Test] Purchase revenue )
return Events({
"from_date": "2024-11-30",
"to_date": "2025-03-01",
"event_selectors": [
{
"event": "web_purchase"
}
]
})
.filter(function(event) {
if(isMetric(event)) return true;
return false;
})
// Metric value per user
.groupByUser(function(state, events) {
state = state || {date: null, metricValue: []};
for(var i=0; i<events.length; i++) {
state.date = state.date || events[i].time;
const event = events[i];
if(isMetric(event)) {
state.metricValue.push(event.properties["value"]);
}
}
return state;
})
// Remove users that did not convert
.filter(function(ev) {
return ev.value.date && ev.value.metricValue.length > 0;
})
// Aggregate metric values per user
.map(function(user) {
// Metric - [Test] Purchase revenue
user.value.metricValue = !user.value.metricValue.length ? 0 : (
(values => sum(values))(user.value.metricValue)
);
return user;
})
.reduce([
// Overall summary metrics
mixpanel.reducer.numeric_summary('value.metricValue'),
// Summary metrics by date
(prevs, events) => {
const dates = {};
prevs.forEach(prev => {
prev.dates.forEach(d=>{
dates[d.date] = dates[d.date] || {count:0, sum:0, sum_squares:0};
dates[d.date].count += d.count;
dates[d.date].sum += d.sum;
dates[d.date].sum_squares += d.sum_squares;
})
});
events.forEach(e=>{
const date = (new Date(e.value.date)).toISOString().substr(0,10);
dates[date] = dates[date] || {count:0, sum:0, sum_squares:0};
dates[date].count++;
dates[date].sum += e.value.metricValue;
dates[date].sum_squares += Math.pow(e.value.metricValue, 2);
});
return {
type: "byDate",
dates: Object.keys(dates).map(d => ({
date: d,
...dates[d]
}))
};
}
])
// Transform into easy-to-use objects
.map(vals => vals.map(val => {
if(val.count) return {type: "overall", ...val};
return val;
}));
}
fresh-football-47124
bitter-lion-34708
02/28/2025, 4:37 PMbitter-lion-34708
02/28/2025, 4:38 PMbitter-lion-34708
02/28/2025, 4:38 PMfresh-football-47124
bitter-lion-34708
02/28/2025, 4:39 PMbitter-lion-34708
02/28/2025, 4:41 PMfresh-football-47124
bitter-lion-34708
02/28/2025, 4:42 PMbitter-lion-34708
02/28/2025, 4:43 PMfresh-football-47124
bitter-lion-34708
02/28/2025, 4:45 PMfresh-football-47124
flaky-noon-11399
03/01/2025, 9:41 AM