Public
Edited
Jan 7, 2024
Insert cell
Insert cell
Insert cell
Insert cell
daily_orders_product
SELECT * FROM "daily_orders_product"
Insert cell
daily_orders
SELECT * FROM "daily_orders"
Insert cell
stores
SELECT * FROM "stores"
Insert cell
Insert cell
function getWeek(date, dowOffset = 1) {
const newYear = new Date(date.getFullYear(), 0, 1);
let day = newYear.getDay() - dowOffset; //the day of week the year begins on
day = day >= 0 ? day : day + 7;
const daynum =
Math.floor(
(date.getTime() -
newYear.getTime() -
(date.getTimezoneOffset() - newYear.getTimezoneOffset()) * 60000) /
86400000
) + 1;
//if the year starts before the middle of a week
if (day < 4) {
const weeknum = Math.floor((daynum + day - 1) / 7) + 1;
if (weeknum > 52) {
const nYear = new Date(date.getFullYear() + 1, 0, 1);
let nday = nYear.getDay() - dowOffset;
nday = nday >= 0 ? nday : nday + 7;
/*if the next year starts before the middle of
the week, it is week #1 of that year*/
return nday < 4 ? 1 : 53;
}
return weeknum;
} else {
return Math.floor((daynum + day - 1) / 7);
}
}
Insert cell
function get_orders_pizza(year_orders_product) {
const ordersByPizza = {};

year_orders_product.forEach(pizza => {
if (!ordersByPizza[pizza.name]) {
ordersByPizza[pizza.name] = 0;
}
ordersByPizza[pizza.name] += pizza.orders;
});

return Object.entries(ordersByPizza).map(([name, totalOrders]) => ({ name, totalOrders }));
}
Insert cell
Insert cell
orders_pizza_year = {
daily_orders_product.forEach(pizza => {
pizza["year"] = pizza["order_date"].getFullYear();
});

return daily_orders_product;
}
Insert cell
daily_orders_product_with_year = d3.group(orders_pizza_year, d => d.order_date.getFullYear());
Insert cell
Insert cell
year_orders_product_sorted_2020 = daily_orders_product_with_year.get(2020);
Insert cell
orders_pizza_2020 = get_orders_pizza(year_orders_product_sorted_2020);
Insert cell
orders_pizza_sorted_2020 = orders_pizza_2020.sort((a, b) => a.totalOrders - b.totalOrders);
Insert cell
least_ordered_pizzas_2020 = orders_pizza_sorted_2020.slice(0, num_low_tendencies);
Insert cell
names_2020 = least_ordered_pizzas_2020.map(pizza => pizza.name);
Insert cell
least_ordered_pizzas_name_2020 = names_2020.join(', ');
Insert cell
Insert cell
year_orders_product_sorted_2021 = daily_orders_product_with_year.get(2021);
Insert cell
orders_pizza_2021 = get_orders_pizza(year_orders_product_sorted_2021);
Insert cell
orders_pizza_sorted_2021 = orders_pizza_2021.sort((a, b) => a.totalOrders - b.totalOrders);
Insert cell
least_ordered_pizzas_2021 = orders_pizza_sorted_2021.slice(0, num_low_tendencies);
Insert cell
names_2021 = least_ordered_pizzas_2021.map(pizza => pizza.name);
Insert cell
least_ordered_pizzas_name_2021 = names_2021.join(', ');
Insert cell
Insert cell
year_orders_product_sorted_2022 = daily_orders_product_with_year.get(2022);
Insert cell
orders_pizza_2022 = get_orders_pizza(year_orders_product_sorted_2022);
Insert cell
orders_pizza_sorted_2022 = orders_pizza_2022.sort((a, b) => a.totalOrders - b.totalOrders);
Insert cell
least_ordered_pizzas_2022 = orders_pizza_sorted_2022.slice(0, num_low_tendencies);
Insert cell
names_2022 = least_ordered_pizzas_2022.map(pizza => pizza.name);
Insert cell
least_ordered_pizzas_name_2022 = names_2022.join(', ');
Insert cell
Insert cell
daily_orders_product_week = {
const week_list = [];
daily_orders_product.forEach(value => {
const num_week = getWeek(value.order_date);
const new_value = value;
value["num_week"] = num_week;
week_list.push(new_value);
})
return week_list;
}
Insert cell
daily_orders_product_year = d3.group(daily_orders_product_week, d => d.order_date.getFullYear());
Insert cell
year_orders_product = daily_orders_product_year.get(year);
Insert cell
group_orders_product_num_week = d3.group(year_orders_product, d => d.num_week);
Insert cell
nums_week = [...group_orders_product_num_week.keys()];
Insert cell
week_order_product = group_orders_product_num_week.get(num_week);
Insert cell
orders_pizza_week = get_orders_pizza(week_order_product);
Insert cell
orders_pizza_week_sort = orders_pizza_week.sort((a, b) => b.totalOrders - a.totalOrders);
Insert cell
best_pizza_week = orders_pizza_week_sort[0];
Insert cell
dates_week = week_order_product.map(order => order.order_date);
Insert cell
week_order_product_sorted = week_order_product.sort((a, b) => a.orders - b.orders);
Insert cell
dates_week_str = {
const minDate = new Date(Math.min(...dates_week));
const maxDate = new Date(Math.max(...dates_week));
return "The best seller pizza in the week of " + minDate.toISOString().split('T')[0].replace(/-/g, '/') + " to " + maxDate.toISOString().split('T')[0].replace(/-/g, '/') + " is: " + best_pizza_week.name + " with " + best_pizza_week.totalOrders + " orders";
}
Insert cell
Insert cell
Insert cell
viewof num_low_tendencies = Inputs.range([1, 20], {value: 10, step: 1, label: "Select num of the least ordered pizzas to plot:"});
Insert cell
Insert cell
Plot.plot({
width: width,
inset: 10,
color: {scheme: "BuRd"},
marks: [
Plot.dot(year_orders_product_sorted_2020.filter(d => names_2020.includes(d.name)), {
x: "order_date",
y: "orders",
stroke: "name",
tip: true
}),
]
})
Insert cell
Insert cell
Plot.plot({
width: width,
inset: 10,
color: {scheme: "BuRd"},
marks: [
Plot.dot(year_orders_product_sorted_2021.filter(d => names_2021.includes(d.name)), {
x: "order_date",
y: "orders",
stroke: "name",
tip: true
}),
]
})
Insert cell
Insert cell
Plot.plot({
width: width,
inset: 10,
color: {scheme: "BuRd"},
marks: [
Plot.dot(year_orders_product_sorted_2022.filter(d => names_2022.includes(d.name)), {
x: "order_date",
y: "orders",
stroke: "name",
tip: true
}),
]
})
Insert cell
Insert cell
viewof year = Inputs.range([2020, 2022], {value: 2021, step: 1, label: "Select year to plot:"})
Insert cell
viewof num_week = Inputs.range([nums_week[0], nums_week[nums_week.length-1]], {value: nums_week[nums_week.length/2], step: 1, label: "Select num week to plot:"})
Insert cell
Insert cell
Plot.plot({
width: width,
color: { scheme: "tableau10" },
marks: [
Plot.barY(week_order_product_sorted, {
x: "day_of_week",
y: "orders",
fill: "name",
tip: true
}),
Plot.ruleY([0])
]
})
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more