2017.11.13 jdd数据集构造 pandas模拟SQL group by慢
昨天主要就是玩jdd的比赛,遇到很多问题和困难,如果遇到问题和困难,那就说明我获得了进步的契机,一旦克服这些困难,我就取得了进步。
我遇到的第一个问题是:应该如何构造训练集和测试集,也许我想得太复杂了,其实就和我平时信用建模不一样的吗?用最近多久多久的数据,比如近12个月的逾期情况,1个月内的其他平台借贷次数等等,不就是申请前一段时间的指标吗?然后预测的可能是6个月内发生多少多少天逾期的概率,类比到我这里的问题,我目标是预测未来1个月的借贷金额,指标就是近一个月的XXX,近2个月的XXX,近3个月的XXX等,就和我做信用模型一样的,比如2个月的历史数据太久远和预测label并无关联,就只需要使用近一个月的统计量,当时还去参考了阿里一个比赛的解决方案,大致看了下,想得到一些建立数据集的灵感,但是现在我觉得应该详细地学习下那个案例,才能有更多地收获,包括京东的另外一个比赛案例。
下午和晚上继续做数据集,对t_click和t_order进行了探索,整理一些简单的变量,考虑先统一用一个月的数据去预测下月的贷款金额,但是在抓取变量的时候,由于t_order表过大,根本跑不出来,我尝试了下mysql的解决方法,给date加了索引,实际上这个date的存储方式是varchar,加索引的过程很慢,最后报了一次错,但是索引栏又有这个索引,但是实际查找起来,只要group by uid就很慢,我不知道是什么原因,单独where还可以不是很慢,最后我解决不了,发现pandas的dataframe很快,尝试用dataframe去模拟SQL,学习了一些datafram很骚气的用法,小结一下:
- df的筛选中类似于where子句的in是:df[df[column].isin(1, 2, 3)],not in是df[-df[column].isin(1, 2, 3)]
- df的groupby:df.groupby('uid')['loan_amount'].sum(),groupby后的object就叫groupbydataframe或者groupbyseries,无法输出,后面一般跟具体的列,在跟聚合函数
- 聚合函数除了常用的min/max/avg/sum还有一些直接作用于groupbydataframe结构,比如df.groupby('uid').cumcount(),这个是按uid进行编号,从0开始,可以df.groupby('uid').cumcount()+1,返回的是一个dataframe
- df.assign(rn = )为df添加一个叫rn的字段,添加方法可以是一串values,也可以是一个callable,callable接受的输入是df本身,可以对df.column进行技术
- df.query('column < 3')也可以实现筛选,但是里面是跟一个字符串,字符串中有列名相关的boolean表达式
- df.sort_values(['a','b'], ascending=[False, True]),sort_values可以按多字段排序,类似于SQL,后面ascending决定倒序或正序,也是传一个对应list给ascending参数
- 利用df按列取max的方法和SQL的思路是类似的,groupby max id得到最大,然后isin进行筛选
- 而按列取top2,这个和SQL的思路也是类似的,先编号,然后筛选
差不多了,JDD的进展太缓慢了,无论如何今天完成一个commit再说,pandas够用就行了。
留言
張貼留言