Skip to content

Instantly share code, notes, and snippets.

@mplourde
Last active March 15, 2016 15:23
Show Gist options
  • Save mplourde/8ffad61b4645e3fdb89b to your computer and use it in GitHub Desktop.
Save mplourde/8ffad61b4645e3fdb89b to your computer and use it in GitHub Desktop.
#' @export
add_time_sig <- function(D) {
daypart_cols <- names(D)[grepl('hour_', names(D))]
# NOT CURRENTLY USED
#D <- D %>%
# mutate_(
# week_sig = ~ifelse(get_media_month(log_date) != get_media_month(detail_start),
# get_media_week(detail_end),
# get_media_week(log_date)))
D %>%
unite_('weekpart_sig', c('has_weekdays', 'has_weekends'), sep='', remove = FALSE) %>%
unite_('daypart_sig', daypart_cols, sep='', remove = FALSE)
}
add_time_frac <- function(D) { #updated for naive model + 1 to time frac
week_cols <- names(D)[grepl('^week_\\d$', names(D))]
D_with_mw <- D %>%
mutate_(media_week=~(as.numeric(log_date - floor_mm(detail_start), units='days') %/% 7) + 1)
D_samps <- D_with_mw %>%
group_by_(~detail_id) %>%
filter_(~row_number() == 1)
D_in_spec_days <- D_samps %>%
select_(~detail_id, ~has_weekdays, ~has_weekends, .dots=week_cols) %>%
gather_('media_week', 'week_ind', week_cols) %>%
filter_(~week_ind >= 0) %>%
mutate_(media_week=~extract_numeric(media_week)) %>%
mutate_(weekly_days_in_spec=~(5*has_weekdays + 2*has_weekends) * week_ind) %>%
group_by_(~detail_id) %>%
arrange_(~media_week) %>%
mutate_(prev_week_cume_in_spec_days=~cumsum(lag(weekly_days_in_spec, default=0))) %>%
ungroup()
D_next_month_cume_in_spec_days <- D_in_spec_days %>%
group_by_(~detail_id) %>%
arrange_(~media_week) %>%
filter_(~row_number() == n()) %>%
mutate_(media_week=~media_week+1, week_ind=~0,
prev_week_cume_in_spec_days=~prev_week_cume_in_spec_days + weekly_days_in_spec,
weekly_days_in_spec=~NA
)
D_in_spec_days_complete <- D_in_spec_days %>%
bind_rows(D_next_month_cume_in_spec_days)
D_total_days_in_spec <- D_in_spec_days %>%
group_by_(~detail_id) %>%
summarize_(total_days_in_spec=~sum(weekly_days_in_spec))
get_mw_wday <- function(dates) {
w_day <- wday(dates) - 1 # monday = 1
ifelse(w_day==0, 6, w_day) # sunday = 7
}
D_with_mw %>%
left_join(D_in_spec_days_complete) %>%
group_by_(~detail_id) %>%
arrange_(~log_date) %>%
fill_(c('prev_week_cume_in_spec_days', 'week_ind')) %>%
mutate_(
w_day=~get_mw_wday(log_date),
cur_week_in_spec_passed=~ifelse(week_ind == 0, 0,
ifelse(has_weekdays == 1 & has_weekends == 1, w_day,
ifelse(has_weekdays == 1, pmin(w_day, 5), pmax(0, w_day-5))
)),
total_in_spec_days_passed=~cur_week_in_spec_passed + prev_week_cume_in_spec_days
) %>%
inner_join(D_total_days_in_spec) %>%
mutate_(time_frac=~(total_in_spec_days_passed / total_days_in_spec)) %>%
ungroup()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment