# load("G:/Financial Services/Corporate Planning/Hydraulic Model Files/R Library/rSSOAP/data/lenox.RData") # load("G:/Financial Services/Corporate Planning/Hydraulic Model Files/R Library/rSSOAP/data/tidy_rain.RData") load("C:/Users/Craig/Dropbox/R Library/rSSOAP/DATA/lenox.RData") load("C:/Users/Craig/Dropbox/R Library/wetR/data/tidy_rain.RData") library(tidyverse); theme_set(theme_bw()) library(lubridate) library(stringr) library(rSSOAP) library(zoo) library(vars) library(imputeTS)
remove_outliers <- function(rawVal, LOW_PASS = 0.99, HIGH_PASS = 0.10, SCALE = 1.5) { q50 <- unname(quantile(rawVal, probs=0.50, na.rm=TRUE)) qmax <- unname(quantile(rawVal, probs=LOW_PASS, na.rm=TRUE)) qmin <- unname(quantile(rawVal, probs=HIGH_PASS, na.rm=TRUE)) diff_min <- abs(ifelse ( sign(qmin)==1 , q50-qmin , qmin-q50 )) diff_max <- qmax-q50 MAX_DF <- q50 + diff_max*SCALE MIN_DF <- q50 - diff_min*SCALE retVal <- rawVal retVal[retVal>MAX_DF]=NA retVal[retVal<MIN_DF]=NA retVal <- na_interpolation(retVal, option="linear") return(retVal) } zero_offset <- function(rawVal, HIGH_PASS=0.05) { ZERO_VALUE <- unname(quantile(rawVal, probs=HIGH_PASS, na.rm=TRUE)) retVal <- rawVal - ZERO_VALUE retVal[retVal<0]=0 return(retVal) }
# convey hourly data to daily data rain_ <- tidy_rain %>% filter(station=="SOWS") %>% mutate(date=date(datetime)) %>% group_by(date) %>% summarize(rain=sum(rainfall_in, na.rm=TRUE)) #rain_[is.na(rain_)]=0 # tmp <- data %>% # mutate(date=date(datetime)) %>% # filter(date<mdy("01/01/2020")) %>% # group_by(date) %>% # summarize(df=sum(flow_gpm, na.rm=TRUE)) %>% # left_join(rain_, by="date") tmp <- len %>% mutate(date=date(datetime)) %>% filter(date>mdy("10/5/2018")) %>% filter(date<mdy("01/01/2020")) %>% na.omit(flow_gpm) %>% group_by(date) %>% summarize(df=sum(flow_gpm, na.rm=TRUE)) %>% left_join(rain_, by="date")
date <- tmp$date flow <- tmp$df rain <- tmp$rain # within function, convert to data.frame df <- data.frame(date=date, flow=flow, rain=rain)
infer_daily_dwf <- function(date, flow, rain , MAX_RAIN_TODAY=0.25 , MAX_RAIN_SHORT=0.5 , DAY_RAIN_SHORT=7 , MAX_RAIN_LONG=2 , DAY_RAIN_LONG=14 , MAX_STDEV=1) { MAX_FLOW <- mean(flow)+MAX_STDEV*sd(flow) MIN_FLOW <- mean(flow)-MAX_STDEV*sd(flow) dwf <- df %>% mutate(lag_short=rollapply(rain, DAY_RAIN_SHORT, sum, align="right", fill=0)) %>% mutate(lag_long=rollapply(rain, DAY_RAIN_LONG, sum, align="right", fill=0)) %>% filter(rain<= MAX_RAIN_TODAY & lag_short<=MAX_RAIN_SHORT & lag_long <= MAX_RAIN_LONG) %>% filter(df_adj<=MAX_FLOW & df_adj >= MIN_FLOW) %>% mutate(wday=wday(date)) %>% group_by(wday) %>% summarize(dwf=mean(df_adj)) return(dwf) } infer_daily_gwi <- function(date, flow, rain, HIGH_PASS=0.1) { dwf <- infer_daily_dwf(date, flow, rain) gwi <- df %>% mutate(wday=wday(date)) %>% left_join(dwf, by="wday") %>% mutate(dwf_adj=na_interpolation(dwf, option="linear")) %>% mutate(wwf=df_adj-dwf) %>% mutate(gwi=zoo::rollapply(wwf, 30, align="right", quantile, prob=HIGH_PASS, fill=NA)) retVal <- remove_outliers(zero_offset(gwi$gwi)) return(retVal) } infer_daily_bsf <- function(date, flow, rain) { gwi <- infer_daily_gwi(date, flow, rain) diurnal <- infer_daily_dwf(date, flow-gwi, rain) tmp <- data.frame(date=date, flow=flow, rain=rain) retVal <- tmp %>% mutate(wday=wday(date)) %>% left_join(diurnal, by=c("wday")) return(retVal$dwf) } df$bsf <- infer_daily_bsf(date, flow, rain)
infer_daily_hydrograph <- function(date, flow, rain, INITIAL_ABSTRACTION = 0.5) { flow <- df$df_adj gwi <- infer_daily_gwi(date, flow, rain) bsf <- infer_daily_bsf(date, flow, rain) rdi <- flow - gwi - bsf r <- rain r[r<INITIAL_ABSTRACTION]=0 r[is.na(r)]=0 # Translate to time series for VAR ii <- ts(cbind(r, rdi)) # Estimate the model var.1 <- VAR(ii, 2, type = "none") # Calculate the IRF ir.1 <- irf(var.1, impulse = "r", response = "rdi", n.ahead = 20, ortho = FALSE) # Return upper limit uh <- ir.1$Upper$r return(uh) } infer_daily_rdi <- function(date, flow, rain, INITIAL_ABSTRACTION=0.5) { uh <- infer_daily_hydrograph(date, flow, rain, INITIAL_ABSTRACTION) PU <- lag_rain(rain) UH <- uh U <- matrix(c(UH, rep(0,ncol(PU)-length(UH))), ncol=1) Q.m <- PU%*%U return(Q.m) }
df$df_adj <- remove_outliers(df$flow)
df$gwi <- infer_daily_gwi(date, df$df_adj, rain) df$bsf <- infer_daily_bsf(date, df$df_adj, rain) df$rdi <- infer_daily_rdi(date, df$df_adj, rain) # # df1$rdi <- infer_daily_rdi(date, df$df_adj, rain, 0) # df2$rdi <- infer_daily_rdi(date, df$df_adj, rain, 0.5) # df3$rdi <- infer_daily_rdi(date, df$df_adj, rain, 1) # df4$rdi <- infer_daily_rdi(date, df$df_adj, rain, 1.5)
plot(df$flow, ylim=c(0,50e3), type="l") # lines(df$gwi) # lines(df$bsf+df$gwi) # lines(df$bsf+df$gwi+df1$rdi, col="red") # lines(df$bsf+df$gwi+df2$rdi, col="blue") # lines(df$bsf+df$gwi+df3$rdi, col="green") # lines(df$bsf+df$gwi+df4$rdi, col="cyan")
df %>% ggplot(aes(x=date, y=flow)) + geom_line() + geom_line(aes(y=bsf+gwi+rdi), col="red")
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.