美文网首页
如何使用生成器/R的自动最优分箱实现

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

作者: 这是沸羊羊的干爹 | 来源:发表于2018-10-08 10:22 被阅读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的结构和内容,每个模块的结构是什么,哪些模块的结构相同。
    其次确定需要提取的数据模块。

    • 2 TypeError: unhashable type: 'list'
      对数据框dataframe进行去重或者统计等操作。
      因为list是不可哈希的,tuple是可以哈希的。所以如果要用duplicated等对数据框处理操作时,数据框里面不能有list/set/dict的数据类型。

    • 3 hash?

    • 4 数据量很大的情况下,df.groupby处理很慢,如何解决。

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

    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')
    
    • 5 dataframe同时对两列排序
      df.sort_values(by = ['val1','val2'],ascending=(False,False)).reset_index(drop = True,inplace = True)

    • 6 R自动分箱和保存

    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')
    

    相关文章

      网友评论

          本文标题:如何使用生成器/R的自动最优分箱实现

          本文链接:https://www.haomeiwen.com/subject/klvkoftx.html