pyspark - 使用 QuantileDiscretizer 在 pyspark 中的百分位数排名
问题描述
我想知道是否有可能获得在 pyspark中percentile_rank
使用变压器的结果。QuantileDiscretizer
目的是我试图避免计算percent_rank
整个列,因为它会产生以下错误:
WARN WindowExec: No Partition Defined for Window operation!
Moving all data to a single partition, this can cause serious performance degradation.
我遵循的方法是先使用QuantileDiscretizer
然后归一化为[0,1]:
from pyspark.sql.window import Window
from pyspark.ml.feature import QuantileDiscretizer
from scipy.stats import gamma
X1 = gamma.rvs(0.2, size=1000)
df = spark.createDataFrame(pd.DataFrame(X1, columns=["x"]))
df = df.withColumn("perc_rank", F.percent_rank().over(Window.orderBy("x")))
df = QuantileDiscretizer(numBuckets=df.count()+1,\
inputCol="x",\
outputCol="q_discretizer").fit(df).transform(df)
agg_values = df.agg(F.max(df["q_discretizer"]).alias("maxval"),\
F.min(df["q_discretizer"]).alias("minval")).collect()[0]
xmax, xmin = agg_values.__getitem__("maxval"), agg_values.__getitem__("minval")
normalize = F.udf(lambda x: (x-xmin)/(xmax-xmin))
df = df.withColumn("perc_discretizer", normalize("q_discretizer"))
df = df.withColumn("error", F.round(F.abs(F.col("perc_discretizer")- F.col("perc_rank")),6) )
print(df.select(F.max("error")).show())
df.show(5)
但是,似乎随着数据点数量的增加错误会增加,所以我不确定这是不是正确的方法。
是否可以使用QuantileDiscretizer
获取 percentile_rank ?
或者,有没有一种方法可以percentile_rank
有效地计算整个列?
解决方案
那么您可以使用以下内容来避免警告消息:
X1 = gamma.rvs(0.2, size=10)
df = spark.createDataFrame(pd.DataFrame(X1, columns=["x"]))
df = df.withColumn("dummyCol", F.lit("some_val"))
win = Window.partitionBy("dummyCol").orderBy("x")
df = df.withColumn("perc_rank", F.percent_rank().over(win)).drop("dummyCol")
但尽管如此,数据仍将被移动到单个工作人员,我认为没有更好的选择来避免这里的洗牌,因为需要对完整的列进行排序。
如果您在同一列上有多个窗口,您可以尝试对数据进行预分区,然后应用排名函数。
推荐阅读
- javascript - 错误:未处理的拒绝(TypeError):无法读取未定义的属性“地图”不确定我缺少什么
- python - 为什么我的随机森林算法得到相同的预测?
- laravel - Laravel 和 Vue 分页失败
- html - 如何在每列框之间添加空格
- c# - 在 C# 中将文件转换为位图
- terraform - terratest assert.Equal 不匹配,你能让它们匹配吗?
- python - TypeError: __init__() 在使用自定义层加载模型时得到了一个意外的关键字参数“名称”
- reactjs - 升级 Node.js 模块后出现令人惊讶的 Babel 错误(monaco-editor)
- python-3.x - AttributeError:模块“google.cloud.monitoring_v3.types”没有属性“MetricDescriptor”
- html - 如何使用 XPATH 从 HTML 中查找属性