Library Import
library(readxl)
library(magrittr)
library(tibble)
library(plyr)
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:plyr':
##
## arrange, count, desc, failwith, id, mutate, rename, summarise,
## summarize
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
library(splusTimeDate)
##
## Attaching package: 'splusTimeDate'
## The following objects are masked from 'package:base':
##
## months, quarters, sort.list, weekdays
library(stringi)
library(lubridate)
##
## Attaching package: 'lubridate'
## The following objects are masked from 'package:splusTimeDate':
##
## days, hms, hours, mdy, minutes, seconds, years
## The following object is masked from 'package:plyr':
##
## here
## The following object is masked from 'package:base':
##
## date
library(zoo)
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
library(xts)
##
## Attaching package: 'xts'
## The following objects are masked from 'package:dplyr':
##
## first, last
library(ggplot2)
library(plotly)
##
## Attaching package: 'plotly'
## The following object is masked from 'package:ggplot2':
##
## last_plot
## The following objects are masked from 'package:plyr':
##
## arrange, mutate, rename, summarise
## The following object is masked from 'package:stats':
##
## filter
## The following object is masked from 'package:graphics':
##
## layout
library(astsa)
library(forecast)
##
## Attaching package: 'forecast'
## The following object is masked from 'package:astsa':
##
## gas
library(Metrics)
##
## Attaching package: 'Metrics'
## The following object is masked from 'package:forecast':
##
## accuracy
library(gtools)
library(reshape2)
library(lattice)
library(caret)
##
## Attaching package: 'caret'
## The following objects are masked from 'package:Metrics':
##
## precision, recall
library(plyr)
library(gbm)
## Loaded gbm 2.1.5
library(bst)
library(tidyr)
##
## Attaching package: 'tidyr'
## The following object is masked from 'package:reshape2':
##
## smiths
## The following object is masked from 'package:magrittr':
##
## extract
library(forecast)
Excel files Import and Data Structure Reshaping
Hdf1=read_excel("C://Users//wchie//OneDrive//Desktop//Arconic Data 1.xlsx",sheet=1)
## Warning in read_fun(path = enc2native(normalizePath(path)), sheet_i =
## sheet, : Expecting date in G4174 / R4174C7: got '1753-01-01'
## Warning in read_fun(path = enc2native(normalizePath(path)), sheet_i =
## sheet, : Expecting date in G10364 / R10364C7: got '1753-01-01'
## Warning in read_fun(path = enc2native(normalizePath(path)), sheet_i =
## sheet, : Expecting date in G10365 / R10365C7: got '1753-01-01'
## Warning in read_fun(path = enc2native(normalizePath(path)), sheet_i =
## sheet, : Expecting date in G22212 / R22212C7: got '1753-01-01'
## Warning in read_fun(path = enc2native(normalizePath(path)), sheet_i =
## sheet, : Expecting date in G35019 / R35019C7: got '1753-01-01'
Hdf1 = Hdf1 %>%
mutate(`Quantity (PCS)` = as.numeric(`Quantity (PCS)`),
`Ship Date Promise` = as.Date(`Ship Date Promise`))
Hdf2=read_excel("C://Users//wchie//OneDrive//Desktop//Arconic Data 2.xlsx",sheet=1)
Hdf2 = Hdf2 %>%
mutate(`Sales Order #` = as.character(`Sales Order #`),
`Line #` = as.character(`Line #`),
`Item Group (Product Family)` = as.character(`Item Group (Product Family)`),
`Ship Date Promise` = as.Date(as.numeric(`Ship Date Promise`),origin = "1899-12-30")) %>%
rename(`Quantity (PCS)` = `Quantity (Pcs)`,`LT at Time of Order (WKS)` = `LT at Time of Order (Wks)`)
## Warning in as.Date(as.numeric(`Ship Date Promise`), origin = "1899-12-30"):
## NAs introduced by coercion
Hdf3=read_excel("C://Users//wchie//OneDrive//Desktop//Arconic Data 3.xlsx",sheet=1)
Hdf3 = Hdf3 %>%
mutate(`Sales Order #` = as.character(`Sales Order #`),
`Line #` = as.character(`Line #`),
`Item Group (Product Family)` = as.character(`Item Group (Product Family)`),
`Ship Date Promise` = as.Date(as.numeric(`Ship Date Promise`),origin = "1899-12-30")) %>%
rename(`Quantity (PCS)` = `Quantity (Pcs)`,`LT at Time of Order (WKS)` = `LT at Time of Order (Wks)`)
## Warning in as.Date(as.numeric(`Ship Date Promise`), origin = "1899-12-30"):
## NAs introduced by coercion
Hdf = bind_rows(list(Hdf1,Hdf2,Hdf3))
OpenOrder_df1=read_excel("C://Users//wchie//OneDrive//Desktop//Arconic Data 1.xlsx",sheet=2)
OpenOrder_df2=read_excel("C://Users//wchie//OneDrive//Desktop//Arconic Data 2.xlsx",sheet=2)
## Warning in read_fun(path = enc2native(normalizePath(path)), sheet_i =
## sheet, : Expecting date in G3497 / R3497C7: got '01/01/1753'
OpenOrder_df2 = OpenOrder_df2 %>%
mutate(`Item Group (Product Family)`=as.character(`Item Group (Product Family)`)) %>%
filter(!is.na(`Ship Date Promise`))
OpenOrder_df3=read_excel("C://Users//wchie//OneDrive//Desktop//Arconic Data 3.xlsx",sheet=2)
## Warning in read_fun(path = enc2native(normalizePath(path)), sheet_i =
## sheet, : Expecting date in E3493 / R3493C5: got 'NULL'
## Warning in read_fun(path = enc2native(normalizePath(path)), sheet_i =
## sheet, : Expecting date in F3493 / R3493C6: got 'NULL'
## Warning in read_fun(path = enc2native(normalizePath(path)), sheet_i =
## sheet, : Expecting date in G3493 / R3493C7: got 'NULL'
glimpse(OpenOrder_df3)
## Observations: 3,492
## Variables: 11
## $ `Customer #` <chr> "354011", "354011", "354011", "9...
## $ `Delivery Address` <chr> "001", "005", "005", "009", "001...
## $ `Sales Order #` <dbl> 273780, 274385, 276086, 267666, ...
## $ `Line #` <dbl> 1, 2, 70, 5, 12, 2, 1, 2, 2, 7, ...
## $ `Order Date` <dttm> 2018-03-02, 2018-03-12, 2018-04...
## $ `Request Date` <dttm> 2018-04-30, 2018-05-14, 2018-06...
## $ `Ship Date Promise` <dttm> 2018-04-30, 2018-05-14, 2018-06...
## $ `Item #` <chr> "BTCW-4U8", "BTCW-4U8", "BTCW-4U...
## $ `Item Group (Product Family)` <dbl> 12354, 12354, 12354, 14372, 1235...
## $ `Quantity (Pcs)` <dbl> 6000, 4000, 4000, 210, 13500, 11...
## $ `LT at Time of Order (Wks)` <dbl> 10, 10, 12, 10, 10, 8, 18, 18, 1...
OpenOrder_df3 = OpenOrder_df3 %>%
mutate(`Item Group (Product Family)` = as.character(`Item Group (Product Family)`)) %>%
rename(`Quantity (PCS)` = `Quantity (Pcs)`,`LT at Time of Order (WKS)` = `LT at Time of Order (Wks)`) %>%
filter(!is.na(`Order Date`))
OpenOrder_df = bind_rows(list(OpenOrder_df1,OpenOrder_df2,OpenOrder_df3))
truck_market_rate1=read_excel("C://Users//wchie//OneDrive//Desktop//Arconic Data 1.xlsx",sheet=3)
truck_market_rate3=read_excel("C://Users//wchie//OneDrive//Desktop//Arconic Data 3.xlsx",sheet=3)
Tool for ARIMA and BaggedETS Models
Forecasting_Model_Function = function(historical_data = NA, openorder_data = NA,Combine_H_O = NA, truck_market_rate =NA, Increase_Sensitivity_ARIMA = TRUE,Item_Group = NA, Item = NA, Delivery_Address = NA,Max_C_Date = FALSE,Max_C_Date_value = "2018-10-01" , Prediction_Terms = 12){
Hdf = historical_data
OpenOrder_df = openorder_data
# Copy the ship Date Actual to the Ship Date Promise's Missing Value #
Hdf = as.data.frame(Hdf)
missing_value_P_list = which(is.na(Hdf$`Ship Date Promise`))
fill_table_A = Hdf[c(which(is.na(Hdf$`Ship Date Promise`))),c("Ship Date Actual")]
for (i in 1:length(missing_value_P_list)){
Hdf[missing_value_P_list[[i]],c("Ship Date Promise")] = fill_table_A[[i]]
}
Hdf = as.tibble(Hdf)
# OpenOrder data need to be fixed #
OpenOrder_df=na.omit(OpenOrder_df)
# Date Transformation and handling missing value #
New_Hdf = Hdf %>% mutate(Order_Date = ymd(`Order Date`),
Order_Date_year = year(`Order Date`),
Order_Date_month = month(`Order Date`),
`LT at Time of Order (WKS)` =replace(`LT at Time of Order (WKS)`, is.na(`LT at Time of Order (WKS)`),mean(`LT at Time of Order (WKS)`, na.rm=T)))
sapply(New_Hdf,function(x) sum(is.na(x)))
# filling Missing value of ship date actual for OpenOrder Data by using ship date promise
New_Hdf[setdiff(names(OpenOrder_df), names(New_Hdf))] <- NA
OpenOrder_df[setdiff(names(New_Hdf), names(OpenOrder_df))] <- NA
H_Open_df = rbind(New_Hdf, OpenOrder_df)
H_Open_df = as.data.frame(H_Open_df)
missing_value_A_list = which(is.na(H_Open_df$`Ship Date Actual`))
fill_table_P = H_Open_df[c(which(is.na(H_Open_df$`Ship Date Actual`))),c("Ship Date Promise")]
for (i in 1:length(missing_value_A_list)){
H_Open_df[missing_value_A_list[[i]],c("Ship Date Actual")] = fill_table_P[[i]]
}
H_Open_df = as.tibble(H_Open_df)
# Identify the Combine_H_O
if (isTRUE(Combine_H_O)){
select_sample_df = H_Open_df
}
else{
select_sample_df = New_Hdf
}
#Identify the parameters are TRUE or FALSE#
if(!is.na(Item_Group) & is.na(Item) & is.na(Delivery_Address)){
sample_df <- select_sample_df %>%
filter(`Item Group (Product Family)`== Item_Group)
}
else if(!is.na(Item_Group) & !is.na(Item) & is.na(Delivery_Address)){
sample_df <- select_sample_df %>%
filter(`Item Group (Product Family)`== Item_Group,`Item #`==Item)
}
else if(!is.na(Item_Group) & !is.na(Item) & !is.na(Delivery_Address)){
sample_df <- select_sample_df %>%
filter(`Item Group (Product Family)`== Item_Group,`Item #`==Item,`Delivery Address`==Delivery_Address)
}
else{
print("You should at least fill Item_Group or Item out, then the machine could be work.")
}
# Starting to filter out the data we want #
sample_df <- sample_df %>%
mutate(`Order Date` = as.Date(`Order Date`),
`Quantity (PCS)` = as.integer(`Quantity (PCS)`),
diff_Promise_Order_days = difftime(`Ship Date Promise`,`Order Date`,units = c('days')),
diff_Actual_Promise_days = difftime(`Ship Date Actual`,`Ship Date Promise`,units = c('days')),
diff_Actual_Order_days = difftime(`Ship Date Actual`,`Order Date`, units = c('days'))) %>%
arrange(`Order Date`) %>%
select(`Order Date`,diff_Promise_Order_days,diff_Actual_Promise_days,diff_Actual_Order_days,`Quantity (PCS)`,`LT at Time of Order (WKS)`) %>%
group_by(`Order Date` = floor_date(`Order Date`, unit="month")) %>%
summarise(sumQuantity = sum(`Quantity (PCS)`),
avg_diff_Promise_Order_days=mean(diff_Promise_Order_days),
avg_diff_Actual_Promise_days=mean(diff_Actual_Promise_days),
avg_diff_Actual_Order_days=mean(diff_Actual_Order_days),
`avg LT at Time of Order (WKS)`=mean(`LT at Time of Order (WKS)`))
if (isTRUE(Max_C_Date)){
sample_df = sample_df %>%
complete(`Order Date` = seq.Date(min(`Order Date`),max(`Order Date`),by='month')) %>%
na.replace(.,0) %>%
filter(`Order Date` <= as.Date(Max_C_Date_value))
}
else{
sample_df = sample_df %>%
complete(`Order Date` = seq.Date(min(`Order Date`),max(as.Date(Max_C_Date_value)),by='month')) %>%
na.replace(.,0) %>%
filter(`Order Date` <= as.Date(Max_C_Date_value))
}
sample_df = sample_df %>%
mutate(Demand_rate = abs(sumQuantity-lag(sumQuantity)),
`Safety Stock Level` = Demand_rate*as.numeric(avg_diff_Promise_Order_days)/30,
Inventory_Level = sumQuantity*abs(as.numeric(`avg LT at Time of Order (WKS)`)*7/28-(as.numeric(`avg LT at Time of Order (WKS)`)*7)%/%28))
sample_df1 = sample_df
# Time Series Plot #
sample_df = as.tibble(as.data.frame(sample_df))
p1 = list()
p1[[1]] = sample_df %>% plot_ly() %>%
add_trace(x= ~`Order Date`,y= ~sumQuantity,name="sumQuantity",type='scatter', mode='lines') %>%
#add_trace(x= ~`Order Date`,y= ~`Safety Stock Level`,name="High Inventory Level",type='scatter', mode='lines') %>%
add_trace(x= ~`Order Date`,y= ~Inventory_Level,name="Inventory Level",type='scatter', mode='lines') %>%
layout(title='Historical Plot')
p1[[2]] = sample_df %>% plot_ly() %>%
add_lines(x= ~`Order Date`, y= ~avg_diff_Actual_Promise_days, name="diff_A_P_days")
p1[[3]] = sample_df %>% plot_ly() %>%
add_lines(x= ~`Order Date`, y= ~avg_diff_Promise_Order_days, name="diff_P_O_days")
p1[[4]] = sample_df %>% plot_ly() %>%
add_lines(x= ~`Order Date`, y= ~`avg LT at Time of Order (WKS)`, name="Avg LT of Order (WKS)")
# xts Transformation
ts_Demand_sample_df = ts(sample_df$sumQuantity,start = c(year(min(sample_df$`Order Date`)),month(min(sample_df$`Order Date`))), frequency = 12)
# ARIMA Model #
if (isTRUE(Increase_Sensitivity_ARIMA)){
arima_ts = auto.arima(ts_Demand_sample_df, D=1)
}
else{
arima_ts = auto.arima(ts_Demand_sample_df)
}
# BaggedETS Model
bagg_model = baggedETS(ts_Demand_sample_df)
bagged_aic_list = list()
for (i in 1:length(bagg_model$models)){
bagged_aic_list=append(bagged_aic_list,as.numeric(bagg_model$models[[i]]$aic))
}
if(arima_ts$aic < bagg_model$models[[which.min(bagged_aic_list)]]$aic){
f_arima_ts <- forecast(arima_ts, level = c(80,95), h = Prediction_Terms)
#print(f_arima_ts$mean)
forecasting_table = as.tibble(data.frame(`Order Date`=as.Date(f_arima_ts$mean), sumQuantity=as.matrix(f_arima_ts$mean)))
His_table = sample_df %>%
select(`Order Date`,sumQuantity,`avg LT at Time of Order (WKS)`)
forecasting_table = forecasting_table %>%
rename(`Order Date` = Order.Date) %>%
filter(`Order Date` > tail(His_table$`Order Date`,1))
# Linear Regression #
Linear_Model = lm(`avg LT at Time of Order (WKS)`~poly(sumQuantity,2), data = sample_df1)
new_demand = data.frame(sumQuantity = forecasting_table$sumQuantity)
forecasting_D_P_O_table = data.frame(avg_LT_at_Time_of_Order = predict(Linear_Model, new_demand))
forecasting_table = cbind(forecasting_table,forecasting_D_P_O_table$avg_LT_at_Time_of_Order)
forecasting_table = forecasting_table %>%
rename(`avg LT at Time of Order (WKS)` = `forecasting_D_P_O_table$avg_LT_at_Time_of_Order`)
Full_table = rbind(His_table,forecasting_table)
Full_table = Full_table %>%
mutate(Inventory_Level = sumQuantity*abs(as.numeric(`avg LT at Time of Order (WKS)`)*7/28-(as.numeric(`avg LT at Time of Order (WKS)`)*7)%/%28))
Full_table %>%
filter(`Order Date` > tail(His_table$`Order Date`,1)) %>%
print()
# Time Series Plot #
Full_table = as.tibble(as.data.frame(Full_table))
p2 = list()
p2[[1]] = Full_table %>% plot_ly() %>%
add_trace(x= ~`Order Date`,y= ~sumQuantity,name="sumQuantity",type='scatter', mode='lines') %>%
add_trace(x= ~`Order Date`,y= ~Inventory_Level,name="Inventory Level",type='scatter', mode='lines')%>%
layout(title='Forecasting Plot')
p2[[2]] = Full_table %>% plot_ly() %>%
add_lines(x= ~`Order Date`, y= ~`avg LT at Time of Order (WKS)`, name="avg LT of Order (WKS)")
return(list(autoplot(f_arima_ts),subplot(p1,nrows=4),subplot(p2,nrows=2)))
}
else{
# BaggedETS Model #
f_bagg_ts = forecast(bagg_model, h = Prediction_Terms)
forecasting_table = as.tibble(data.frame(`Order Date`=as.Date(f_bagg_ts$mean), sumQuantity=as.matrix(f_bagg_ts$mean)))
His_table = sample_df %>%
select(`Order Date`,sumQuantity,`avg LT at Time of Order (WKS)`)
forecasting_table = forecasting_table %>%
rename(`Order Date` = Order.Date) %>%
filter(`Order Date` > tail(His_table$`Order Date`,1))
# Linear Regression #
Linear_Model = lm(`avg LT at Time of Order (WKS)`~poly(sumQuantity,2), data = sample_df1)
new_demand = data.frame(sumQuantity = forecasting_table$sumQuantity)
forecasting_D_P_O_table = data.frame(avg_LT_at_Time_of_Order = predict(Linear_Model, new_demand))
forecasting_table = cbind(forecasting_table,forecasting_D_P_O_table$avg_LT_at_Time_of_Order)
forecasting_table = forecasting_table %>%
rename(`avg LT at Time of Order (WKS)` = `forecasting_D_P_O_table$avg_LT_at_Time_of_Order`)
Full_table = rbind(His_table,forecasting_table)
Full_table = Full_table %>%
mutate(Inventory_Level = sumQuantity*abs(as.numeric(`avg LT at Time of Order (WKS)`)*7/28-(as.numeric(`avg LT at Time of Order (WKS)`)*7)%/%28))
Full_table %>%
filter(`Order Date` > tail(His_table$`Order Date`,1)) %>%
print()
# Time Series Plot #
Full_table = as.tibble(as.data.frame(Full_table))
p2 = list()
p2[[1]] = Full_table %>% plot_ly() %>%
add_trace(x= ~`Order Date`,y= ~sumQuantity,name="sumQuantity",type='scatter', mode='lines') %>%
add_trace(x= ~`Order Date`,y= ~Inventory_Level,name="Inventory Level",type='scatter', mode='lines')%>%
layout(title='Forecasting Plot')
p2[[2]] = Full_table %>% plot_ly() %>%
add_lines(x= ~`Order Date`, y= ~`avg LT at Time of Order (WKS)`, name="avg LT of Order (WKS)")
return(list(autoplot(f_bagg_ts),subplot(p1,nrows=4),subplot(p2,nrows=2)))
}
}
Tool for Neuroal Network Time Series
Forecasting_nn_Model_Function = function(historical_data = NA, openorder_data = NA,Combine_H_O = NA, truck_market_rate =NA,Item_Group = NA, Item = NA, Delivery_Address = NA,Max_C_Date = FALSE,Max_C_Date_value = "2018-10-01" , Prediction_Terms = 12){
Hdf = historical_data
OpenOrder_df = openorder_data
# Copy the ship Date Actual to the Ship Date Promise's Missing Value #
Hdf = as.data.frame(Hdf)
missing_value_P_list = which(is.na(Hdf$`Ship Date Promise`))
fill_table_A = Hdf[c(which(is.na(Hdf$`Ship Date Promise`))),c("Ship Date Actual")]
for (i in 1:length(missing_value_P_list)){
Hdf[missing_value_P_list[[i]],c("Ship Date Promise")] = fill_table_A[[i]]
}
Hdf = as.tibble(Hdf)
# OpenOrder data need to be fixed #
OpenOrder_df=na.omit(OpenOrder_df)
# Date Transformation and handling missing value #
New_Hdf = Hdf %>% mutate(Order_Date = ymd(`Order Date`),
Order_Date_year = year(`Order Date`),
Order_Date_month = month(`Order Date`),
`LT at Time of Order (WKS)` =replace(`LT at Time of Order (WKS)`, is.na(`LT at Time of Order (WKS)`),mean(`LT at Time of Order (WKS)`, na.rm=T)))
sapply(New_Hdf,function(x) sum(is.na(x)))
# filling Missing value of ship date actual for OpenOrder Data by using ship date promise
New_Hdf[setdiff(names(OpenOrder_df), names(New_Hdf))] <- NA
OpenOrder_df[setdiff(names(New_Hdf), names(OpenOrder_df))] <- NA
H_Open_df = rbind(New_Hdf, OpenOrder_df)
H_Open_df = as.data.frame(H_Open_df)
missing_value_A_list = which(is.na(H_Open_df$`Ship Date Actual`))
fill_table_P = H_Open_df[c(which(is.na(H_Open_df$`Ship Date Actual`))),c("Ship Date Promise")]
for (i in 1:length(missing_value_A_list)){
H_Open_df[missing_value_A_list[[i]],c("Ship Date Actual")] = fill_table_P[[i]]
}
H_Open_df = as.tibble(H_Open_df)
# Identify the Combine_H_O
if (isTRUE(Combine_H_O)){
select_sample_df = H_Open_df
}
else{
select_sample_df = New_Hdf
}
if(!is.na(Item_Group) & is.na(Item) & is.na(Delivery_Address)){
sample_df <- select_sample_df %>%
filter(`Item Group (Product Family)`== Item_Group)
}
else if(!is.na(Item_Group) & !is.na(Item) & is.na(Delivery_Address)){
sample_df <- select_sample_df %>%
filter(`Item Group (Product Family)`== Item_Group,`Item #`==Item)
}
else if(!is.na(Item_Group) & !is.na(Item) & !is.na(Delivery_Address)){
sample_df <- select_sample_df %>%
filter(`Item Group (Product Family)`== Item_Group,`Item #`==Item,`Delivery Address`==Delivery_Address)
}
else{
print("You should at least fill Item_Group or Item out, then the machine could be work.")
}
# Item_Group Prediction #
### The sumQuantity for each family by each month ###
# Simple transformation to the time series table #
# Based on the Order Date for the same Item Family to caculate the total Quantity #
sample_df <- sample_df %>%
mutate(`Order Date` = as.Date(`Order Date`),
`Quantity (PCS)` = as.integer(`Quantity (PCS)`),
diff_Promise_Order_days = difftime(`Ship Date Promise`,`Order Date`,units = c('days')),
diff_Actual_Promise_days = difftime(`Ship Date Actual`,`Ship Date Promise`,units = c('days')),
diff_Actual_Order_days = difftime(`Ship Date Actual`,`Order Date`, units = c('days'))) %>%
arrange(`Order Date`) %>%
select(`Order Date`,diff_Promise_Order_days,diff_Actual_Promise_days,diff_Actual_Order_days,`Quantity (PCS)`,`LT at Time of Order (WKS)`) %>%
group_by(`Order Date` = floor_date(`Order Date`, unit="month")) %>%
summarise(sumQuantity = sum(`Quantity (PCS)`),
avg_diff_Promise_Order_days=mean(diff_Promise_Order_days),
avg_diff_Actual_Promise_days=mean(diff_Actual_Promise_days),
avg_diff_Actual_Order_days=mean(diff_Actual_Order_days),
`avg LT at Time of Order (WKS)`=mean(`LT at Time of Order (WKS)`))
if (isTRUE(Max_C_Date)){
sample_df = sample_df %>%
complete(`Order Date` = seq.Date(min(`Order Date`),max(`Order Date`),by='month')) %>%
na.replace(.,0) %>%
filter(`Order Date` <= as.Date(Max_C_Date_value))
}
else{
sample_df = sample_df %>%
complete(`Order Date` = seq.Date(min(`Order Date`),max(as.Date(Max_C_Date_value)),by='month')) %>%
na.replace(.,0) %>%
filter(`Order Date` <= as.Date(Max_C_Date_value))
}
sample_df = sample_df %>%
mutate(Demand_rate = abs(sumQuantity-lag(sumQuantity)),
`Safety Stock Level` = Demand_rate*as.numeric(avg_diff_Promise_Order_days)/30,
Inventory_Level = sumQuantity*abs(as.numeric(`avg LT at Time of Order (WKS)`)*7/28-(as.numeric(`avg LT at Time of Order (WKS)`)*7)%/%28))
sample_df1 = sample_df
# Time Series Plot #
sample_df = as.tibble(as.data.frame(sample_df))
p1 = list()
p1[[1]] = sample_df %>% plot_ly() %>%
add_trace(x= ~`Order Date`,y= ~sumQuantity,name="sumQuantity",type='scatter', mode='lines') %>%
#add_trace(x= ~`Order Date`,y= ~`Safety Stock Level`,name="High Inventory Level",type='scatter', mode='lines') %>%
add_trace(x= ~`Order Date`,y= ~Inventory_Level,name="Inventory Level",type='scatter', mode='lines') %>%
layout(title='Historical Plot')
p1[[2]] = sample_df %>% plot_ly() %>%
add_lines(x= ~`Order Date`, y= ~avg_diff_Actual_Promise_days, name="diff_A_P_days")
p1[[3]] = sample_df %>% plot_ly() %>%
add_lines(x= ~`Order Date`, y= ~avg_diff_Promise_Order_days, name="diff_P_O_days")
p1[[4]] = sample_df %>% plot_ly() %>%
add_lines(x= ~`Order Date`, y= ~`avg LT at Time of Order (WKS)`, name="Avg LT of Order (WKS)")
# xts Transformation
ts_Demand_sample_df = ts(sample_df$sumQuantity,start = c(year(min(sample_df$`Order Date`)),month(min(sample_df$`Order Date`))), frequency = 12)
fit = nnetar(ts_Demand_sample_df,decay=0.5,maxit=150)
f_nn_ts <- forecast(fit, h = Prediction_Terms)
#print(f_arima_ts$mean)
forecasting_table = as.tibble(data.frame(`Order Date`=as.Date(f_nn_ts$mean), sumQuantity=as.matrix(f_nn_ts$mean)))
His_table = sample_df %>%
select(`Order Date`,sumQuantity,`avg LT at Time of Order (WKS)`)
forecasting_table = forecasting_table %>%
rename(`Order Date` = Order.Date) %>%
filter(`Order Date` > tail(His_table$`Order Date`,1))
# Linear Regression #
Linear_Model = lm(`avg LT at Time of Order (WKS)`~poly(sumQuantity,2), data = sample_df1)
new_demand = data.frame(sumQuantity = forecasting_table$sumQuantity)
forecasting_D_P_O_table = data.frame(avg_LT_at_Time_of_Order = predict(Linear_Model, new_demand))
forecasting_table = cbind(forecasting_table,forecasting_D_P_O_table$avg_LT_at_Time_of_Order)
forecasting_table = forecasting_table %>%
rename(`avg LT at Time of Order (WKS)` = `forecasting_D_P_O_table$avg_LT_at_Time_of_Order`)
Full_table = rbind(His_table,forecasting_table)
Full_table = Full_table %>%
mutate(Inventory_Level = sumQuantity*abs(as.numeric(`avg LT at Time of Order (WKS)`)*7/28-(as.numeric(`avg LT at Time of Order (WKS)`)*7)%/%28))
Full_table %>%
filter(`Order Date` > tail(His_table$`Order Date`,1)) %>%
print()
# Time Series Plot #
Full_table = as.tibble(as.data.frame(Full_table))
p2 = list()
p2[[1]] = Full_table %>% plot_ly() %>%
add_trace(x= ~`Order Date`,y= ~sumQuantity,name="sumQuantity",type='scatter', mode='lines') %>%
add_trace(x= ~`Order Date`,y= ~Inventory_Level,name="Inventory Level",type='scatter', mode='lines') %>%
layout(title='Forecasting Plot')
p2[[2]] = Full_table %>% plot_ly() %>%
add_lines(x= ~`Order Date`, y= ~`avg LT at Time of Order (WKS)`, name="Avg LT of Order (WKS)")
return(list(autoplot(f_nn_ts),subplot(p1,nrows=4),subplot(p2,nrows=2)))
}
Short Term for One Month
Two Models ARIMA and BaggedETS
Forecasting_Model_Function(historical_data = Hdf, openorder_data = OpenOrder_df,Combine_H_O = NA,Item_Group = 11286,Increase_Sensitivity_ARIMA = TRUE,Prediction_Terms = 1,Max_C_Date = FALSE,Max_C_Date_value = "2018-10-01")
## Warning: `as.tibble()` is deprecated, use `as_tibble()` (but mind the new semantics).
## This warning is displayed once per session.
## # A tibble: 1 x 4
## `Order Date` sumQuantity `avg LT at Time of Order (WKS)` Inventory_Level
## <date> <dbl> <dbl> <dbl>
## 1 2018-11-01 1281313. 10.4 769668.
## [[1]]
## geom_path: Each group consists of only one observation. Do you need to
## adjust the group aesthetic?

