Skip to content
Snippets Groups Projects
Commit 08ae69e7 authored by pbac's avatar pbac
Browse files

made periodic function

parent 378fe5c1
Branches
No related tags found
No related merge requests found
## Do this in a separate tmp.R file to check the documentation
#library(devtools)
#document()
#load_all(as.package("../../onlineforecast"))
#?make_periodic
#' Make an forecast matrix with a periodic time signal.
#'
#' This function creates a data.frame with k-steps-ahead values of a periodic time signal,
#' such that it can be added to a data.list and used inputs to a forecast model.
#'
#' @param time vector of times of class "POSIXct" "POSIXt".
#' @param kseq vector of integers, representing the desired "k-steps ahead".
#' @param period a numeric setting the length of the period in seconds.
#' @param offset a numeric setting an offset in the period start in seconds.
#' @param tstep step time of k in seconds.
#' @return Returns a forecast matrix (data.frame) with rownames = times, colnames = k1, k2, k3, ...
#' The content of the data frame is the hour of day.
#' @keywords periodic lags data.frame
#' @seealso make_tday
#' @examples
#' # Create a time sequence of 30 min sample period
#' tseq <- seq(ct("2019-01-01"), ct("2019-02-01 12:00"), by=1800)
#'
#' # Make the three hourly periodic sequence
#' make_periodic(tseq, 1:10, 3*3600)
#'
#' # With an offset of one hour
#' make_periodic(tseq, 1:10, 3*3600, 3600)
#'
#' @export
make_periodic <- function(time, kseq, period, offset=0, tstep=NA){
# If tstep not given, then take it from time assuming same k-step is the sampling period
if(is.na(tstep)){
tstep <- as.numeric(time[2] - time[1], units="secs")
}
# The time of day (in the specified units)
tday <- sapply(kseq, function(k){
tk <- time + k * tstep - offset
as.numeric(tk,units="secs") %% period
})
# set row and column names
nams(tday) <- paste0('k', kseq)
return( as.data.frame(tday) )
}
...@@ -4,38 +4,42 @@ ...@@ -4,38 +4,42 @@
#load_all(as.package("../../onlineforecast")) #load_all(as.package("../../onlineforecast"))
#?make_tday #?make_tday
#' Make an hour-of-day data.frame with k-step ahead columns. #' Make an hour-of-day forecast matrix
#' #'
#' This function creates a data.frame with k-steps-ahead values of hour of day, #' This function creates a data.frame with k-steps-ahead values of hour of day,
#' such that it can be added to a data.list and used inputs to a forecast model. #' such that it can be added to a data.list and used inputs to a forecast model.
#' #'
#' @param time vector of times of class "POSIXct" "POSIXt". #' @param time vector of times of class "POSIXct" "POSIXt".
#' @param kseq vector of integers, respresenting the desired "k-steps ahead". #' @param kseq vector of integers, representing the desired "k-steps ahead".
#' @param tstep step time of k in seconds. #' @param tstep step time of k in seconds.
#' @param units to return in, e.g. "hours" or "mins" #' @return Returns a forecast matrix (data.frame) with rownames = times, colnames = k1, k2, k3, ...
#' @return Returns a data.frame with rownames = times, colnames = k1, k2, k5, ... #' The content of the data frame is the hour of day.
#' The content of the data frame is the hour of day, following the setup in "onlineforecast" setup.
#' @keywords hourofday lags data.frame #' @keywords hourofday lags data.frame
#' @seealso make_periodic
#' @examples #' @examples
#' # Create a time sequence #' # Create a time sequence of 30 min sample period
#' tseq <- seq(ct("2019-01-01"), ct("2019-02-01 12:00"), by=1800) #' tseq <- seq(ct("2019-01-01"), ct("2019-02-01 12:00"), by=1800)
#' #'
#' # Make the time of day sequence #' # Make the time of day sequence (assuming time between k steps is same as for tseq)
#' make_tday(tseq, 1:10) #' make_tday(tseq, 1:10)
#' #'
#' # With 0.5 hour steps and in minutes #' # With 0.5 hour steps, kstep in hours
#' make_tday(tseq, 1:10, tstep=1800, units="mins") #' make_tday(tseq, 1:10, tstep=3600)
#' #'
#' #'
#' @export #' @export
make_tday <- function(time, kseq, tstep=3600, units="hours"){ make_tday <- function(time, kseq, tstep=NA){
## The time of day (in the specified units) # If tstep not given, then take it from time assuming same k-step is the sampling period
if(is.na(tstep)){
tstep <- as.numeric(time[2] - time[1], units="secs")
}
# The time of day (in the specified units)
tday <- sapply(kseq, function(k){ tday <- sapply(kseq, function(k){
tk <- time + k * tstep tk <- time + k * tstep
as.numeric( tk - trunc(tk, units="days"), units=units) as.numeric( tk - trunc(tk, units="days"), units="hours")
}) })
## set row and column names # set row and column names
nams(tday) <- paste0('k', kseq) nams(tday) <- paste0('k', kseq)
return( as.data.frame(tday) ) return( as.data.frame(tday) )
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment