R укажите, какая неделя в месяце - PullRequest
0 голосов
/ 05 июня 2018

У меня есть дневные данные, которые необходимо преобразовать в еженедельный формат.Поскольку вы знаете, что торговля акциями происходит только с понедельника по пятницу, мне нужно прибавлять доходность за каждый день, чтобы получить совокупный еженедельный доход.

Я думал об использовании функции недели lubridate, но как lubridate знает, когда начинается неделя?Как заставить lubridate распознавать неделю, используя функцию дня недели, то есть «с понедельника по пятницу» - одна неделя?

Я думал о том, чтобы написать цикл, например: если в данных есть «Понедельник» - «Пятница», я позвоню этой неделе.Но в течение второй недели, что я должен использовать для R, чтобы знать, что мы входим на вторую неделю?Затем, когда мы подходим к концу года, и у нас есть 52 недели, как сбросить счетчик недель, чтобы мы ввели следующий год?

Вот результат:

dat = structure(list(date = structure(c(4019, 4022, 4023, 4024, 4025, 
4026, 4029, 4030, 4031, 4032, 4033, 4036, 4037, 4038, 4039, 4040, 
4043, 4044, 4045, 4046, 4047, 4050, 4051, 4052, 4053, 4054, 4057, 
4058, 4059, 4060, 4061, 4065, 4066, 4067, 4068, 4071, 4072, 4073, 
4074, 4075), class = "Date"), weekday = c("Friday", "Monday", 
"Tuesday", "Wednesday", "Thursday", "Friday", "Monday", "Tuesday", 
"Wednesday", "Thursday", "Friday", "Monday", "Tuesday", "Wednesday", 
"Thursday", "Friday", "Monday", "Tuesday", "Wednesday", "Thursday", 
"Friday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", 
"Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Tuesday", 
"Wednesday", "Thursday", "Friday", "Monday", "Tuesday", "Wednesday", 
"Thursday", "Friday"), COMP = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L
), week = c(1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 
4, 4, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 8, 
9, 9), RET = c(-0.005435, 0.040984, -0.015748, -0.021333, 0.002725, 
0.01087, 0.024194, -0.002625, 0.013158, 0.033766, 0, -0.007538, 
-0.005063, 0, -0.002545, 0.015306, 0.017588, -0.007407, 0.024876, 
-0.009709, 0, -0.029412, 0.010101, 0.0075, -0.004963, 0.027431, 
-0.002427, 0.007299, -0.009662, -0.004878, 0.014706, -0.004831, 
0.004854, -0.009662, -0.021951, -0.014963, 0.005063, -0.005038, 
0.010127, 0)), .Names = c("date", "weekday", "COMP", "week", 
"RET"), row.names = c(NA, -40L), class = c("data.table", "data.frame"
))

library(data.table)
setDT(dat)

Вот два месяцаценность данных с 1981-01-02 до 1981-02-27 ежедневного дохода компании 1.Давайте проигнорируем, чтобы рассчитать доходность в данный момент и сосредоточимся сначала на времени.

Столбец недели генерируется функцией week ().Как вы можете видеть, неделя не то, что я хотел, она начинается со среды и заканчивается в среду.

день недели генерируется функцией weekdays ().

Я хочу сделать, например, 1981-01-02 как неделю 1 (поскольку у нас здесь только пятница), с 1981-01-05 по 1981-01-09 как неделю 2 наоборот.

Ответы [ 4 ]

0 голосов
/ 05 июня 2018
dat[, wk := .GRP, cut(date, 'week')]
head(dat, 20)

#           date   weekday COMP week       RET wk
#  1: 1981-01-02    Friday    1    1 -0.005435  1
#  2: 1981-01-05    Monday    1    1  0.040984  2
#  3: 1981-01-06   Tuesday    1    1 -0.015748  2
#  4: 1981-01-07 Wednesday    1    1 -0.021333  2
#  5: 1981-01-08  Thursday    1    2  0.002725  2
#  6: 1981-01-09    Friday    1    2  0.010870  2
#  7: 1981-01-12    Monday    1    2  0.024194  3
#  8: 1981-01-13   Tuesday    1    2 -0.002625  3
#  9: 1981-01-14 Wednesday    1    2  0.013158  3
# 10: 1981-01-15  Thursday    1    3  0.033766  3
# 11: 1981-01-16    Friday    1    3  0.000000  3
# 12: 1981-01-19    Monday    1    3 -0.007538  4
# 13: 1981-01-20   Tuesday    1    3 -0.005063  4
# 14: 1981-01-21 Wednesday    1    3  0.000000  4
# 15: 1981-01-22  Thursday    1    4 -0.002545  4
# 16: 1981-01-23    Friday    1    4  0.015306  4
# 17: 1981-01-26    Monday    1    4  0.017588  5
# 18: 1981-01-27   Tuesday    1    4 -0.007407  5
# 19: 1981-01-28 Wednesday    1    4  0.024876  5
# 20: 1981-01-29  Thursday    1    5 -0.009709  5

