pyspark之数据处理学习【离群值】(3)

来源:互联网 发布:java有哪些框架 编辑:程序博客网 时间:2024/06/06 09:58

pyspark系列文章是本人根据《PySpark实战指南》学习pyspark中学习笔记,这本书是一本译文,有些地方感觉有点小问题,不过在本人的这些笔记中都是亲自测试跑通后的小例子。仅作参考和学习。

在做数据分析等时候,时长会碰到与样本其余数据的分布有显著偏离的数据,这种数据被称为离群值。在普遍的形式中,如果所有的值大致在Q1-1.5IQR和Q3+1.5IQR范围内(IQR指的是四分位范围,定义为上分位与下分位之差,分别为第75个百分位(Q3)和第25个百分位(Q1)),则可以认为没有离群值。

from pyspark.sql import SparkSessionspark = SparkSession.builder.appName("dataDeal").getOrCreate()df_outliers = spark.createDataFrame([    (1, 143.5, 5.3, 28),    (2, 154.2, 5.5, 45),    (3, 342.3, 5.1, 99),    (4, 144.5, 5.5, 33),    (5, 133.2, 5.4, 54),    (6, 124.1, 5.1, 21),    (7, 129.2, 5.3, 42),    ], ['id', 'weight', 'height', 'age'])
现在我们可以根据之前的定义来标记离群值。首先计算每个特征的上下截断点。使用.approxQuantile()方法,它的第一个参数指定的是列名,第二个参数可以是0或1之间的一个数(其中0.5是指计算的中位数)或者一个列表,第单个参数指定每个度量的一个可接受的误差范围(如果设置为0,就会计算一个度量的精确值,但是这么做代价会很大)

cols = ['weight','height','age']bounds = {}for col in cols:    quantiles = df_outliers.approxQuantile(col,[0.25,0.75],0.05)    IQR = quantiles[1] - quantiles[0]    bounds[col] = [        quantiles[0] - 1.5*IQR,        quantiles[1] + 1.5*IQR    ]print bounds
{'age': [-11.0, 93.0],  'weight': [91.69999999999999, 191.7],  'height': [4.499999999999999, 6.1000000000000005]}
现在用它来标记离群值:

#标记离群值outliers = df_outliers.select(*['id']+[(    (df_outliers[c] < bounds[c][0]) |    (df_outliers[c]>bounds[c][1])).alias(c+'_o') for c in cols])outliers.show()
+---+--------+--------+-----+| id|weight_o|height_o|age_o|+---+--------+--------+-----+|  1|   false|   false|false||  2|   false|   false|false||  3|    true|   false| true||  4|   false|   false|false||  5|   false|   false|false||  6|   false|   false|false||  7|   false|   false|false|+---+--------+--------+-----+
由结果可知,在weight中有一个离群值,在age中有一个离群值。现在,我们已经完成了离群值的提取。下面列出了和其他数据分不明显不同的值:

#列出和其他数据分布明显不同的值df_outliers = df_outliers.join(outliers,on='id')df_outliers.filter('weight_o').select('id','weight').show()df_outliers.filter('age_o').select('id','age').show()
+---+------+| id|weight|+---+------+|  3| 342.3|+---+------++---+---+| id|age|+---+---+|  3| 99|+---+---+

对得到的离群值,需要做怎样的处理就需要根据需求而定了

原创粉丝点击