<转>【DataFrame】数据离散化重组

离散化的原始数据来自 Spark 源码包,离散化函数选用 spark ml 包中的 Bucketizer 方法。

[java]  view plain  copy
  1. package ethink  
  2.   
  3. import org.apache.spark.sql.SQLContext  
  4. import org.apache.spark.SparkConf  
  5. import org.apache.spark.SparkContext  
  6. import org.apache.spark.sql._  
  7. import org.apache.spark.sql.types._  
  8. import org.apache.spark.sql.Row  
  9. import org.apache.spark.ml.feature.Bucketizer  
  10. import org.apache.spark.mllib.linalg.SparseVector  
  11. import org.apache.spark.mllib.linalg.DenseVector  
  12. import org.apache.spark.sql.types.StructType   
  13. import org.apache.spark.ml.feature._  
  14. import org.apache.spark.mllib.regression.LabeledPoint  
  15. import org.apache.spark.mllib.linalg.Vectors  
  16.   
  17. /** 
  18.  * author:Li Ruiqi 
  19.  * DataFrame的离散化重组 
  20.  */  
  21. object fsTest2 {  
  22.   val conf = new SparkConf().setMaster("local").setAppName("RFChurnPredictionByDF")  
  23.   val sc = new SparkContext(conf)  
  24.   val sqlContext = new SQLContext(sc)  
  25.   import sqlContext.implicits._//DataFrame和RDD的隐式转换包  
  26.     
  27.   def main(args: Array[String]): Unit = {  
  28.     val rawData = sc.textFile("D:/javaspace/spark161Test/data/mllib/lr_data.txt")  
  29.     /** 
  30.      * 1000 records (1 - label; 10 - features) 
  31.      */  
  32.     val records = rawData.map(line => line.split(" "))  
  33.   
  34. //设置(NumericalData)DataFrame的字段名-FieldName  
  35.     val TransString = new Array[String](11)  
  36.     TransString(0) = "label"  
  37.     for(i <- 1 to 10 ) {TransString(i) = "var" + (i).toString()}  
  38.     val schemaString = TransString  
  39.       
  40.     val schema = StructType(schemaString.map(fieldName => StructField(fieldName,StringType,true)))  
  41.       
  42.     val newData = records.map { r =>  
  43.         r.map(d => d.toDouble).mkString(",")    
  44.     }  
  45.     val rddRow = newData.map(_.split(",")).map(k => Row.fromSeq(k.toSeq))//RDD[Row]  
  46.       
  47.     val rowDataFrame = sqlContext.createDataFrame(rddRow, schema)//DataFrame格式的label-NumericalData  
  48.     rowDataFrame.show()  
  49.       
  50.     def FieldDiscretization(VarX:String, VarDis:String):DataFrame = { //定制的特征离散化函数  
  51.         val NumVar = rowDataFrame.select(VarX).map(k => k(0).toString.toDouble).collect()  
  52.         val dataFrameNumVar = sqlContext.createDataFrame(NumVar.map(Tuple1.apply)).toDF("features")  
  53.         val sortedVar = NumVar.sorted  
  54.         val splits = Array(NumVar.min,sortedVar(200),sortedVar(400),sortedVar(600),sortedVar(800),NumVar.max)  
  55.         val bucketizer = new Bucketizer()  
  56.           .setInputCol("features")  
  57.           .setOutputCol("bucketedFeatures")  
  58.           .setSplits(splits)  
  59.         val bucketedData = bucketizer.transform(dataFrameNumVar)  
  60. //      bucketedData.show()  
  61.         
  62.         val DisVar = bucketedData.select("bucketedFeatures")//离散化之后的特征列  
  63.                               .withColumnRenamed("bucketedFeatures", VarDis)  
  64.                          
  65.         DisVar  
  66. //     DisVar.show()  
  67.     }  
  68.       
  69.     val Label = rowDataFrame.select("label")  
  70.     var zipOutCome = Label  
  71.       
  72.     for(k <- 1 to 10){  
  73.       val Para1:String = "var" + k.toString()  
  74.       val Para2:String = "var" + k.toString() + "Dis"  
  75.       val VarDis = FieldDiscretization(Para1, Para2)  
  76.       val zipRDD = zipOutCome.rdd.zip(VarDis.rdd).map(x => Row.fromSeq(x._1.toSeq ++ x._2.toSeq))    
  77.       val zipSchame = StructType(zipOutCome.schema ++ VarDis.schema)  
  78.       zipOutCome = sqlContext.createDataFrame(zipRDD, zipSchame)  
  79.     }  
  80.   
  81.     val disDataFrame = zipOutCome//离散化之后的DataFrame: label - features  
  82.     disDataFrame.show()  
  83.       
  84.      /** 
  85.       * 普通的二维表格式转换成机器学习需要的DataFrame的Label和Feature格式 
  86.       */  
  87.        
  88.    def twoDimTableToDFLabelAndFeature(inputDF: DataFrame):DataFrame = {  
  89.      val inputDFLabeledPoint = inputDF.map{row =>  
  90.        val rowToArray = row.toSeq.toArray.map(x => x.toString().toDouble)  
  91.        val label = rowToArray(0)  
  92.        val featuresArray = rowToArray.drop(1)  
  93.        val features = Vectors.dense(featuresArray)  
  94.        LabeledPoint(label,features)   
  95.      }  
  96.      import sqlContext.implicits._  
  97.      val outputDF = inputDFLabeledPoint.toDF("label","features")  
  98.      outputDF  
  99.    }  
  100.       
  101.     val df = twoDimTableToDFLabelAndFeature(disDataFrame)  
  102.     df.show()  
  103.   }  
  104. }  

