2017-08-16 76 views
2

我有一個數據框在python中,它有datetime提交'datetime'。使用管道和FeatureUnion我試圖提取日,月,工作日和isBusinessday。爲了提取我編寫自定義代碼的功能。sklearn管道正確的使用

我使用下面的代碼中提取日期,月份,星期和isBusinessday

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()), 
    ])), 
])), 

    ]) 

當我運行這段代碼我得到列表作爲輸出。例如說:

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

對於那些downvoted,請發表評論和投票 – Backtrack

+0

FeatureUnion將水平堆疊來自內部變壓器的每個部分的數據。你可以顯示什麼'Extract_month'和'Extract_date'返回? –

+0

@VivekKumar,我添加了必要的代碼。請看看它 – Backtrack

回答

1

好吧,Extract_monthExtract_date返回一個系列,這是一個一維向量,因此FeatureUnion沒有正確堆疊它們。對於FeatureUnion,您需要每個內部變壓器具有相同行數的二維數據。

您可以使用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) 

現在輸出應該是正確的。隨意問,如果仍然有任何問題。