import os
 import copy
 import codecs
 import operator
 import re
 from math import log
 from pyspark.sql import SQLContext,Row
 from pyspark.mllib.regression import LabeledPoint
 from pyspark import SparkContext, SparkConf
 from pyspark.sql import HiveContext
 from pyspark.mllib.linalg import SparseVector, DenseVector

 #===================================================================================================
 #===============================dataframe计算tags的特征选择=============================================

 df1=sqlContext.sql("select * from zhangb.isntalled_app_sample")

 #总体,各类别样本数量
 cnt_samp=df1.count()
 cnt_samp1=df1.filter(df1.installed==').count()
 cnt_samp0=df1.filter(df1.installed==').count()

 #df1注册为表
 df1.registerTempTable("table1")

 #拆分tags列,统计每个tag的每个类别的数量
 df2=sqlContext.sql("select c.pkg,c.installed,count(*) cnt from \
 (select b.installed,split(b.pkgs,',')[0] pkg  from \
 (select imei,installed,pkgs from table1 a \
 lateral view explode(split(a.installed_applist, ';')) t as pkgs) b \
 where length(b.pkgs)>0 ) c \
 group by c.pkg,c.installed  order by c.pkg,c.installed")

 #df2注册成表 table2
 df2.registerTempTable("table2")
 #sqlContext.cacheTable("table2")

 #计算每个tag的数量

 df3=sqlContext.sql("select h.pkg,(h.sumcnt-h.cnt1) cnt01,h.cnt1 cnt11 \
 from(select g.pkg,g.sumcnt,case when g.cnt1 is null then 0 else g.cnt1 end as cnt1 \
 from(select f.pkg,f.sumcnt,e.cnt1 \
 from(select c.pkg,sum(c.cnt) sumcnt from table2 c group by c.pkg ) f \
 left outer join \
 (select d.pkg,d.cnt cnt1 from table2 d where d.installed=1) e on f.pkg=e.pkg)g)h")

 #sqlContext.uncacheTable("table2")
 #df3.cache()

 #根据相似比选择

 df4=df3.withColumn("cnt00",cnt_samp0-df3.cnt01).withColumn("cnt10",cnt_samp1-df3.cnt11).\
 withColumn("xsb",((df3.cnt11+1.0)/(cnt_samp1+1.0))/((df3.cnt01+1.0)/(cnt_samp0+1.0)))

 ###=============*********以上通用**************************************************************

 # df41=df4.withColumn("ration1",(df4.cnt11+1.0)/(cnt_samp1+1.0)).\
 # withColumn("ration0",(df4.cnt01+1.0)/(cnt_samp0+1.0))

 #直接找显著pkg,不给看细化的了

 df5=df4.filter("xsb>=1.2 or xsb<=0.8").filter("cnt01+cnt11>=15")   #6265个

 def gaivchi(p):
     args=[int(p[3]),int(p[4]),int(p[1]),int(p[2])]
     y1,n1,y2,n2=int(p[3]),int(p[4]),int(p[1]),int(p[2])
     a00,a10,a01,a11=int(p[3]),int(p[4]),int(p[1]),int(p[2])
     chi2=((a00*a11-a10*a01)**2.0)*(a00+a10+a01+a11)/((a00+a10)*(a01+a11)*(a00+a01)*(a10+a11))
     num=2
     if len(args) % num != 0:
         print "Error len(args)"
     arg0=[args[0]+args[2],args[1]+args[3]]
     total0 = sum(arg0) + 0.0
     result0 = 0.0
     for w in arg0:
         if w == 0:
             result0 += 0
         else:
             result0 += w / total0 * log( w / total0, 2)
     result = 0.0
     total = sum(args)+0.0
     for x in xrange(len(args) / num):
         k = x * num
         total_up = 0.0 + sum(args[k:k + num])
         arg1=args[k:k + num]
         total1 = sum(arg1) + 0.0
         result1 = 0.0
         for i in arg1:
            if i == 0:
               result1 += 0
            else:
               result1 += i / total1 * log( i / total1, 2)
         result += total_up / total *(-result1)
     woe00=log(((y1+1.0)/(y1+y2+1.0))/((n1+1.0)/(n1+n2+1.0)))
     iv00=(((y1+1.0)/(y1+y2+1.0))-((n1+1.0)/(n1+n2+1.0)))*woe00
     woe01=log(((y2+1.0)/(y1+y2+1.0))/((n2+1.0)/(n1+n2+1.0)))
     iv01=(((y2+1.0)/(y1+y2+1.0))-((n2+1.0)/(n1+n2+1.0)))*woe01
     iv0=iv00+iv01
     woe10=log(((n1+1.0)/(n1+n2+1.0))/((y1+1.0)/(y1+y2+1.0)))
     woe11=log(((n2+1.0)/(n1+n2+1.0))/((y2+1.0)/(y1+y2+1.0)))
     iv1=((n1+1.0)/(n1+n2+1.0)-((y1+1.0)/(y1+y2+1.0)))*woe10 + ((n2+1.0)/(n1+n2+1.0)-((y2+1.0)/(y1+y2+1.0)))* woe11
     iv2=round((iv0+iv1)/2.0,6)
     return [p[0],p[1],p[2],p[3],p[4],p[5],chi2,-result0-result,iv2]  

 df6=sqlContext.createDataFrame(df5.map(gaivchi),["pkg","cnt01","cnt11","cnt00","cnt10","xsb","chi2","gain","iv"])
 df6.registerTempTable("e")
 df7=sqlContext.sql("select t.pkg,t.xsb,t.chi2,t.gain,t.iv,rank1,rank2,rank3,rank1+rank2+rank3 rank \
 from (select pkg,xsb,chi2,gain,iv, \
 row_number()over (order by chi2 ) rank1, \
 row_number()over (order by gain ) rank2, \
 row_number()over (order by iv ) rank3 \
 from e ) t order by rank desc")

 #输入要选取的pkg个数:
 number=5000

 #输出指定个数的pkg
 df8=sc.parallelize(df7.head(number)).map(lambda p:p[0])

 #rdd文件才能这样保存
 df8.saveAsTextFile('hdfs:./installed_pkg')
=====================================================

    

#输入要选取的pkg个数:
number=10000

#输出指定个数的pkg
lt5_17=sc.parallelize(lt5_16.head(number)).map(lambda p:p[0])

#写成结果矩阵

lt6=sc.broadcast(lt5_17.collect())

def matrix(p):
   temp1=[p[0],p[1]]
   for i in lt6.value:
      if i in p[2]:
         temp1.append(1)
      else:
         temp1.append(0)
      return temp1

lt7=data3.filter(lambda p:len(p[2])>0).map(lambda p:(p[0],p[1],(re.split(";|,",p[2]))))

#输出样本矩阵
lt8=lt7.map(matrix)

colname=["gid","age"]+[x for x in lt6.value]

#添加索引保存列名

lt9=sc.parallelize(colname).zipWithIndex()

#成为数据框 注意此处的列索引是 整数型 不是字符型

lt10=sqlContext.createDataFrame(lt9,["colname","rank_gender"])

#保存为sql文件
#rdd文件才能这样保存

lt8.saveAsTextFile('hdfs://getui-bi-hadoop/user/zhangb/gender_model_matrix')

#dataframe保存为表
lt10.saveAsTable(tableName="gender_model_colname",source="parquet",mode="overwrite")

#####转稀疏矩阵
def sparse(p):
   vec=[int(x) for x in p[2:]]
   lvec=len(vec)
   #ind=vec.index(1)
   dic1={}
   for i in range(lvec):
     if vec[i]==1:
        dic1[i]=1
   return [p[0],p[1],SparseVector(lvec,dic1)]

lt11=lt8.map(sparse)

 

特征工程 dataframe格式的更多相关文章

  1. 机器学习入门-数值特征-连续数据离散化(进行分段标记处理) 1.hist(Dataframe格式直接画直方图)

    函数说明: 1. .hist 对于Dataframe格式的数据,我们可以使用.hist直接画出直方图 对于一些像年龄和工资一样的连续数据,我们可以对其进行分段标记处理,使得这些连续的数据变成离散化 就 ...

  2. Python机器学习笔记 使用sklearn做特征工程和数据挖掘

    特征处理是特征工程的核心部分,特征工程是数据分析中最耗时间和精力的一部分工作,它不像算法和模型那样式确定的步骤,更多的是工程上的经验和权衡,因此没有统一的方法,但是sklearn提供了较为完整的特征处 ...

  3. 手把手教你用Python实现自动特征工程

    任何参与过机器学习比赛的人,都能深深体会特征工程在构建机器学习模型中的重要性,它决定了你在比赛排行榜中的位置. 特征工程具有强大的潜力,但是手动操作是个缓慢且艰巨的过程.Prateek Joshi,是 ...

  4. 机器学习-特征工程-Feature generation 和 Feature selection

    概述:上节咱们说了特征工程是机器学习的一个核心内容.然后咱们已经学习了特征工程中的基础内容,分别是missing value handling和categorical data encoding的一些 ...

  5. Auto-ML之自动化特征工程

    1. 引言 个人以为,机器学习是朝着更高的易用性.更低的技术门槛.更敏捷的开发成本的方向去发展,且Auto-ML或者Auto-DL的发展无疑是最好的证明.因此花费一些时间学习了解了Auto-ML领域的 ...

  6. 谷歌大规模机器学习:模型训练、特征工程和算法选择 (32PPT下载)

    本文转自:http://mp.weixin.qq.com/s/Xe3g2OSkE3BpIC2wdt5J-A 谷歌大规模机器学习:模型训练.特征工程和算法选择 (32PPT下载) 2017-01-26  ...

  7. Kaggle:Home Credit Default Risk 特征工程构建及可视化(2)

    博主在之前的博客 Kaggle:Home Credit Default Risk 数据探索及可视化(1) 中介绍了 Home Credit Default Risk 竞赛中一个优秀 kernel 关于 ...

  8. python 机器学习库 —— featuretools(自动特征工程)

    文档:https://docs.featuretools.com/#minute-quick-start 所谓自动特征工程,即是将人工特征工程的过程自动化.以 featuretools 为代表的自动特 ...

  9. 想搞机器学习,不会特征工程?你TM逗我那!

    原文:http://dataunion.org/20276.html 作者:JasonDing1354 引言 在之前学习机器学习技术中,很少关注特征工程(Feature Engineering),然而 ...

随机推荐

  1. TCP链接时主动close时可能的rst报文

    阿里核心系统团队博客http://csrd.aliapp.com/?p=1055记录了主动关闭TCP socket时,可能不发fin包,而是发rst的问题. 其原因是主动关闭socket时,若接收bu ...

  2. JavaScript中“typeof”运算符与“instanceof”运算符的差异

    在JavaScript中,运算符“typeof”和“instanceof”都可以用来判断数据的类型,那么这两个运算符有什么不同之处呢? 差异一:使用方式不同. 最明显的差异就是这两个运算符的使用方式了 ...

  3. Unity3D特效-场景淡入淡出

    最近公司开始搞Unity3D..整个游戏..特效需求还是比较多的.关于UI部分的特效淡入淡出.看网上用的方法都是用个黑东东遮挡然后设置alpha这么搞....本大神感觉非常的low.而且很渣.故奋笔疾 ...

  4. linux服务之tuned

    RHEL/CentOS 在 6.3 版本以后引入了一套新的系统调优工具 tuned/tuned-adm,其中 tuned 是服务端程序,用来监控和收集系统各个组件的数据,并依据数据提供的信息动态调整系 ...

  5. jquery选择器之子元素

    HTML代码: :first-child 匹配第一个子元素,每个父元素的第一个子元素 :last-child 匹配最后一个子元素,每个父元素的最后一个子元素 <!DOCTYPE html> ...

  6. MyEclipse Spring 学习总结三 SpringMVC

    MyEclipse Spring 学习总结三 SpringMVC 一.SpringMVC原理 1.Springmvc 框架介绍 1)Spring 框架停工了构建Web应用程序的全功能MVC模块.Spr ...

  7. Spring Framework----定时任务的执行和调度

    1. 简介 spring framework 为任务的异步执行和调度提供了抽象接口分别是:TaskExecutor 和 TaskScheduler,spring 对这些接口的进一步实现支持线程池或者将 ...

  8. php_sapi_name详解

    php_sapi_name : — 返回 web 服务器和 PHP 之间的接口类型. 返回描述 PHP 所使用的接口类型(the Server API, SAPI)的小写字符串. 例如,CLI 的 P ...

  9. Maven依赖排除 禁止依赖传递 取消依赖的方法

    大家都知道Maven的优点是依赖管理,特别是前期使用ANT的开发者都有很多感触.最近要开发一个java工程,定的要使用maven,会使用hadoop和hbase的客户端,而引入一个hadoop-cli ...

  10. Lambda表达式的演化,委托-匿名方法-Func-Lambda

    匿名方法 很多时候委托接收的方法是一次性的或者方法体是非常简单的... 例三: 我们可以写成: 有没有发现我们每次都要定义委托,很多时候签名可能是一样的.这样就没有必要定义重复的. 然后又过了很久很久 ...