library(tidyverse)
library(lubridate)
library(completejourney)
transactions <- get_transactions()
dim(transactions)
[1] 1469307      11
promotions <- get_promotions()
dim(promotions)
[1] 20940529        5
# how many transaction do we have demographics on?
transactions %>%
semi_join(demographics, by = "household_id") %>%
tally()

# how many transaction do we NOT have demographics on?
transactions %>%
anti_join(demographics, by = "household_id") %>%
tally()
transactions %>%
inner_join(demographics, by = "household_id") %>%
group_by(age) %>%
summarise(total_sales = sum(sales_value)) %>%
arrange(desc(total_sales))
# Identify households with $1000 or more in total sales
hshld_1000 <- transactions %>%
group_by(household_id) %>%
summarise(total_sales = sum(sales_value, na.rm = TRUE)) %>%
filter(total_sales >= 1000)

# How many of these households do we have demographic data on?
hshld_1000 %>%
semi_join(demographics, by = "household_id") %>%
tally()

# How many do we not have demographic on?
hshld_1000 %>%
anti_join(demographics, by = "household_id") %>%
tally()

# Which income range produces the most households that spend \$1000 or more?
hshld_1000 %>%
inner_join(demographics, by = "household_id") %>%
count(income, sort = TRUE)
# join transactions and filtered promotions data
front_display_trans <- promotions %>%
filter(display_location == 1) %>%
inner_join(transactions, by = c('product_id', 'store_id', 'week'))

# total sales for all products displayed in the front of the store
front_display_trans %>%
summarize(total_sales = sum(sales_value, na.rm = TRUE))

# Identify the product displayed in the front of the store that had the largest total sales
front_display_trans %>%
group_by(product_id) %>%
summarize(total_front_display_sales = sum(sales_value, na.rm = TRUE)) %>%
arrange(desc(total_front_display_sales))
coupons %>%
filter(campaign_id == 18, coupon_upc == 10000089238) %>%
inner_join(products, by = "product_id")
#Identify all products that contain pizza in product_type description
pizza <- products %>%
  filter(str_detect(product_type, regex("pizza", ignore_case = TRUE))) %>%
  distinct(product_id, product_type)

#Which of these products produces the greatest amount of total sales
pizza_sales <- transactions %>%
  inner_join(pizza, by = "product_id") %>%
  group_by(product_id, product_type) %>%
  summarise(total_sales = sum(sales_value, na.rm = TRUE), .groups = "drop") %>%
  arrange(desc(total_sales))

pizza_sales
relevant_products <- products %>%
filter(
str_detect(product_category, regex("pizza", ignore_case = TRUE)),
str_detect(product_type, regex("snack|appetizer", ignore_case = TRUE))
)

relevant_products %>%
inner_join(transactions, by = 'product_id') %>%
group_by(product_id) %>%
summarise(total_qty = sum(quantity)) %>%
arrange(desc(total_qty))
pb <- products %>%
filter(str_detect(product_type, regex("peanut butter", ignore_case = TRUE)))
tally(pb)

pb %>%
inner_join(transactions, by = "product_id") %>%
group_by(month = month(transaction_timestamp, label = TRUE)) %>%
summarize(total_sales = sum(sales_value, na.rm = TRUE)) %>%
arrange(desc(total_sales))
coupon_redemptions %>%
  filter(campaign_id == 18, coupon_upc == 10000085475) %>%
  distinct(household_id) %>%
  tally(name = "n_households")

coupon_redemptions %>%
  filter(campaign_id == 18, coupon_upc == 10000085475) %>%
  inner_join(transactions, by = "household_id") %>%
  filter(yday(transaction_timestamp) == yday(redemption_date)) %>%
  summarise(total_sales = sum(sales_value, na.rm = TRUE))
