Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spark Scala-Winsorize组内的数据帧列_Scala_Apache Spark_Statistics_Data Science - Fatal编程技术网

Spark Scala-Winsorize组内的数据帧列

Spark Scala-Winsorize组内的数据帧列,scala,apache-spark,statistics,data-science,Scala,Apache Spark,Statistics,Data Science,我正在对机器学习输入的数据进行预处理,这是一个目标值列,称之为“价格”有许多离群值,我不想在整个集合中赢取价格,而是想在标有“产品类别”的组中赢取价格。还有其他功能,产品类别只是一个与价格相关的标签 有一个Scala stat函数非常有效: df_data.stat.approxQuantile(“价格”,数组(0.01,0.99),0.00001) //res19:Array[Double]=数组(3.13318.54) 不幸的是,它不支持计算组内的分位数。它也不支持窗口分区 df_数据 .

我正在对机器学习输入的数据进行预处理,这是一个目标值列,称之为“价格”有许多离群值,我不想在整个集合中赢取价格,而是想在标有“产品类别”的组中赢取价格。还有其他功能,产品类别只是一个与价格相关的标签

有一个Scala stat函数非常有效:

df_data.stat.approxQuantile(“价格”,数组(0.01,0.99),0.00001)
//res19:Array[Double]=数组(3.13318.54)
不幸的是,它不支持计算组内的分位数。它也不支持窗口分区

df_数据
.groupBy(“产品类别”)
.近似分位数($“价格”,数组(0.01,0.99),0.00001)
//错误:值approxQuantile不是的成员
//org.apache.spark.sql.RelationalGroupedDataset
为了替换超出该范围的值,例如winsorizing,在spark数据帧组内计算p01和p99的最佳方法是什么

我的数据集模式可以想象成这样,它有超过20MM行,appx 10K不同的标签用于“product_category”,因此性能也是一个问题

df_data and a winsorized price column:
+---------+------------------+--------+---------+
|   item  | product_category |  price | pr_winz |
+---------+------------------+--------+---------+
| I000001 |     XX11         |   1.99 |   5.00  |
| I000002 |     XX11         |  59.99 |  59.99  |
| I000003 |     XX11         |1359.00 | 850.00  |
+---------+------------------+--------+---------+
supposing p01 = 5.00, p99 = 850.00 for this product_category 

这是我在与文档进行斗争后得出的结论(有两个函数
approcile_percentile
percentile_approcile
,它们显然做着同样的事情)

除了作为spark sql表达式之外,我无法理解如何实现这一点,也不清楚为什么分组只在这里起作用。我怀疑是因为它是蜂巢的一部分

Spark数据帧Winsorizor
  • 在10至100MM行范围内的DF上进行测试
//Winsorize函数,可按列列表分组
//[0,1]的低/高元素
//精度:在[1,1E7 ish]中的整数,在实践中,对于大数据使用100或1000,越小越快/越不准确
//组列:以逗号分隔的列名列表
导入org.apache.spark.sql_
def grouped_winzo(df:DataFrame,winz_col:String,group_col:String,low:Double,hi:Double,precision:Integer):数据帧={
df.createOrReplaceTempView(“df_表”)
spark.sql(s”“”
选择不同的
*
,百分位大约($winz_col,$low,$precision)超过(按$group_col划分)p_low
,百分位大约($winz_col,$hi,$precision)超过(按$group_col划分)p_hi
从df_表
""")
.withColumn(winz_col+“_winz”,expr(s)”
当$winz_col=p_hi然后p_hi时的情况
其他$winz_col end”“”)
.drop(winz_col、“p_low”、“p_hi”)
}
//在p01和p99处对数据帧的价格列进行winsorize
//百分比,按“产品类别”列分组。
val df_winsorized=分组的_winzo(
df_数据
“价格”
,“产品类别”
, 0.01, 0.99, 1000)