2017-08-16 1 views
2

私はPythonでデータフレームを持っていて、それはdatetimeという名前のdatetimeフィールドを持っています。パイプラインとFeatureUnionを使用私は、曜日、月、平日とisBusinessdayを抽出しようとしています。これらの機能を抽出するために、私はカスタムコードを書いています。私は出力としてリストを取得していますこのコードを実行するとsklearnパイプラインの正しい使い方

私は日、月、曜日を抽出するために、次のコードを使用して

class itemselector(BaseEstimator, TransformerMixin): 
    def __init__(self, key): 
     self.key = key 

    def transform(self, X): 
     return X[self.key] 

    def fit(self, X, y=None): 
     return self 


    f_df = Pipeline([ 

     ('union', FeatureUnion([ 
    ('date', Pipeline([ 
     ('sitem', itemselector('pickup_datetime')), 
     ('sday', Extract_date()), 
    ])), 
    ('month', Pipeline([ 
     ('sitem', itemselector('pickup_datetime')), 
     ('smonth', Extract_month()), 
    ])), 
])), 

    ]) 

isBusinessday

ています。出力

df = f_df.fit_transform(df_train[:5]) 

:たとえば言う

[14 12 19 6 26 3 6 1 4 3] // it has both day and month. it is not expected output 

しかし、私は別々の機能であることを日と月の両方でした。どうやってやるの ?私のコードで何が間違っていたのですか?誰かが私にそれを見つけるのを助けることができますか?私の問題を要約する

UPDATE

、私は、出力形状(10,)を取得していますが、私は私の出力が(5,2)

は私が必要なコード

を追加したリクエストごとに1を更新することにしたいです
class Extract_date(BaseEstimator, TransformerMixin): 
    def fit(self, X): 
     print('one') 
     return self 

    def transform(self, X): 
     return X.apply(lambda y: y.day) 


class Extract_month(BaseEstimator, TransformerMixin): 
    def fit(self, X, **atr): 
     print('two') 
     return self 

    def transform(self, X): 
     return X.apply(lambda y: y.month) 
+2

コメントを残してください。 – Backtrack

+0

FeatureUnionは内部トランスの各部からのデータを水平に積み重ねます。 'Extract_month'と' Extract_date'が返すものを表示できますか? –

+0

@VivekKumar、私は必要なコードを追加しました。それを見てください – Backtrack

答えて

1

いいえ、Extract_monthおよびExtract_dateは、1-dベクターである系列を返しますしたがって、FeatureUnionは正しくスタッキングしていません。 FeatureUnionでは、各内部変換器から同じ行数の2-dデータが必要です。

これにはreshape(-1,1)を使用できます。

したがって、このようなあなたの方法を変更します。

class Extract_date(BaseEstimator, TransformerMixin): 
    ... 
    ... 

    def transform(self, X): 
     return X.apply(lambda y: y.day).values.reshape(-1,1) 


class Extract_month(BaseEstimator, TransformerMixin): 
    ... 
    ... 

    def transform(self, X): 
     return X.apply(lambda y: y.month).values.reshape(-1,1) 

を今すぐ出力は正しいはずです。それでも問題がある場合はお気軽にお問い合わせください。

関連する問題