📜  Bucketizer pyspark - Python (1)

📅  最后修改于: 2023-12-03 15:29:40.710000             🧑  作者: Mango

Bucketizer pyspark - Python

Bucketizer是Pyspark的一个函数,用于将连续的数值数据转化成离散的类别数据。例如,我们可以将身高数据转换成身高段,或者将温度数据转换成温度级别等等。

如何使用Bucketizer?

Bucketizer函数的使用相对简单。我们首先要导入Pyspark的相关库,包括SparkContext和SQLContext:

from pyspark import SparkContext
from pyspark.sql import SparkSession
from pyspark.sql.functions import *
from pyspark.ml.feature import Bucketizer

# 创建SparkSession对象
spark = SparkSession.builder.appName('BucketizerExample').getOrCreate()

# 载入数据
df = spark.createDataFrame([(0, 18.5), (1, 20.2), (2, 26.5), (3, 28.1), (4, 31.5)], ['id', 'age'])

# 设置划分边界
splits = [-float("inf"), 20, 25, 30, float("inf")]

# 对数据进行划分并保存成新列
bucketizer = Bucketizer(splits=splits, inputCol="age", outputCol="age_bucket")
df_bucketed = bucketizer.transform(df)

# 展示转换后的数据
df_bucketed.show()

上述代码中,我们使用了createDataFrame来创建了一个包含身份id和身高age的DataFrame。接着,我们设置了划分边界splits,将age划分成小于20、20到25、25到30、大于30四个段位。接着,我们使用Bucketizer函数对age进行了划分,并将结果保存在了age_bucket列中。最后,我们展示了转换后的数据。

Bucketizer函数参数说明

Bucketizer函数有几个必要参数和几个可选参数:

必要参数:
  • splits: 划分的边界,类型为一个数组。例如,[-float("inf"), 20, 25, 30, float("inf")] 表示将数据划分成小于20、20到25、25到30、大于30四个部分。

  • inputCol: 包含待划分数值数据的列名。

  • outputCol: 划分后的输出列名。

可选参数:

这些可选参数都有默认值。

  • handleInvalid: 用于处理无效值情况的选项。有两种可选值:error和keep。error表示将无效值报错,keep表示将无效值保留。

  • numBuckets: 离散化出的桶的数量。默认值为0,表示自动探测。

Bucketizer函数常见问题
1. Bucketizer要求输入数据必须为数值类型,怎么处理离散型数据?

我们可以使用StringIndexer将字符串类型的离散型数据转换成数值类型:

from pyspark.ml.feature import StringIndexer

df = spark.createDataFrame([(0, "female"), (1, "male"), (2, "male"), (3, "female"), (4, "other")], ['id', 'gender'])
indexer = StringIndexer(inputCol="gender", outputCol="gender_indexed")
df_indexed = indexer.fit(df).transform(df)

df_indexed.show()
2. Bucketizer如何划分负数?

我们可以使用负无穷和正无穷来设置划分边界:

splits = [-float("inf"), 0, float("inf")]
bucketizer = Bucketizer(splits=splits, inputCol="age", outputCol="age_b")
df_bucketed = bucketizer.transform(df)

df_bucketed.show()
结论

Bucketizer函数是一个非常有用的函数,它可以将连续的数值数据转换成离散的类别数据,方便我们进行数据分析和建模。在使用时,我们要注意输入数据必须为数值类型,并且合理设置划分边界。