楼主: tyaer
2901 5

[实际应用] 如何用R实现银行常见的这个指标计算算法,求教,很有用 [推广有奖]

  • 3关注
  • 3粉丝

已卖:866份资源

讲师

45%

还不是VIP/贵宾

-

威望
0
论坛币
4880 个
通用积分
9.7412
学术水平
1 点
热心指数
3 点
信用等级
0 点
经验
5996 点
帖子
663
精华
0
在线时间
233 小时
注册时间
2005-12-10
最后登录
2024-7-25

楼主
tyaer 发表于 2016-7-17 09:52:36 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
例如:银行持借记卡人的交易明细数据
card_no   tran_id   tran_dt                        tran_type  
1234567  1001      2016-07-07 18:02:30  查询      
1234567  1002      2016-07-08 09:22:15  支付
1234567  1003      2016-07-10 11:23:40  登录
1234567  1004      2016-07-11 15:12:30  支付
2222222  2221      2016-07-12 18:02:30  登录
2222222  2222      2016-07-14 09:22:15  支付
2222222  2223      2016-07-16 11:33:40  支付

想要得到的结果是: 计算每一个卡号下、每一笔交易对应的满足条件的指标。
比如 cnt_zhifu_2day  当前交易前2天支付的次数
       cnt_login_2day  当前交易前2天登录的次数

最终是这样的结果                                       
card_no   tran_id   tran_dt                        tran_type  cnt_zhifu_2day    cnt_login_2day
1234567  1001      2016-07-07 18:02:30  查询          0                         0            
1234567  1002      2016-07-08 09:22:15  支付          0                         0            
1234567  1003      2016-07-10 11:23:40  登录          1                         0            
1234567  1004      2016-07-11 15:12:30  支付          0                         1            
2222222  2221      2016-07-12 18:02:30  登录          0                         0            
2222222  2222      2016-07-14 09:22:15  支付          0                         1            
2222222  2223      2016-07-15 11:33:40  支付          1                         0   

上面举例中只有2张银行卡,现实中有上千万张卡,交易笔数上亿。

请大家帮忙看看怎么计算,谢谢!

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:指标计算 如何用 R实现 login type 借记卡 如何

本帖被以下文库推荐

卖油翁说:“无他,唯熟耳!”

沙发
jiangbeilu 学生认证  发表于 2016-7-17 10:38:40
用lubridate包处理一下时间,然后再用dplyer包筛选一下就可以了:
我把时间改了一下:
如下图:
查询交易.png

代码如下:
  1. options(stringsAsFactors=F)
  2. bank_data <- read.csv("查询交易.csv")
  3. library(lubridate)
  4. library(dplyr)
  5. bank_data %>% mutate(tran_dt=ymd_hm(tran_dt)) %>%filter(tran_dt>(Sys.time()-2*24*3600))%>%
  6. group_by(card_no,tran_id,tran_type) %>% summarise_each(funs(length),tran_dt)
复制代码
数据附件如下:
查询交易.rar (253 Bytes) 本附件包括:
  • 查询交易.csv

这里,只输出你的查询结果,因为你也说数据量比较大,只列出查询结果出来,如果你想看详细资料,可以再提取。
如果上述代码运行不流畅,建议你使用数据库查询。

已有 1 人评分学术水平 热心指数 信用等级 收起 理由
henrylx13 + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

Tomorrow is another day!

藤椅
马甲1号 发表于 2016-7-17 19:56:59
jiangbeilu 发表于 2016-7-17 10:38
用lubridate包处理一下时间,然后再用dplyer包筛选一下就可以了:
我把时间改了一下:
如下图:
逻辑没这么简单吧,感觉楼主的意思是滚动计算支付和登录天数,而不是仅仅计算截至今天为止两天内的支付和登录次数。
已有 1 人评分论坛币 收起 理由
jiangbeilu + 10 鼓励积极发帖讨论

总评分: 论坛币 + 10   查看全部评分

板凳
jiangbeilu 学生认证  发表于 2016-7-17 20:38:59
马甲1号 发表于 2016-7-17 19:56
逻辑没这么简单吧,感觉楼主的意思是滚动计算支付和登录天数,而不是仅仅计算截至今天为止两天内的支付和 ...
先从基本的框架做起。不知道你说的滚动是什么,意思是可以提前n天,这个天数是可以变的,还是?
基本框架就在这里了,想计算提前多少天,或者从哪天开始算起,可以自己根据上述代码,进行调整,改成函数,设置参数,应该是可以满足这方面的要求的。

报纸
马甲1号 发表于 2016-7-17 21:29:00
做了一个纯sql的解法,没优化过,但愿有帮助。在postgres上面测试通过。
  1. drop table foo;
  2. create table foo(card_no integer, tran_id integer,tran_dt timestamp, trans_type varchar(10));
  3. insert into foo(card_no,tran_id,tran_dt, trans_type) values (1234567,1001,'2016-07-07 18:02:30','查询'),(1234567,1002,'2016-07-08 09:22:15','支付'),(1234567,1003,'2016-07-10 11:23:40','登录'),(1234567,1004,'2016-07-11 15:12:30','支付'),(2222222,2221,'2016-07-12 18:02:30','登录'),(2222222,2222,'2016-07-14 09:22:15','支付'),(2222222,2223,'2016-07-16 11:33:40','支付');


  4. with zf as  
  5. (select card_no,tran_dt as zf_dt, date_trunc('days',tran_dt) as bg, date_trunc('days',tran_dt)+ make_interval(days=>2) as ed, 1 as zf from foo where trans_type='支付'),
  6. dl as  
  7. (select card_no, tran_dt as dl_dt, date_trunc('days',tran_dt) as bg, date_trunc('days',tran_dt)+ make_interval(days=>2) as ed, 1 as dl from foo where trans_type='登录'),
  8. cnt as (
  9. select tran_id, sum(zf.zf)as zf_cnt , sum(dl.dl) as dl_cnt from foo left join zf on zf.card_no=foo.card_no and date_trunc('days',foo.tran_dt) > zf.bg and date_trunc('days',foo.tran_dt)<=zf.ed left join dl on dl.card_no=foo.card_no and date_trunc('days',foo.tran_dt) > dl.bg and date_trunc('days',foo.tran_dt)<=dl.ed group by tran_id)
  10. select * from foo join cnt on foo.tran_id=cnt.tran_id
复制代码


结果:
card_no         tran_id         tran_dt         trans_type         tran_id         zf_cnt         dl_cnt
1234567         1001         2016-07-07 18:02:30         查询         1001                
1234567         1002         2016-07-08 09:22:15         支付         1002                
1234567         1003         2016-07-10 11:23:40         登录         1003         1        
1234567         1004         2016-07-11 15:12:30         支付         1004                 1
2222222         2221         2016-07-12 18:02:30         登录         2221                
2222222         2222         2016-07-14 09:22:15         支付         2222                 1
2222222         2223         2016-07-16 11:33:40         支付         2223         1        
已有 1 人评分论坛币 收起 理由
jiangbeilu + 20 精彩帖子

总评分: 论坛币 + 20   查看全部评分

地板
tyaer 发表于 2016-7-18 09:24:49
谢谢楼上的各位热心朋友。 感谢。

R的代码可能需要研究下。
SQL的代码之前想的和兄弟的差不多,只是如果衍生一两百个指标跑起来比较慢,但是容易理解。

再次感谢各位。

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-9 16:52