Объединить два фрейма данных в R по ближайшим параметрам по умолчанию, а не по лишнему - PullRequest
0 голосов
/ 29 мая 2020

у меня есть два фрейма данных:

df_bestquotes

df_transactions

df_transactions:

day time        vol price   buy ask     bid
1   43688,08    100 195,8   1   195,8   195,74
1   56357,34    20  192,87  1   192,87  192,86
1   57576,14    14  192,48  -1  192,48  192,46
2   50468,29    3   193,83  1   193,86  193,77
2   56107,54    11  194,17  -1  194,2   194,16
7   42549,66    100 188,81  -1  188,85  188,78
7   42724,38    200 188,62  -1  188,66  188,61
7   48924,66    5   189,59  -1  189,62  189,59
8   48950,14    52  187,66  -1  187,7   187,66
9   36242,86    89  186,61  1   186,62  186,56
9   53910,46    1   189,81  -1  189,87  189,81
10  47041,94    15  187,87  -1  187,88  187,86
13  34380,73    87  187,29  -1  187,42  187,27
13  36037,18    100 188,94  1   188,95  188,94
14  46644,64    100 189,29  -1  189,34  189,29
14  57571,12    52  190,03  1   190,03  190
15  36418,71    45  192,07  1   192,07  192,04
15  37223,77    100 191,09  -1  191,07  191,06
17  37245,59    100 186,45  -1  186,47  186,45
23  34200,39    50  189,29  -1  189,29  189,27
24  40294,73    60  193,52  -1  193,54  193,5
29  52813,68    5   202,99  -1  203,01  202,99
29  55279,13    93  203,97  -1  203,98  203,9
30  51356,91    68  204,41  -1  204,45  204,4
30  53530,24    40  204,14  -1  204,18  204,14

df_bestquotes:

day time       best_ask best_bid
1   51384,613   31,78   31,75
1   56593,74    31,6    31,55
3   40568,217   31,36   31,32
7   39169,237   31,34   31,28
8   44715,713   31,2    31,17
8   53730,707   31,24   31,19
8   55851,75    31,17   31,14
10  49376,267   31,06   30,99
16  48610,483   30,75   30,66
16  57360,917   30,66   30,64
17  53130,717   30,39   30,32
20  46353,133   30,72   30,63
23  46429,67    29,7    29,64
24  37627,727   29,81   29,63
24  46354,647   29,92   29,77
24  53863,69    30,04   29,93
24  53889,923   30,03   29,95
24  59047,223   29,99   29,2
28  39086,407   30,87   30,83
28  41828,703   30,87   30,8
28  50489,367   30,99   30,87
29  54264,467   30,97   30,85
30  34365,95    31,21   30,99
30  39844,357   31,06   31
30  57550,523   31,18   31,15

Для каждой записи df_transactions за день и время мне нужно найти best_ask и best_bid, которые были непосредственно перед этим моментом, и включить эту информацию в df_transactions.

df_joined: df_transactions + df_bestquotes

day time        vol price   buy ask     bid     best_ask   best_bid
1   43688,08    100 195,8   1   195,8   195,74
1   56357,34    20  192,87  1   192,87  192,86
1   57576,14    14  192,48  -1  192,48  192,46
2   50468,29    3   193,83  1   193,86  193,77
2   56107,54    11  194,17  -1  194,2   194,16
7   42549,66    100 188,81  -1  188,85  188,78
7   42724,38    200 188,62  -1  188,66  188,61
7   48924,66    5   189,59  -1  189,62  189,59
8   48950,14    52  187,66  -1  187,7   187,66
9   36242,86    89  186,61  1   186,62  186,56
9   53910,46    1   189,81  -1  189,87  189,81
10  47041,94    15  187,87  -1  187,88  187,86
13  34380,73    87  187,29  -1  187,42  187,27
13  36037,18    100 188,94  1   188,95  188,94
14  46644,64    100 189,29  -1  189,34  189,29
14  57571,12    52  190,03  1   190,03  190
15  36418,71    45  192,07  1   192,07  192,04
15  37223,77    100 191,09  -1  191,07  191,06
17  37245,59    100 186,45  -1  186,47  186,45
23  34200,39    50  189,29  -1  189,29  189,27
24  40294,73    60  193,52  -1  193,54  193,5
29  52813,68    5   202,99  -1  203,01  202,99
29  55279,13    93  203,97  -1  203,98  203,9
30  51356,91    68  204,41  -1  204,45  204,4
30  53530,24    40  204,14  -1  204,18  204,14

Я пробовал использовать следующий код, но он не работает:

library(data.table)
df_joined = df_bestquotes[df_transactions, on="time", roll = "nearest"]

Вот настоящие файлы с намного больше записей, те, которые я поместил ранее, являются примером всего 25 записей.

df_transactions_original
df_bestquotes_original

И мой код в R:
сопоставление. R

Есть предложения, как его получить? Спасибо, ребята.

Ответы [ 2 ]

0 голосов
/ 30 мая 2020

Доброе утро @samuelallain, да, раньше я использовал библиотеку (data.table). Я отредактировал его в основном комментарии.
Я пробовал его решение, и RStudio возвращает следующую ошибку:

library(data.table)   
df_joined = df_bestquotes[df_transactions, on=.("day", "time"), roll = TRUE]

Ошибка в [.data.frame (df_bestquotes, df_transactions, on =. (Day, time),:
неиспользованные аргументы (on =. ("день", "время"), roll = TRUE)

Спасибо.

0 голосов
/ 29 мая 2020

В сделанной вами попытке используется data.table , но вы не ссылаетесь на data.table. Вы делали library(data.table) раньше?

Думаю, это должно быть:

df_joined = df_bestquotes[df_transactions, on=.(day, time), roll = TRUE]

Но я не могу тестировать без объектов. Это работает ? roll = "Ближайший" не дает вам предыдущие лучшие котировки, но самые близкие.

РЕДАКТИРОВАТЬ: Спасибо за объекты, я проверил, у меня это работает:

library(data.table)
dfb <- fread("df_bestquotes.csv", dec=",")
dft <- fread("df_transactions.csv", dec = ",")
dfb[, c("day2", "time2") := .(day,time)] # duplicated to keep track of the best quotes days
joinedDf <- dfb [dft, on=.(day, time), roll = +Inf]

Ставит NA, когда нет лучших котировок за день. Если вы хотите прокручивать дни, я предлагаю вам создать уникальную меру времени. Я точно не знаю, что такое time. Учитывая, что единицы измерения time - секунды:

dfb[, uniqueTime := day + time/(60*60*24)]
dft[, uniqueTime := day + time/(60*60*24)]
joinedDf <- dfb [dft, on=.(uniqueTime), roll = +Inf]

Это работает, даже если time не является секундами, в этом случае важен только рейтинг.

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