如何根据截止值过滤交易数据?
How to filter the transaction data based on a cutoff value?
这是我的交易数据:
data:
id from_id to_id amount date_trx
<fctr> <fctr> <fctr> <dbl> <date>
0 7468 5695 700.0 2005-01-04
1 6213 9379 11832.0 2005-01-08
2 7517 8170 1000.0 2005-01-10
3 6143 9845 4276.0 2005-01-12
4 6254 9640 200.0 2005-01-14
5 6669 5815 200.0 2005-01-20
6 6934 8583 49752.0 2005-01-24
7 9240 8314 19961.0 2005-01-26
8 6374 8865 1000.0 2005-01-30
9 6143 6530 13.4 2005-01-31
...
我要过滤数据如下:
如果在转账链中的任何一点,账户收到的钱与离开初始发送方的钱的比率高于阈值,比如 0.9,( 即 1 ≥ (second_transacted_amount / first_transacted_amount) > 0.9 ), 那么我想提取这些账户并保存以备后用。
例如,此处账户“7468”在 2005-01-04 向账户“5695”发送了 700.0 美元。在此交易之后,假设“5695”进行了超过 700.0 但不完全是 700.0 的 90% 的交易。还有一点很重要:第二笔交易应该总是先于第一笔交易。因此,date_trx 变量在这种情况下也很重要。我怎样才能对整个数据(在 R 中)执行此操作?
我们可以有一个小数据集来测试:
id from_id to_id amount date_trx
<fctr> <fctr> <fctr> <dbl> <date>
0 A B 200.0 2005-07-08
1 B C 185.0 2005-08-20
2 B E 50.0 2005-10-19
3 C B 170.0 2005-05-08
4 C D 40.0 2005-09-19
5 D F 38.0 2005-07-13
考虑到 B 的交易,
0 A B 200.0 2005-07-08
1 B C 185.0 2005-08-20
2 B E 50.0 2005-10-19
3 C B 170.0 2005-05-08
由于以下交易对,B 应被标记为可疑
0 A B 200.0 2005-07-08
1 B C 185.0 2005-08-20
基于同样的推理,考虑来自或至 C 的交易
1 B C 185.0 2005-08-20
3 C B 170.0 2005-05-08
4 C D 40.0 2005-09-19
C 不应被标记为可疑
可以针对 from_id 进行举报:
输出可能与此类似:
id from_id to_id amount date_trx suspicious
<fctr> <fctr> <fctr> <dbl> <date> <fctr>
0 A B 200.0 2005-07-08 N
1 B C 185.0 2005-08-20 Y
2 B E 50.0 2005-10-19 Y
3 C B 170.0 2005-05-08 N
4 C D 40.0 2005-09-19 N
5 D F 38.0 2005-07-13 N
可以使用 sqldf
包使用 SQL 语法来完成。
这是它如何与您的示例一起工作
library(sqldf)
data <- data.frame(id = factor(c(0, 1, 2, 3, 4, 5)),
from_id = factor(c("A", "B", "B", "C", "C", "D")),
to_id = factor(c("B", "C", "E", "B", "D", "F")),
amount = c(200, 185, 50, 170, 40, 38),
date_trx = c(0708, 0820, 1019, 0508, 0919, 0713)))
由于所有信息都来自一年,所以我将变量 date_trx
视为月-日数字,但也可以将其视为年-月-日。
下面的查询returns预期是什么:
sqldf("select a.*, coalesce(b.suspicious, 'N') as suspicious
from data a
left join (select distinct b.from_id, 'Y' as suspicious
from data a
inner join data b
on a.to_id = b.from_id and
a.date_trx < b.date_trx and
b.amount/a.amount > 0.9) b
on a.from_id = b.from_id")
R 控制台中的returns
id from_id to_id amount date_trx suspicious
1 0 A B 200 708 N
2 1 B C 185 820 Y
3 2 B E 50 1019 Y
4 3 C B 170 508 N
5 4 C D 40 919 N
6 5 D F 38 713 N
看来你正在努力检测欺诈,如果是这样的话,这种方法不能实时工作,但你可以看看这篇论文中的图 1 https://arxiv.org/pdf/2002.05988.pdf 来了解一下如何实现实时可疑检测的代码。
这是我的交易数据:
data:
id from_id to_id amount date_trx
<fctr> <fctr> <fctr> <dbl> <date>
0 7468 5695 700.0 2005-01-04
1 6213 9379 11832.0 2005-01-08
2 7517 8170 1000.0 2005-01-10
3 6143 9845 4276.0 2005-01-12
4 6254 9640 200.0 2005-01-14
5 6669 5815 200.0 2005-01-20
6 6934 8583 49752.0 2005-01-24
7 9240 8314 19961.0 2005-01-26
8 6374 8865 1000.0 2005-01-30
9 6143 6530 13.4 2005-01-31
...
我要过滤数据如下:
如果在转账链中的任何一点,账户收到的钱与离开初始发送方的钱的比率高于阈值,比如 0.9,( 即 1 ≥ (second_transacted_amount / first_transacted_amount) > 0.9 ), 那么我想提取这些账户并保存以备后用。
例如,此处账户“7468”在 2005-01-04 向账户“5695”发送了 700.0 美元。在此交易之后,假设“5695”进行了超过 700.0 但不完全是 700.0 的 90% 的交易。还有一点很重要:第二笔交易应该总是先于第一笔交易。因此,date_trx 变量在这种情况下也很重要。我怎样才能对整个数据(在 R 中)执行此操作?
我们可以有一个小数据集来测试:
id from_id to_id amount date_trx
<fctr> <fctr> <fctr> <dbl> <date>
0 A B 200.0 2005-07-08
1 B C 185.0 2005-08-20
2 B E 50.0 2005-10-19
3 C B 170.0 2005-05-08
4 C D 40.0 2005-09-19
5 D F 38.0 2005-07-13
考虑到 B 的交易,
0 A B 200.0 2005-07-08
1 B C 185.0 2005-08-20
2 B E 50.0 2005-10-19
3 C B 170.0 2005-05-08
由于以下交易对,B 应被标记为可疑
0 A B 200.0 2005-07-08
1 B C 185.0 2005-08-20
基于同样的推理,考虑来自或至 C 的交易
1 B C 185.0 2005-08-20
3 C B 170.0 2005-05-08
4 C D 40.0 2005-09-19
C 不应被标记为可疑
可以针对 from_id 进行举报:
输出可能与此类似:
id from_id to_id amount date_trx suspicious
<fctr> <fctr> <fctr> <dbl> <date> <fctr>
0 A B 200.0 2005-07-08 N
1 B C 185.0 2005-08-20 Y
2 B E 50.0 2005-10-19 Y
3 C B 170.0 2005-05-08 N
4 C D 40.0 2005-09-19 N
5 D F 38.0 2005-07-13 N
可以使用 sqldf
包使用 SQL 语法来完成。
这是它如何与您的示例一起工作
library(sqldf)
data <- data.frame(id = factor(c(0, 1, 2, 3, 4, 5)),
from_id = factor(c("A", "B", "B", "C", "C", "D")),
to_id = factor(c("B", "C", "E", "B", "D", "F")),
amount = c(200, 185, 50, 170, 40, 38),
date_trx = c(0708, 0820, 1019, 0508, 0919, 0713)))
由于所有信息都来自一年,所以我将变量 date_trx
视为月-日数字,但也可以将其视为年-月-日。
下面的查询returns预期是什么:
sqldf("select a.*, coalesce(b.suspicious, 'N') as suspicious
from data a
left join (select distinct b.from_id, 'Y' as suspicious
from data a
inner join data b
on a.to_id = b.from_id and
a.date_trx < b.date_trx and
b.amount/a.amount > 0.9) b
on a.from_id = b.from_id")
R 控制台中的returns
id from_id to_id amount date_trx suspicious
1 0 A B 200 708 N
2 1 B C 185 820 Y
3 2 B E 50 1019 Y
4 3 C B 170 508 N
5 4 C D 40 919 N
6 5 D F 38 713 N
看来你正在努力检测欺诈,如果是这样的话,这种方法不能实时工作,但你可以看看这篇论文中的图 1 https://arxiv.org/pdf/2002.05988.pdf 来了解一下如何实现实时可疑检测的代码。