des données anormales (valeurs aberrantes) des moyens que la distribution des données observées avec le reste de l'échantillon écarte sensiblement des.
Définitions importantes varient, mais dans la forme la plus générale, si la quasi - totalité des valeurs Q 1 -. 1,5 pour la IQR et Q . 3 1,5 + la IQR l'intervalle, les IQR moyens gamme interquartile, on peut voir aucune des valeurs aberrantes.
Ces termes peuvent se référer à ce qui précède « on entend des boîtes à moustaches » appréciés
Tout d'abord, exécutez le code suivant
from pyspark.sql import SparkSession
# 配置spark当前环境
spark = SparkSession \
.builder \
.master("local[*]") \
.appName("outliers.py") \
.getOrCreate()
sc = spark.sparkContext
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'])
cols = ['weight', 'height', 'age']
bounds = {}
for col in cols:
# 计算每个特征的上下截断点
quantiles = df_outliers.approxQuantile(
col=col, # 指定列名
probabilities=[0.25, 0.75], # 可以是[0,1]中的数,或者一个列表
relativeError=0.05 # 每个度量的可接受的错误程度
)
IQR = quantiles[1] - quantiles[0]
bounds[col] = [
quantiles[0] - 1.5 * IQR,
quantiles[1] + 1.5 * IQR
]
print("范围是:")
print(bounds, sep="\n", end="\n\n")
outliers = df_outliers.select(*['id'] + [
(
(df_outliers[c] < bounds[c][0]) |
(df_outliers[c] > bounds[c][1])
).alias(c+ '_o') for c in cols
])
print("离群统计表:")
outliers.show()
La sortie est la suivante:
范围是:
{'weight': [91.69999999999999, 191.7], 'height': [4.499999999999999, 6.1000000000000005], 'age': [-11.0, 93.0]}
离群统计表:
+---+--------+--------+-----+
| 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|
+---+--------+--------+-----+
On voit une valeur aberrante en poids, il y a une valeur aberrante dans l'âge
En second lieu, encore une fois dans l'interaction Python Console
Dataframe données remodelage (joindre / fusion), référence peut être pas au courant « de la consolidation des données PANDAS et de remodelage (joindre / fusion des articles »
In[1]:# 根据列id连接df_outlies和outliers
In[2]:df_outliers = df_outliers.join(outliers, on='id')
In[3]:# 根据weight_0列的bool值确定和其他剩余分布明显不同的值
In[4]:df_outliers.filter('weight_o').select('id', 'weight').show()
In[5]:# 根据age_0列的bool值确定和其他剩余分布明显不同的值
In[6]:df_outliers.filter('age_o').select('id', 'age').show()
In[7]:df_outliers.show() #
+---+------+------+---+--------+--------+-----+
| id|weight|height|age|weight_o|height_o|age_o|
+---+------+------+---+--------+--------+-----+
| 7| 129.2| 5.3| 42| false| false|false|
| 6| 124.1| 5.1| 21| false| false|false|
| 5| 133.2| 5.4| 54| false| false|false|
| 1| 143.5| 5.3| 28| false| false|false|
| 3| 342.3| 5.1| 99| true| false| true|
| 2| 154.2| 5.5| 45| false| false|false|
| 4| 144.5| 5.5| 33| false| false|false|
+---+------+------+---+--------+--------+-----+
In[8]: df_outliers.filter('weight_o').show()
+---+------+------+---+--------+--------+-----+
| id|weight|height|age|weight_o|height_o|age_o|
+---+------+------+---+--------+--------+-----+
| 3| 342.3| 5.1| 99| true| false| true|
+---+------+------+---+--------+--------+-----+
In[9]: df_outliers.filter('weight_o').select('id','weight').show()
+---+------+
| id|weight|
+---+------+
| 3| 342.3|
+---+------+
In[10]: df_outliers.filter('age_o').select('id','age').show()
+---+---+
| id|age|
+---+---+
| 3| 99|
+---+---+