объединение данных по дате на основе условий периода времени - PullRequest
1 голос
/ 05 апреля 2019

(Это продолжение вопроса, который был первоначально размещен здесь .

Моя первоначальная проблема была решена, однако я хотел бы объединить эти два набора данных немного по-другомутакже.

df1 - это своего рода «финансовый отчет», а df2 - это «финансовый отчет на конец года». Ранее я хотел связать данные финансового отчета с последними доступными данными.финансовые данные.

Теперь я хотел бы «прогнозировать» финансовые данные (df2), используя данные в финансовом отчете (df1). То есть связать данные по ID и date_f и date.

Я хотел бы наложить следующее условие:

Присоединиться, если;

date (t+1) из df2> date_f (t) от df1 и разница должна составлять более 6 месяцев,

в противном случае;

принимать date при t+2 (то есть, еслиdate (t+1) меньше чем через 6 месяцев после date_f (t), затем используйте date at (t+2).

По сути, я хочуиспользуйте данные финансового отчета df1 для прогнозирования данных в df2, но информация в df1 бесполезна для прогнозирования на 1 неделю в будущем, поэтому я предпочел бы прогнозировать данные за следующие годы.

Данные выглядят следующим образом:

df1:

        ID     date_f
1  1047699 2014-03-03
2   858339 2007-03-01
3  1002910 2009-12-22
4   277135 2011-02-18
5   753308 2004-03-09
6  1018840 2008-02-26
7  1510295 2011-10-21
8     3133 2014-02-27
9  1467858 2010-02-26
10  865436 2004-11-05

df2:

    ID       date year
1 3133 1999-12-31 1999
2 3133 2000-12-31 2000
3 3133 2001-12-31 2001
4 3133 2002-12-31 2002
5 3133 2003-12-31 2003
6 3133 2004-12-31 2004

Ожидаемый вывод с использованием первых 5 строк df1:

        ID     date_f   date        year
1  1047699 2014-03-03 
2   858339 2007-03-01   2007-12-31  2007
3  1002910 2009-12-22   2010-12-31  2010 *
4   277135 2011-02-18   2011-12-31  2011
5   753308 2004-03-09   2004-12-31  2004
  • Здесь date должно быть 2009-12-31, которое находится в df2, и оно все еще> date_f (к 1 неделе), однако условие, которое я хотел бы навязать, это "этодолжно быть> 1064 *, а date должно быть более 6 месяцев в будущем (или 180 дней).Таким образом, здесь это наблюдение не выполняется по второму условию (так как разница составляет всего 1 неделю), поэтому я хотел бы «прогнозировать» дату следующего года, которая составляет 2010-12-31.

data1

df1 <- structure(list(ID = c(1047699L, 858339L, 1002910L, 277135L, 753308L, 
1018840L, 1510295L, 3133L, 1467858L, 865436L), date_f = structure(c(16132, 
13573, 14600, 15023, 12486, 13935, 15268, 16128, 14666, 12727
), class = "Date")), row.names = c(NA, -10L), .internal.selfref = <pointer: 0x0000000002511ef0>, class = "data.frame")

data2

df2 <- structure(list(ID = c(3133L, 3133L, 3133L, 3133L, 3133L, 3133L, 
3133L, 753308L, 753308L, 753308L, 753308L, 753308L, 753308L, 
753308L, 753308L, 753308L, 753308L, 753308L, 753308L, 753308L, 
753308L, 753308L, 753308L, 753308L, 753308L, 753308L, 753308L, 
1467858L, 1467858L, 1467858L, 1467858L, 1467858L, 1467858L, 1467858L, 
1467858L, 1467858L, 1467858L, 1467858L, 1467858L, 1467858L, 1467858L, 
1467858L, 1467858L, 1467858L, 1467858L, 1467858L, 1467858L, 277135L, 
277135L, 277135L, 277135L, 277135L, 277135L, 277135L, 277135L, 
277135L, 277135L, 277135L, 277135L, 277135L, 277135L, 277135L, 
277135L, 277135L, 277135L, 277135L, 277135L, 1002910L, 1002910L, 
1002910L, 1002910L, 1002910L, 1002910L, 1002910L, 1002910L, 1002910L, 
1002910L, 1002910L, 1002910L, 1002910L, 1002910L, 1002910L, 1002910L, 
1002910L, 1002910L, 1002910L, 1002910L, 858339L, 858339L, 858339L, 
858339L, 858339L, 858339L, 858339L, 858339L, 858339L, 858339L, 
858339L, 858339L, 858339L, 858339L, 858339L, 858339L, 858339L, 
858339L, 858339L, 858339L, 865436L, 865436L, 865436L, 865436L, 
865436L, 865436L, 865436L, 865436L, 865436L, 865436L, 865436L, 
865436L, 865436L, 865436L, 865436L, 865436L, 865436L, 865436L, 
1018840L, 1018840L, 1018840L, 1018840L, 1018840L, 1018840L, 1018840L, 
1018840L, 1018840L, 1018840L, 1018840L, 1018840L, 1018840L, 1018840L, 
1018840L, 1018840L, 1018840L, 1018840L, 1018840L, 1018840L, 1018840L, 
1047699L, 1047699L, 1047699L, 1047699L, 1047699L, 1047699L, 1047699L, 
1047699L, 1047699L, 1047699L, 1047699L, 1510295L, 1510295L, 1510295L, 
1510295L, 1510295L, 1510295L, 1510295L, 1510295L, 1510295L, 1510295L
), date = structure(c(10956, 11322, 11687, 12052, 12417, 12783, 
13148, 10956, 11322, 11687, 12052, 12417, 12783, 13148, 13513, 
13878, 14244, 14609, 14974, 15339, 15705, 16070, 16435, 16800, 
17166, 17531, 17896, 10956, 11322, 11687, 12052, 12417, 12783, 
13148, 13513, 13878, 14244, 14609, 14974, 15339, 15705, 16070, 
16435, 16800, 17166, 17531, 17896, 10956, 11322, 11687, 12052, 
12417, 12783, 13148, 13513, 13878, 14244, 14609, 14974, 15339, 
15705, 16070, 16435, 16800, 17166, 17531, 17896, 10956, 11322, 
11687, 12052, 12417, 12783, 13148, 13513, 13878, 17166, 14244, 
14609, 14974, 15339, 15705, 16070, 16435, 16800, 17531, 17896, 
10956, 11322, 11687, 12052, 12417, 12783, 13148, 13513, 13878, 
14244, 14609, 14974, 15339, 15705, 16070, 16435, 16800, 17166, 
17531, 17896, 10864, 11230, 11595, 11960, 12325, 12691, 13056, 
13421, 13786, 14152, 14517, 14882, 15247, 15613, 15978, 16343, 
16708, 17074, 10622, 10987, 11353, 11718, 12083, 12448, 12814, 
13179, 13544, 13909, 14275, 14640, 15005, 15370, 15736, 16101, 
16466, 16831, 17197, 17562, 17927, 10956, 11322, 11687, 12052, 
12417, 12783, 13148, 13513, 13878, 14244, 14609, 14609, 14974, 
15339, 15705, 16070, 16435, 16800, 17166, 17531, 17896), class = "Date"), 
    year = c(1999L, 2000L, 2001L, 2002L, 2003L, 2004L, 2005L, 
    1999L, 2000L, 2001L, 2002L, 2003L, 2004L, 2005L, 2006L, 2007L, 
    2008L, 2009L, 2010L, 2011L, 2012L, 2013L, 2014L, 2015L, 2016L, 
    2017L, 2018L, 1999L, 2000L, 2001L, 2002L, 2003L, 2004L, 2005L, 
    2006L, 2007L, 2008L, 2009L, 2010L, 2011L, 2012L, 2013L, 2014L, 
    2015L, 2016L, 2017L, 2018L, 1999L, 2000L, 2001L, 2002L, 2003L, 
    2004L, 2005L, 2006L, 2007L, 2008L, 2009L, 2010L, 2011L, 2012L, 
    2013L, 2014L, 2015L, 2016L, 2017L, 2018L, 1999L, 2000L, 2001L, 
    2002L, 2003L, 2004L, 2005L, 2006L, 2007L, 2016L, 2008L, 2009L, 
    2010L, 2011L, 2012L, 2013L, 2014L, 2015L, 2017L, 2018L, 1999L, 
    2000L, 2001L, 2002L, 2003L, 2004L, 2005L, 2006L, 2007L, 2008L, 
    2009L, 2010L, 2011L, 2012L, 2013L, 2014L, 2015L, 2016L, 2017L, 
    2018L, 1999L, 2000L, 2001L, 2002L, 2003L, 2004L, 2005L, 2006L, 
    2007L, 2008L, 2009L, 2010L, 2011L, 2012L, 2013L, 2014L, 2015L, 
    2016L, 1998L, 1999L, 2000L, 2001L, 2002L, 2003L, 2004L, 2005L, 
    2006L, 2007L, 2008L, 2009L, 2010L, 2011L, 2012L, 2013L, 2014L, 
    2015L, 2016L, 2017L, 2018L, 1999L, 2000L, 2001L, 2002L, 2003L, 
    2004L, 2005L, 2006L, 2007L, 2008L, 2009L, 2009L, 2010L, 2011L, 
    2012L, 2013L, 2014L, 2015L, 2016L, 2017L, 2018L)), row.names = c(NA, 
-167L), .internal.selfref = <pointer: 0x0000000002511ef0>, class = "data.frame")
#

1 Ответ

0 голосов
/ 06 апреля 2019

Я думаю, что это решило мою проблему:

df1$start_date <- df1$date_f + 183
df1$end_date <- df1$date_f + 540

library(fuzzyjoin)
yy <- fuzzy_left_join(
  df1, df2,
  by = c(
    "ID" = "ID",
    "start_date" = "date",
    "end_date" = "date"
  ),
  match_fun = list(`==`, `<`, `>=`)
)

Если кто-нибудь увидит, что я мог потерпеть неудачу в моей логике, поправьте меня!

Если финансовый отчет публикуется в марте, а финансовая информация публикуется в июле, я хочу игнорировать это объединение. Отсюда start_date <- df1$date_f + 183. Я также установил верхнюю границу в 1,5 года (540 дней) с момента публикации финансового отчета. Поэтому отчет за следующие годы будет корректно приведен в соответствие с правильной финансовой информацией.

Образец выхода:

     ID.x     date_f    start_date end_date   ID.y      date     fyear
1  1006835  2008-09-30 2009-04-01 2010-03-24      NA       <NA>    NA
2  1510295  2009-10-19 2010-04-20 2011-04-12 1510295 2010-12-31  2010
3  1506307  2016-02-08 2016-08-09 2017-08-01 1506307 2016-12-31  2016
4   814453  2005-03-15 2005-09-14 2006-09-06  814453 2005-12-31  2005
5   832988  2003-06-19 2003-12-19 2004-12-10  832988 2004-01-31  2003
6  1275283  2007-02-26 2007-08-28 2008-08-19 1275283 2007-12-31  2007
7   858470  2004-03-15 2004-09-14 2005-09-06  858470 2004-12-31  2004
8   885639  2005-03-14 2005-09-13 2006-09-05  885639 2006-01-31  2005
9   732718  2014-04-02 2014-10-02 2015-09-24      NA       <NA>    NA
10 1385157  2009-03-02 2009-09-01 2010-08-24 1385157 2009-09-30  2009

т.е. ID.x = 1510295 имеет date.f = 2009-10-19, и присоединение к year даст мне, вероятно, финансовую информацию по адресу 2009-12-31, который находится всего через 2 месяца после отчета ... (что не очень полезно для меня)

Я создаю границы start_date = 2010-04-20 и end_date = 2011-04-12. Где start_date теперь больше, чем 2009 финансовая информация на конец года 2009-12-31.

Использование fuzzyjoin для сопоставления date с df2 до границ в df1 Я (думаю) я могу присоединиться к ним.

###############################################################################

Если у кого-то есть версия data.table, это было бы замечательно, так как у этого метода есть проблемы с памятью.

setDT(df2)[df1, on = .(ID, date > start_date, date <= end_date)]

Не работает должным образом ...

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