spark.DataFrame traitement des valeurs aberrantes

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|
+---+---+
Publié 131 articles originaux · louange gagné 81 · vues + 60000

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43469047/article/details/104120549
conseillé
Classement