Добавить новые переменные набор финансовых данных r - PullRequest
0 голосов
/ 07 февраля 2020

У меня есть вопрос о наборе данных финансовой транзакции. Набор данных выглядит следующим образом:

    Account_from  Account_to  Value  Timestamp  
1         1           2        10        1
2         1           3        15        1
3         3           4        20        1
4         2           1        10        2
5         1           3        25        2
6         2           1        15        3
7         1           3        10        3
8         1           4        20        4

Я хотел бы создать пару дополнительных переменных на основе столбца account from. Переменные, которые я хочу создать: (total value out of account from in the last two timestamps),

(total value incoming of account from in the last two timestamps),

(total transaction value out that timestamp of all transaction done during that timestamp),

(value out of account from / previous value out of account from),

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

    Acc_from  Acc_to  Value  Timestamp  Tot_val_out  Tot_val_inc  Tot_val_out_1time   val_out/prev_val_out
1       1        2     10        1           10           0              45                    0
2       1        3     15        1           25           0              45                   1.5
3       3        4     20        1           20           15             45                    0
4       2        1     10        2           10           10             35                    0
5       1        3     25        2           50           10             35                   1.67
6       2        1     15        3           25           0              25                   1.5
7       1        3     10        3           35           25             25                   0.4
8       1        4     20        4           30           15             20                    2

Например, строка 5 tot_val_out равна 50, это означает, что учетная запись 1 передала сумму 50 в двух последних временных метках (временные метки 1 и 2). В строке 8 счета 1 переведены 30 в последние две отметки времени (отметки времени 3 и 4).

То же самое должно быть сделано для входящего значения.

Дополнительно я хотел бы создать переменные:

(number of transactions done by account from in the previous 4 timestamps)

(number of transactions done by account from in the previous 2 timestamps)

Так что:

    Account_from  Account_to  Value  Timestamp  Transactions_previous4  Transactions_previous2
1         1           2        10        1                 1                      1
2         1           3        15        1                 2                      2
3         3           4        20        1                 1                      1
4         2           1        10        2                 1                      1
5         1           3        25        2                 3                      3
6         2           1        15        3                 2                      2
7         1           3        10        3                 4                      2
8         1           4        20        4                 5                      2

В строке 8 счет 1 совершил 5 транзакций за последние 4 временные метки (временные метки с 1 по 4), но за последние 2 временные метки (временные метки 3 и 4) только 2 транзакции.

Я не могу понять, как это сделать это. Было бы очень полезно, если бы кто-то знал, как это сделать.

Заранее спасибо,

1 Ответ

0 голосов
/ 12 февраля 2020

Вот базовый код R

for (k in seq(nrow(df))) {
  nr <- seq(nrow(df))
  Account_from <- df$Account_from
  Account_to <- df$Account_to
  Value <- df$Value
  Timestamp <- df$Timestamp

  df$Tot_val_out[k] <- sum(Value[which(Account_from == Account_from[k] & Timestamp %in% (Timestamp[k]-(1:0)) & nr<=k)])
  df$Tot_val_in[k] <- sum(Value[which(Account_to == Account_from[k] & Timestamp %in% (Timestamp[k]-(1:0)) & nr<=k)])
  df$Transactions_previous4[k] <- length(which(Account_from == Account_from[k] & Timestamp %in% (Timestamp[k]-(3:0)) & nr<=k))
  df$Transactions_previous2[k] <- length(which(Account_from == Account_from[k] & Timestamp %in% (Timestamp[k]-(1:0)) & nr<=k))
}

dfout <- cbind(df,
               with(df,
                    data.frame(Tot_val_out_1time = ave(Value,Timestamp,FUN = sum),
                               val_out_prev_val_out = ave(Value, Account_from, FUN = function(x) c(0,x[-1]/x[-length(x)])))))

такой, что

> dfout
  Account_from Account_to Value Timestamp Tot_val_out Tot_val_in Transactions_previous4 Transactions_previous2 Tot_val_out_1time val_out_prev_val_out
1            1          2    10         1          10          0                      1                      1                45             0.000000
2            1          3    15         1          25          0                      2                      2                45             1.500000
3            3          4    20         1          20         15                      1                      1                45             0.000000
4            2          1    10         2          10         10                      1                      1                35             0.000000
5            1          3    25         2          50         10                      3                      3                35             1.666667
6            2          1    15         3          25          0                      2                      2                25             1.500000
7            1          3    10         3          35         25                      4                      2                25             0.400000
8            1          4    20         4          30         15                      5                      2                20             2.000000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...