Уменьшение инвентарного цикла - PullRequest
0 голосов
/ 29 сентября 2018

input data.frame picture

output data

У меня есть фрейм данных о заказах, который я пытаюсь уменьшить запасы по дням.Я начал писать цикл, чтобы уменьшить запасы для каждого типа груза.Для каждого дня заказов есть 6 последующих дней, которые должны покинуть заказы с этого дня (это находится в столбце увольнения).То, что я пытаюсь сделать, это написать цикл, начинающийся с unit_to_ship против ship_capacity (пример - 11/20 имеет 132393 новых юнитов в день, но вместимость корабля 130000).Отпуск 1-5 будет работать, но только около 10 КБ из 13 КБ в 6-й день отгрузки будут отправлены.Хотите написать цикл, который уменьшает инвентарь в каждом order_dt после того, как будет обработан выходной день.Хотелось бы, чтобы выходные данные выглядели как «тестовый» фрейм данных, но также со столбцом unit_remaining (пример: ~ 3k, которые не отправляются).

вот мой код:

order_dt <- c("43424", "43425", "43426", "43427", "43428", "43429", "43430",
           "43431", "43432", "43433", "43434", "43435", "43436", "43437",
           "43438", "43439", "43440", "43441")
new_units_proj <- c(132993, 408989, 584165, 710695, 654237, 353607, 
                    469608, 433387, 93930, 143648, 167652, 164357, 
                    162038, 151675, 180338, 186996, 172749, 150275)
ship_capacity <- c(130000, 160000, 300000, 340000, 375000, 375000, 375000, 
                   375000, 375000, 375000, 375000, 375000, 375000, 325000, 
                   160000, 170000, 168000, 173000)
inputs <- cbind(order_dt, new_units_proj, ship_capacity)
inputs <- data.table(inputs)
inputs <- inputs %>% 
  .[, 
    `:=` (order_dt = as.numeric(order_dt), 
          new_units_proj = as.numeric(new_units_proj), 
          ship_capacity = as.numeric(ship_capacity))] %>% 
  .[, order_dt := as.Date(inputs$order_dt, origin = '1899-12-30')]

leave_day <- data.frame(leave_day = 1:6, 
                        pct_out = c(.15, .33, .16, .11, .15, .1))
leave_day <- data.table(leave_day)

cross.join <- function(a, b) {
  idx <- expand.grid(seq(length=nrow(a)), seq(length=nrow(b)))
  cbind(a[idx[,1],], b[idx[,2],])
}

orders <- cross.join(inputs, leave_day)
orders <- orders %>% arrange(order_dt)
orders <- orders %>% 
  mutate(units_to_ship = round(pct_out * new_units_proj))
test <- orders %>% 
  filter(order_dt == as.Date('2018-11-20')) %>% 
  mutate(remaining_capacity = NA, new_capacity = NA) %>% 
  select(order_dt, new_units_proj, leave_day, pct_out, units_to_ship, 
         ship_capacity, remaining_capacity, new_capacity) %>% 
  mutate(remaining_capacity = ship_capacity - units_to_ship) %>%
  mutate(new_capacity = lag(remaining_capacity, n = 1) - units_to_ship)


test <- orders %>% 
  filter(order_dt == as.Date('2018-11-20'))

for(i in 1:nrow(test)){ 

  test$new_cap <- test$ship_capacity - test$units_to_ship
}

#suppressWarnings(
for (i in 1:nrow(test)){

  test$remaining_capacity = test$ship_capacity - test$units_to_ship

  if(i == nrow(test)){
    test$ship_capacity[i] <- test$remaining_capacity[i]
  } else
    test$ship_capacity[i + 1] <- test$remaining_capacity[i]

  if(test$units_to_ship <= test$ship_capacity){
    test$shipped_actual <- test$units_to_ship
  } else
    test$leftover_units <- test$units_to_ship - test$remaining_capacity

}
#)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...