Trong tập dữ liệu làm việc của tôi, tôi đang cố gắng tính giá trị theo tuần cho các thay đổi về bán buôn và doanh thu. Mã này dường như hoạt động, nhưng ước tính của tôi cho thấy sẽ mất khoảng 75 giờ để chạy một phép tính dường như đơn giản. Dưới đây là phiên bản tái sản xuất generic mất khoảng 2m để chạy trên tập dữ liệu nhỏ này:Tạo tính tuần qua hiệu quả theo tuần với số dư
########################################################################################################################
# MAKE A GENERIC REPORDUCIBLE STACK OVERFLOW QUESTION
########################################################################################################################
# Create empty data frame of 26,000 observations similar to my data, but populated with noise
exampleData <- data.frame(product = rep(LETTERS,1000),
wholesale = rnorm(1000*26),
revenue = rnorm(1000*26))
# create a week_ending column which increases by one week with every set of 26 "products"
for(i in 1:nrow(exampleData)){
exampleData$week_ending[i] <- as.Date("2016-09-04")+7*floor((i-1)/26)
}
exampleData$week_ending <- as.Date(exampleData$week_ending, origin = "1970-01-01")
# create empty columns to fill
exampleData$wholesale_wow <- NA
exampleData$revenue_wow <- NA
# loop through the wholesale and revenue numbers and append the week-over-week changes
for(i in 1:nrow(exampleData)){
# set a condition where the loop only appends the week-over-week values if it's not the first week
if(exampleData$week_ending[i]!="2016-09-04"){
# set temporary values for the current and past week's wholesale value
currentWholesale <- exampleData$wholesale[i]
lastWeekWholesale <- exampleData$wholesale[which(exampleData$product==exampleData$product[i] &
exampleData$week_ending==exampleData$week_ending[i]-7)]
exampleData$wholesale_wow[i] <- currentWholesale/lastWeekWholesale -1
# set temporary values for the current and past week's revenue
currentRevenue <- exampleData$revenue[i]
lastWeekRevenue <- exampleData$revenue[which(exampleData$product==exampleData$product[i] &
exampleData$week_ending==exampleData$week_ending[i]-7)]
exampleData$revenue_wow[i] <- currentRevenue/lastWeekRevenue -1
}
}
Bất kỳ giúp hiểu tại sao điều này phải mất quá lâu hoặc làm thế nào để cắt giảm thời gian sẽ được nhiều đánh giá cao!
Có lẽ không phải là vấn đề chính nhưng ... không phân tích chuỗi thành các ngày trong vòng lặp; chỉ cần lưu một 'd0 = as.Date (" 2016-09-04 ")' ở đâu đó và sử dụng nó. Ngoài ra không '! =' So với chuỗi phải được phân tích cú pháp cho đến ngày. Tôi nghi ngờ phần chính của mã có thể được viết như là một hợp nhất/tham gia thay vì một vòng lặp. – Frank
Điều này có vẻ tốt và có thể tái sản xuất, nhưng (ít nhất là trong tương lai), tôi cũng khuyên bạn nên tạo ** các ví dụ ** tối thiểu. Sẽ dễ dàng hơn nhiều khi kiểm tra dữ liệu ở từng bước để xem điều gì đang xảy ra với, ví dụ: 2 sản phẩm và 4 tuần, hơn 26 sản phẩm và 140 tuần. – Gregor
Cảm ơn bạn đã phản hồi! Tôi không muốn đơn giản hóa, nhưng bạn nói đúng là nó có thể tối giản hơn. Tôi sẽ ghi nhớ điều này trong lần sau. –