如何使用生成器/R的自动最优分箱实现

2018-10-08  本文已影响0人  这是沸羊羊的干爹

Python分析建模,日常问题整理(十)


2018.09.26~2018.10.1
离2019<100天


  1. json数据解析

json.dumps() 将Python对象转化为json
json.loads() 将已编码的 JSON 字符串解码为 Python 对象
dict_.get('keys_',default_value) get函数返回指定键的值,如果值不在字典中返回默认值。
首先了解json的结构和内容,每个模块的结构是什么,哪些模块的结构相同。
其次确定需要提取的数据模块。

可以使用生成器,每次生成一小块不重复的数据,然后逐一将数据拼接起来。循环时输出处理进度。这样不占用内存,又可以看到处理过程。

def createGenerator():
    set_id = list(set(tem_df['id_num']))
    for n in range(215):
        if n<215:
            tem_dat = tem_df[tem_df['report_id'].isin(set_id[n:(n+2000)])]
            n = n*2000
            print('第%d个report_id'%n)
        else :
            tem_dat = tem_df[tem_df['report_id'].isin(set_id [n:])]
        yield tem_dat.groupby(['id'])

# 调用生成器
t1 = datetime.datetime.now()
final_ = pd.DataFrame([])
for group1 in mygenerator:
    tem = group1.agg({'rule_name':'counts']})
    final_ = pd.concat([final_ ,tem ],axis = 0)
    t2 = datetime.datetime.now()
    print('累积处理时长:',(t2-t1).seconds,'s')
d = list()
for(i in names(dat)[1:10])  {
  tem1 = dat[dat[,i]!=-99999,]
  tem2 = dat[(dat[,i]!=-99999)&(dat[,i]!=0),]
  print(i)
  if("出现错误" %in% tryCatch(smbinning(df = tem1,y='y',x=i,p=0.1),
                          error=function(e){print("出现错误")} )) next
  if("try-error" %in% class(try(smbinning(df = tem1,y='y',x=i,p=0.1)$ivtable,silent = TRUE))){
    print('try-error')
    result = smbinning(df = tem2,y='y',x=i,p=0.1)
    x.inv = try(result$ivtable,silent = TRUE)
    if("try-error" %in% class(x.inv)) next
    print(result$cuts) 
    d[[i]] <- paste(c(0,result$cuts),collapse=",")
    
  }else{
    result = smbinning(df = tem1,y='y',x=i,p=0.1)
    x.inv = try(result$ivtable,silent = TRUE)
    if("try-error" %in% class(x.inv)) next
    # print(result$ivtable)
    print(result$cuts)  
    d[[i]] <- paste(result$cuts,collapse=",")
  }
}

write.table(data.frame(d),'r_smbinnin.txt')
上一篇 下一篇

猜你喜欢

热点阅读