##
## [[2]]
##
## [[3]]
Long Term for three months
Two Models ARIMA and BaggedETS
Forecasting_Model_Function(historical_data = Hdf, openorder_data = OpenOrder_df,Combine_H_O = NA,Item_Group = 11286,Increase_Sensitivity_ARIMA = TRUE,Prediction_Terms = 3,Max_C_Date = FALSE,Max_C_Date_value = "2018-10-01")
## # A tibble: 3 x 4
## `Order Date` sumQuantity `avg LT at Time of Order (WKS)` Inventory_Level
## <date> <dbl> <dbl> <dbl>
## 1 2018-11-01 1281313. 10.4 769668.
## 2 2018-12-01 2176508. 9.17 636813.
## 3 2019-01-01 3793421. 8.36 343278.
## [[1]]

##
## [[2]]
##
## [[3]]
short Term for One Month
Neuronal Network
Forecasting_nn_Model_Function(historical_data = Hdf, openorder_data = OpenOrder_df,Combine_H_O = NA,Item_Group = 11286,Prediction_Terms = 1,Max_C_Date_value = "2018-10-01")
## # A tibble: 1 x 4
## `Order Date` sumQuantity `avg LT at Time of Order (WKS)` Inventory_Level
## <date> <dbl> <dbl> <dbl>
## 1 2018-11-01 1841312. 9.57 721006.
## [[1]]
## geom_path: Each group consists of only one observation. Do you need to
## adjust the group aesthetic?

##
## [[2]]
##
## [[3]]
Long Term for three months
Neuronal Network
Forecasting_nn_Model_Function(historical_data = Hdf, openorder_data = OpenOrder_df,Combine_H_O = NA,Item_Group = 11286,Prediction_Terms = 3,Max_C_Date_value = "2018-10-01")
## # A tibble: 3 x 4
## `Order Date` sumQuantity `avg LT at Time of Order (WKS)` Inventory_Level
## <date> <dbl> <dbl> <dbl>
## 1 2018-11-01 1846600. 9.56 719912.
## 2 2018-12-01 2530806. 8.84 529624.
## 3 2019-01-01 2920972. 8.57 417308.
## [[1]]

##
## [[2]]
##
## [[3]]