coupon_redemptions %>%
  filter(campaign_id == 18, coupon_upc == 10000085475) %>%
  distinct(household_id, campaign_id, coupon_upc, redemption_date, .keep_all = TRUE) %>%
  inner_join(
    coupons %>% distinct(campaign_id, coupon_upc, product_id, .keep_all = TRUE),
    by = c("campaign_id", "coupon_upc"),
    relationship = "many-to-many"   # silence expected many-to-many warning (dplyr ≥ 1.1)
  ) %>%
  inner_join(products, by = "product_id") %>%
  filter(str_detect(product_category, regex("vegetables", ignore_case = TRUE))) %>%
  inner_join(transactions, by = c("household_id", "product_id")) %>%
  filter(yday(transaction_timestamp) == yday(redemption_date)) %>%  # use yday as requested
  group_by(product_type) %>%
  summarise(total_sales = sum(sales_value, na.rm = TRUE), .groups = "drop") %>%
  arrange(desc(total_sales))
LS0tDQp0aXRsZTogIk1vZHVsZSA0IExhYiINCmF1dGhvcjogVHluYW4gU2FuZGVyDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpgYGB7cn0NCmxpYnJhcnkodGlkeXZlcnNlKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KGNvbXBsZXRlam91cm5leSkNCnRyYW5zYWN0aW9ucyA8LSBnZXRfdHJhbnNhY3Rpb25zKCkNCmRpbSh0cmFuc2FjdGlvbnMpDQoNCnByb21vdGlvbnMgPC0gZ2V0X3Byb21vdGlvbnMoKQ0KZGltKHByb21vdGlvbnMpDQpgYGANCg0KMS4NCmBgYHtyfQ0KIyBob3cgbWFueSB0cmFuc2FjdGlvbiBkbyB3ZSBoYXZlIGRlbW9ncmFwaGljcyBvbj8NCnRyYW5zYWN0aW9ucyAlPiUNCnNlbWlfam9pbihkZW1vZ3JhcGhpY3MsIGJ5ID0gImhvdXNlaG9sZF9pZCIpICU+JQ0KdGFsbHkoKQ0KDQojIGhvdyBtYW55IHRyYW5zYWN0aW9uIGRvIHdlIE5PVCBoYXZlIGRlbW9ncmFwaGljcyBvbj8NCnRyYW5zYWN0aW9ucyAlPiUNCmFudGlfam9pbihkZW1vZ3JhcGhpY3MsIGJ5ID0gImhvdXNlaG9sZF9pZCIpICU+JQ0KdGFsbHkoKQ0KYGBgDQoNCjIuDQpgYGB7cn0NCnRyYW5zYWN0aW9ucyAlPiUNCmlubmVyX2pvaW4oZGVtb2dyYXBoaWNzLCBieSA9ICJob3VzZWhvbGRfaWQiKSAlPiUNCmdyb3VwX2J5KGFnZSkgJT4lDQpzdW1tYXJpc2UodG90YWxfc2FsZXMgPSBzdW0oc2FsZXNfdmFsdWUpKSAlPiUNCmFycmFuZ2UoZGVzYyh0b3RhbF9zYWxlcykpDQpgYGANCg0KMy4NCmBgYHtyfQ0KIyBJZGVudGlmeSBob3VzZWhvbGRzIHdpdGggJDEwMDAgb3IgbW9yZSBpbiB0b3RhbCBzYWxlcw0KaHNobGRfMTAwMCA8LSB0cmFuc2FjdGlvbnMgJT4lDQpncm91cF9ieShob3VzZWhvbGRfaWQpICU+JQ0Kc3VtbWFyaXNlKHRvdGFsX3NhbGVzID0gc3VtKHNhbGVzX3ZhbHVlLCBuYS5ybSA9IFRSVUUpKSAlPiUNCmZpbHRlcih0b3RhbF9zYWxlcyA+PSAxMDAwKQ0KDQojIEhvdyBtYW55IG9mIHRoZXNlIGhvdXNlaG9sZHMgZG8gd2UgaGF2ZSBkZW1vZ3JhcGhpYyBkYXRhIG9uPw0KaHNobGRfMTAwMCAlPiUNCnNlbWlfam9pbihkZW1vZ3JhcGhpY3MsIGJ5ID0gImhvdXNlaG9sZF9pZCIpICU+JQ0KdGFsbHkoKQ0KDQojIEhvdyBtYW55IGRvIHdlIG5vdCBoYXZlIGRlbW9ncmFwaGljIG9uPw0KaHNobGRfMTAwMCAlPiUNCmFudGlfam9pbihkZW1vZ3JhcGhpY3MsIGJ5ID0gImhvdXNlaG9sZF9pZCIpICU+JQ0KdGFsbHkoKQ0KDQojIFdoaWNoIGluY29tZSByYW5nZSBwcm9kdWNlcyB0aGUgbW9zdCBob3VzZWhvbGRzIHRoYXQgc3BlbmQgXCQxMDAwIG9yIG1vcmU/DQpoc2hsZF8xMDAwICU+JQ0KaW5uZXJfam9pbihkZW1vZ3JhcGhpY3MsIGJ5ID0gImhvdXNlaG9sZF9pZCIpICU+JQ0KY291bnQoaW5jb21lLCBzb3J0ID0gVFJVRSkNCmBgYA0KDQo0Lg0KYGBge3J9DQojIGpvaW4gdHJhbnNhY3Rpb25zIGFuZCBmaWx0ZXJlZCBwcm9tb3Rpb25zIGRhdGENCmZyb250X2Rpc3BsYXlfdHJhbnMgPC0gcHJvbW90aW9ucyAlPiUNCmZpbHRlcihkaXNwbGF5X2xvY2F0aW9uID09IDEpICU+JQ0KaW5uZXJfam9pbih0cmFuc2FjdGlvbnMsIGJ5ID0gYygncHJvZHVjdF9pZCcsICdzdG9yZV9pZCcsICd3ZWVrJykpDQoNCiMgdG90YWwgc2FsZXMgZm9yIGFsbCBwcm9kdWN0cyBkaXNwbGF5ZWQgaW4gdGhlIGZyb250IG9mIHRoZSBzdG9yZQ0KZnJvbnRfZGlzcGxheV90cmFucyAlPiUNCnN1bW1hcml6ZSh0b3RhbF9zYWxlcyA9IHN1bShzYWxlc192YWx1ZSwgbmEucm0gPSBUUlVFKSkNCg0KIyBJZGVudGlmeSB0aGUgcHJvZHVjdCBkaXNwbGF5ZWQgaW4gdGhlIGZyb250IG9mIHRoZSBzdG9yZSB0aGF0IGhhZCB0aGUgbGFyZ2VzdCB0b3RhbCBzYWxlcw0KZnJvbnRfZGlzcGxheV90cmFucyAlPiUNCmdyb3VwX2J5KHByb2R1Y3RfaWQpICU+JQ0Kc3VtbWFyaXplKHRvdGFsX2Zyb250X2Rpc3BsYXlfc2FsZXMgPSBzdW0oc2FsZXNfdmFsdWUsIG5hLnJtID0gVFJVRSkpICU+JQ0KYXJyYW5nZShkZXNjKHRvdGFsX2Zyb250X2Rpc3BsYXlfc2FsZXMpKQ0KYGBgDQoNCjUuDQpgYGB7cn0NCmNvdXBvbnMgJT4lDQpmaWx0ZXIoY2FtcGFpZ25faWQgPT0gMTgsIGNvdXBvbl91cGMgPT0gMTAwMDAwODkyMzgpICU+JQ0KaW5uZXJfam9pbihwcm9kdWN0cywgYnkgPSAicHJvZHVjdF9pZCIpDQpgYGANCg0KNi4NCmBgYHtyfQ0KI0lkZW50aWZ5IGFsbCBwcm9kdWN0cyB0aGF0IGNvbnRhaW4gcGl6emEgaW4gcHJvZHVjdF90eXBlIGRlc2NyaXB0aW9uDQpwaXp6YSA8LSBwcm9kdWN0cyAlPiUNCiAgZmlsdGVyKHN0cl9kZXRlY3QocHJvZHVjdF90eXBlLCByZWdleCgicGl6emEiLCBpZ25vcmVfY2FzZSA9IFRSVUUpKSkgJT4lDQogIGRpc3RpbmN0KHByb2R1Y3RfaWQsIHByb2R1Y3RfdHlwZSkNCg0KI1doaWNoIG9mIHRoZXNlIHByb2R1Y3RzIHByb2R1Y2VzIHRoZSBncmVhdGVzdCBhbW91bnQgb2YgdG90YWwgc2FsZXMNCnBpenphX3NhbGVzIDwtIHRyYW5zYWN0aW9ucyAlPiUNCiAgaW5uZXJfam9pbihwaXp6YSwgYnkgPSAicHJvZHVjdF9pZCIpICU+JQ0KICBncm91cF9ieShwcm9kdWN0X2lkLCBwcm9kdWN0X3R5cGUpICU+JQ0KICBzdW1tYXJpc2UodG90YWxfc2FsZXMgPSBzdW0oc2FsZXNfdmFsdWUsIG5hLnJtID0gVFJVRSksIC5ncm91cHMgPSAiZHJvcCIpICU+JQ0KICBhcnJhbmdlKGRlc2ModG90YWxfc2FsZXMpKQ0KDQpwaXp6YV9zYWxlcw0KYGBgDQoNCjcuDQpgYGB7cn0NCnJlbGV2YW50X3Byb2R1Y3RzIDwtIHByb2R1Y3RzICU+JQ0KZmlsdGVyKA0Kc3RyX2RldGVjdChwcm9kdWN0X2NhdGVnb3J5LCByZWdleCgicGl6emEiLCBpZ25vcmVfY2FzZSA9IFRSVUUpKSwNCnN0cl9kZXRlY3QocHJvZHVjdF90eXBlLCByZWdleCgic25hY2t8YXBwZXRpemVyIiwgaWdub3JlX2Nhc2UgPSBUUlVFKSkNCikNCg0KcmVsZXZhbnRfcHJvZHVjdHMgJT4lDQppbm5lcl9qb2luKHRyYW5zYWN0aW9ucywgYnkgPSAncHJvZHVjdF9pZCcpICU+JQ0KZ3JvdXBfYnkocHJvZHVjdF9pZCkgJT4lDQpzdW1tYXJpc2UodG90YWxfcXR5ID0gc3VtKHF1YW50aXR5KSkgJT4lDQphcnJhbmdlKGRlc2ModG90YWxfcXR5KSkNCmBgYA0KDQo4Lg0KYGBge3J9DQpwYiA8LSBwcm9kdWN0cyAlPiUNCmZpbHRlcihzdHJfZGV0ZWN0KHByb2R1Y3RfdHlwZSwgcmVnZXgoInBlYW51dCBidXR0ZXIiLCBpZ25vcmVfY2FzZSA9IFRSVUUpKSkNCnRhbGx5KHBiKQ0KDQpwYiAlPiUNCmlubmVyX2pvaW4odHJhbnNhY3Rpb25zLCBieSA9ICJwcm9kdWN0X2lkIikgJT4lDQpncm91cF9ieShtb250aCA9IG1vbnRoKHRyYW5zYWN0aW9uX3RpbWVzdGFtcCwgbGFiZWwgPSBUUlVFKSkgJT4lDQpzdW1tYXJpemUodG90YWxfc2FsZXMgPSBzdW0oc2FsZXNfdmFsdWUsIG5hLnJtID0gVFJVRSkpICU+JQ0KYXJyYW5nZShkZXNjKHRvdGFsX3NhbGVzKSkNCmBgYA0KDQo5Lg0KYGBge3J9DQpjb3Vwb25fcmVkZW1wdGlvbnMgJT4lDQogIGZpbHRlcihjYW1wYWlnbl9pZCA9PSAxOCwgY291cG9uX3VwYyA9PSAxMDAwMDA4NTQ3NSkgJT4lDQogIGRpc3RpbmN0KGhvdXNlaG9sZF9pZCkgJT4lDQogIHRhbGx5KG5hbWUgPSAibl9ob3VzZWhvbGRzIikNCg0KY291cG9uX3JlZGVtcHRpb25zICU+JQ0KICBmaWx0ZXIoY2FtcGFpZ25faWQgPT0gMTgsIGNvdXBvbl91cGMgPT0gMTAwMDAwODU0NzUpICU+JQ0KICBpbm5lcl9qb2luKHRyYW5zYWN0aW9ucywgYnkgPSAiaG91c2Vob2xkX2lkIikgJT4lDQogIGZpbHRlcih5ZGF5KHRyYW5zYWN0aW9uX3RpbWVzdGFtcCkgPT0geWRheShyZWRlbXB0aW9uX2RhdGUpKSAlPiUNCiAgc3VtbWFyaXNlKHRvdGFsX3NhbGVzID0gc3VtKHNhbGVzX3ZhbHVlLCBuYS5ybSA9IFRSVUUpKQ0KYGBgDQoNCjEwLg0KYGBge3J9DQpjb3Vwb25fcmVkZW1wdGlvbnMgJT4lDQogIGZpbHRlcihjYW1wYWlnbl9pZCA9PSAxOCwgY291cG9uX3VwYyA9PSAxMDAwMDA4NTQ3NSkgJT4lDQogIGRpc3RpbmN0KGhvdXNlaG9sZF9pZCwgY2FtcGFpZ25faWQsIGNvdXBvbl91cGMsIHJlZGVtcHRpb25fZGF0ZSwgLmtlZXBfYWxsID0gVFJVRSkgJT4lDQogIGlubmVyX2pvaW4oDQogICAgY291cG9ucyAlPiUgZGlzdGluY3QoY2FtcGFpZ25faWQsIGNvdXBvbl91cGMsIHByb2R1Y3RfaWQsIC5rZWVwX2FsbCA9IFRSVUUpLA0KICAgIGJ5ID0gYygiY2FtcGFpZ25faWQiLCAiY291cG9uX3VwYyIpLA0KICAgIHJlbGF0aW9uc2hpcCA9ICJtYW55LXRvLW1hbnkiICAgIyBzaWxlbmNlIGV4cGVjdGVkIG1hbnktdG8tbWFueSB3YXJuaW5nIChkcGx5ciDiiaUgMS4xKQ0KICApICU+JQ0KICBpbm5lcl9qb2luKHByb2R1Y3RzLCBieSA9ICJwcm9kdWN0X2lkIikgJT4lDQogIGZpbHRlcihzdHJfZGV0ZWN0KHByb2R1Y3RfY2F0ZWdvcnksIHJlZ2V4KCJ2ZWdldGFibGVzIiwgaWdub3JlX2Nhc2UgPSBUUlVFKSkpICU+JQ0KICBpbm5lcl9qb2luKHRyYW5zYWN0aW9ucywgYnkgPSBjKCJob3VzZWhvbGRfaWQiLCAicHJvZHVjdF9pZCIpKSAlPiUNCiAgZmlsdGVyKHlkYXkodHJhbnNhY3Rpb25fdGltZXN0YW1wKSA9PSB5ZGF5KHJlZGVtcHRpb25fZGF0ZSkpICU+JSAgIyB1c2UgeWRheSBhcyByZXF1ZXN0ZWQNCiAgZ3JvdXBfYnkocHJvZHVjdF90eXBlKSAlPiUNCiAgc3VtbWFyaXNlKHRvdGFsX3NhbGVzID0gc3VtKHNhbGVzX3ZhbHVlLCBuYS5ybSA9IFRSVUUpLCAuZ3JvdXBzID0gImRyb3AiKSAlPiUNCiAgYXJyYW5nZShkZXNjKHRvdGFsX3NhbGVzKSkNCmBgYA0K