averageOrderValueArray = {
const revenueAndOrdersByStoreAndDay = daily_orders.reduce((acc, { store_id, order_date, revenue, orders }) => {
const key = `${store_id}-${order_date}`;
if (!acc[key]) {
acc[key] = { store_id, order_date, totalRevenue: 0, totalOrders: 0 };
}
acc[key].totalRevenue += revenue;
acc[key].totalOrders += orders;
return acc;
}, {});
const averageOrderValueArray = Object.values(revenueAndOrdersByStoreAndDay).map(({ store_id, order_date, totalRevenue, totalOrders }) => ({
store_id,
order_date,
averageOrderValue: totalOrders ? totalRevenue / totalOrders : 0,
totalOrders: totalOrders,
totalRevenue: totalRevenue
}));
return averageOrderValueArray;
const averageOrderValueByStore = Array.from(d3.group(averageOrderValueArray, d => d.store_id), ([storeId, values]) => {
const totalRevenue = d3.sum(values, d => d.totalRevenue);
const totalOrders = d3.sum(values, d => d.totalOrders);
return {
storeId,
averageOrderValue: totalOrders ? totalRevenue / totalOrders : 0
};
});
return averageOrderValueByStore;
const averageOrderValueByDay = Array.from(d3.group(averageOrderValueArray, d => d.order_date), ([orderDate, values]) => {
const totalRevenue = d3.sum(values, d => d.totalRevenue);
const totalOrders = d3.sum(values, d => d.totalOrders);
return {
orderDate,
averageOrderValue: totalOrders ? totalRevenue / totalOrders : 0
};
});
averageOrderValueByStore.sort((a, b) => a.storeId.localeCompare(b.storeId));
averageOrderValueByDay.sort((a, b) => new Date(a.orderDate) - new Date(b.orderDate));
return averageOrderValueByStore;
};