2017-01-24 1 views
0

DataFrameのフィーチャの独自のトランスを作成したいので、たとえば2つの他のカラムの違いなどのカラムを追加します。私はthis questionを追跡しましたが、変圧器は1列だけで動作します。 pyspark.ml.Transformerは、inputColの引数として文字列を受け取ります。もちろん、複数の列を指定することはできません。pyspark.mlの複数の機能で動作するトランスフォーマー

だから、基本的に、私は何を達成したいことは、このいずれかのような_transform()方法であって、これを行うことが可能である方法

def _transform(self, dataset): 
    out_col = self.getOutputCol() 
    in_col = dataset.select([self.getInputCol()]) 

    # Define transformer logic 
    def f(col1, col2): 
     return col1 - col2 
    t = IntegerType() 

    return dataset.withColumn(out_col, udf(f, t)(in_col)) 

+0

「HasInputCols」(複数形)はあなたが探しているものでしょうか? –

答えて

1

私が操作したい機能のセットの中で最初にVectorを作成してから、新しく生成されたベクター機能に変換を適用することで問題を解決することができました。下の2つの他の機能の異なる新たな特徴作り方のサンプルコードです:

pair_assembler = VectorAssembler(inputCols=["col1", "col2"], outputCol="cols_vector") 

class MeasurementDifferenceTransformer(Transformer, HasInputCol, HasOutputCol): 

    @keyword_only 
    def __init__(self, inputCol=None, outputCol=None): 
     super(MeasurementDifferenceTransformer, self).__init__() 
     kwargs = self.__init__._input_kwargs 
     self.setParams(**kwargs) 

    @keyword_only 
    def setParams(self, inputCol=None, outputCol=None): 
     kwargs = self.setParams._input_kwargs 
     return self._set(**kwargs) 

    def _transform(self, dataset): 
     out_col = self.getOutputCol() 
     in_col = dataset[self.getInputCol()] 

     # Define transformer logic 
     def f(vector): 
      return float(vector[0] - vector[1]) 
     t = FloatType() 

     return dataset.withColumn(out_col, udf(lambda x: f(x), t)(in_col)) 

がそれを使用するには、我々は最初のベクトルの機能を作成するためにVectorAssemblerをインスタンス化

その後、我々は、変圧器をインスタンス化:

pair_transformer = MeasurementDifferenceTransformer(inputCol="cols_vector", outputCol="col1_minus_col2") 

最後に、我々はデータを変換:

pairfeats = pair_assembler.transform(df) 
difffeats = pait_transformer.transform(pairfeats) 
関連する問題