PySpark中的RobustScaler

PySpark中的RobustScaler,pyspark,apache-spark-mllib,pyspark-dataframes,Pyspark,Apache Spark Mllib,Pyspark Dataframes,我想使用RobustScaler来预处理数据。在sklearn中,可以在 sklearn.preprocessing.RobustScaler 。但是,我正在使用pyspark,因此我尝试使用以下工具导入它: from pyspark.ml.feature import RobustScaler 但是,我收到以下错误: ImportError: cannot import name 'RobustScaler' from 'pyspark.ml.feature' 正如pault指出的,

我想使用RobustScaler来预处理数据。在sklearn中,可以在

sklearn.preprocessing.RobustScaler
。但是,我正在使用pyspark,因此我尝试使用以下工具导入它:

 from pyspark.ml.feature import RobustScaler
但是,我收到以下错误:

ImportError: cannot import name 'RobustScaler' from 'pyspark.ml.feature' 
正如pault指出的,RobustScaler只在pyspark 3中实现。我正在尝试将其实施为:

class PySpark_RobustScaler(Pipeline):
    def __init__(self):
        pass

    def fit(self, df):
        return self

    def transform(self, df):
        self._df = df
        for col_name in self._df.columns:
            q1, q2, q3 = self._df.approxQuantile(col_name, [0.25, 0.5, 0.75], 0.00)
            self._df = self._df.withColumn(col_name, 2.0*(sf.col(col_name)-q2)/(q3-q1))
        return self._df

arr = np.array(
            [[ 1., -2.,  2.],
            [ -2.,  1.,  3.],
            [ 4.,  1., -2.]]
          )

rdd1 = sc.parallelize(arr)
rdd2 = rdd1.map(lambda x: [int(i) for i in x])
df_sprk = rdd2.toDF(["A", "B", "C"])
df_pd = pd.DataFrame(arr, columns=list('ABC'))

PySpark_RobustScaler().fit(df_sprk).transform(df_sprk).show()
print(RobustScaler().fit(df_pd).transform(df_pd))
然而,我发现要获得sklearn的相同结果,我必须将结果乘以2。此外,我担心如果一个列有许多接近于零的值,那么q3-q1的四分位数范围可能会变得太小,导致结果发散,从而产生空值


有人对如何改进有什么建议吗

似乎这是在中可用的,请参阅。