rowDataFrame.show()


disDataFrame.show()


df.show()

参考文章:http://spark.apache.org/docs/latest/ml-features.html#bucketizer

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
众所周知,人工智能是当前最热门的话题之一, 计算机技术与互联网技术的快速发展更是将对人工智能的研究推向一个新的高潮。 人工智能是研究模拟和扩展人类智能的理论与方法及其应用的一门新兴技术科学。 作为人工智能核心研究领域之一的机器学习, 其研究动机是为了使计算机系统具有人的学习能力以实现人工智能。 那么, 什么是机器学习呢? 机器学习 (Machine Learning) 是对研究问题进行模型假设,利用计算机从训练数据中学习得到模型参数,并最终对数据进行预测和分析的一门学科。 机器学习的用途 机器学习是一种通用的数据处理技术,其包含了大量的学习算法。不同的学习算法在不同的行业及应用中能够表现出不同的性能和优势。目前,机器学习已成功地应用于下列领域: 互联网领域----语音识别、搜索引擎、语言翻译、垃圾邮件过滤、自然语言处理等 生物领域----基因序列分析、DNA 序列预测、蛋白质结构预测等 自动化领域----人脸识别、无人驾驶技术、图像处理、信号处理等 金融领域----证券市场分析、信用卡欺诈检测等 医学领域----疾病鉴别/诊断、流行病爆发预测等 刑侦领域----潜在犯罪识别与预测、模拟人工智能侦探等 新闻领域----新闻推荐系统等 游戏领域----游戏战略规划等 从上述所列举的应用可知,机器学习正在成为各行各业都会经常使用到的分析工具,尤其是在各领域数据量爆炸的今天,各行业都希望通过数据处理与分析手段,得到数据中有价值的信息,以便明确客户的需求和指引企业的发展。
好的,我可以为你介绍一下Pandas库中DataFrame对象的使用。 DataFrame是Pandas库中最重要的数据结构之一,它可以看做是一个二维的表格,类似于Excel中的一个sheet页。DataFrame中每一列可以是不同的数据类型(比如数字、字符串、日期等),并且每一行都有一个唯一的索引值。 下面是一些常用的DataFrame操作和方法: 1. 创建DataFrame对象: 可以通过传入一个字典或者一个二维数组来创建DataFrame对象,例如: ```python import pandas as pd # 通过字典创建DataFrame对象 data = {'name': ['Alice', 'Bob', 'Charlie', 'David'], 'age': [25, 30, 35, 40], 'city': ['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen']} df = pd.DataFrame(data) # 通过二维数组创建DataFrame对象 data = [['Alice', 25, 'Beijing'], ['Bob', 30, 'Shanghai'], ['Charlie', 35, 'Guangzhou'], ['David', 40, 'Shenzhen']] df = pd.DataFrame(data, columns=['name', 'age', 'city']) ``` 2. 查看DataFrame对象: 可以使用head()和tail()方法来查看DataFrame对象的前几行和后几行,使用info()方法来查看DataFrame对象的基本信息,例如: ```python # 查看前几行 print(df.head()) # 查看后几行 print(df.tail()) # 查看基本信息 print(df.info()) ``` 3. 筛选数据: 可以使用loc和iloc方法来筛选DataFrame对象中的数据,例如: ```python # 通过行索引和列索引来筛选数据 print(df.loc[0, 'name']) # 通过行号和列号来筛选数据 print(df.iloc[0, 0]) # 通过布尔表达式来筛选数据 print(df[df['age'] > 30]) ``` 4. 修改数据: 可以使用loc和iloc方法来修改DataFrame对象中的数据,例如: ```python # 修改某个单元格的值 df.loc[0, 'age'] = 26 # 修改某一列的值 df['city'] = 'Beijing' # 添加一列数据 df['gender'] = ['F', 'M', 'M', 'M'] ``` 5. 删除数据: 可以使用drop方法来删除DataFrame对象中的数据,例如: ```python # 删除某一行 df = df.drop(2) # 删除某一列 df = df.drop('gender', axis=1) ``` 以上就是一些常用的DataFrame操作和方法,希望可以帮助到你。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值