Примечание. Это тот же результат, что и dt[, wk := lubridate::isoweek(date)], если только данные не упорядочены по дате.В этом случае мое решение группирует недели таким же образом, но wk не будет в порядке возрастания.За первую неделю можно дать 6 и т. Д.

0 голосов
/ 05 июня 2018

Вот более простой способ (проще понять, я полагаю), чтобы решить это:

# if its a monday, mark as 1, 2, 3 and so on
dt[weekday == 'Monday', is_week := seq(.N)]

# forward fill the missing values
library(zoo)
dt[, is_week := na.locf(is_week,na.rm = F, fromLast = F)]
dt[is.na(is_week), is_week := 0]

# find weekly average return
dt[, mean(RET), is_week]

   is_week           V1
1:       0 -0.005435000
2:       1  0.003499600
3:       2  0.013698600
4:       3  0.000032000
5:       4  0.005069600
6:       5  0.002131400
7:       6 -0.002950222
8:       7 -0.000962200
0 голосов
/ 05 июня 2018

Используя lubridate, вы можете использовать isoweek для определения столбца недели.

library(lubridate)
df[, wk := isoweek(date)]

Что дает вам

#           date   weekday COMP week       RET wk
#  1: 1981-01-02    Friday    1    1 -0.005435  1
#  2: 1981-01-05    Monday    1    1  0.040984  2
#  3: 1981-01-06   Tuesday    1    1 -0.015748  2
#  4: 1981-01-07 Wednesday    1    1 -0.021333  2
#  5: 1981-01-08  Thursday    1    2  0.002725  2
#  6: 1981-01-09    Friday    1    2  0.010870  2
#  7: 1981-01-12    Monday    1    2  0.024194  3
#  8: 1981-01-13   Tuesday    1    2 -0.002625  3
#  9: 1981-01-14 Wednesday    1    2  0.013158  3
# 10: 1981-01-15  Thursday    1    3  0.033766  3
# 11: 1981-01-16    Friday    1    3  0.000000  3
# 12: 1981-01-19    Monday    1    3 -0.007538  4
# 13: 1981-01-20   Tuesday    1    3 -0.005063  4
# 14: 1981-01-21 Wednesday    1    3  0.000000  4
# 15: 1981-01-22  Thursday    1    4 -0.002545  4
# 16: 1981-01-23    Friday    1    4  0.015306  4
# 17: 1981-01-26    Monday    1    4  0.017588  5
# 18: 1981-01-27   Tuesday    1    4 -0.007407  5
# 19: 1981-01-28 Wednesday    1    4  0.024876  5
# 20: 1981-01-29  Thursday    1    5 -0.009709  5

Используя dplyr, вы можете добавить столбец недели с помощью

library(dplyr)
df %>% 
  mutate(wk = isoweek(date))
0 голосов
/ 05 июня 2018

Если вы хотите считать понедельники с начала набора данных ...

DT[, wk := {
  w = DT[weekday == "Monday"][DT, on=.(date), roll=TRUE, which = TRUE]
  if (anyNA(w)) 
    1L + replace(w, is.na(w), 0L) 
  else 
    w
}]

Как это работает

Мы выполняем скользящее соединениекаждая строка DT на подмножестве DT, где weekday == "Monday", переходящий к самой последней дате в подмножестве (on = .(date), roll = TRUE) и определение номеров строк в подмножестве, на которое мы попадаем (which = TRUE).

Если первый день не является понедельником, у нас будут отсутствующие значения (для всех дней до первого понедельника), и мы захотим заменить их на единицы и увеличить все остальные номера строк на единицу.


О, я думаю, есть также

DT[, wk := (first(weekday) != "Monday") + cumsum(weekday == "Monday")]

... поскольку логическое условие first(weekday) != "Monday" равно 0, если FALSE, 1, если TRUE.

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