2017-08-16 1 views
2

Ich habe einen Datenrahmen in Python und es hat Datetime-Datei namens 'Datetime'. Mit Pipeline und FeatureUnion versuche ich Tag, Monat, Wochentag und isBusinessday zu extrahieren. Um diese Funktionen zu extrahieren, habe ich einen benutzerdefinierten Code geschrieben.sklearn Pipeline korrekte Verwendung

ich den folgenden Code bin mit Tag, Monat zu extrahieren, Wochentag und 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()), 
    ])), 
])), 

    ]) 

Wenn ich diesen Code ausführen i-Liste als Ausgang immer bin. Sagen Sie zum Beispiel:

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

Ausgang:

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

Aber ich war Tag und Monat separate Funktionen zu sein. Wie kann ich das machen ? Was ist in meinem Code falsch gelaufen? Kann mir jemand helfen, es zu finden?

UPDATE

mein Problem zusammenzufassen, erhalte ich Ausgangsform (10,) aber ich meine Ausgabe (5,2)

Aktualisiert vor 1 gemäß der Anfrage i hinzugefügt notwendigen Code

sein wollen
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

Für diejenigen, die downvoted, hinterlassen Sie bitte einen Kommentar und down vote – Backtrack

+0

FeatureUnion wird die Daten von jedem Teil der internen Transformatoren horizontal stapeln. Kannst du zeigen, was 'Extract_month' und 'Extract_date' zurückgibt? –

+0

@VivekKumar, ich habe notwendigen Code hinzugefügt. Bitte schau es dir an – Backtrack

Antwort

1

Ok, die Extract_month und Extract_date geben eine Serie zurück, die ein 1-d-Vektor ist Daher stapelt die FeatureUnion sie nicht korrekt. Für FeatureUnion benötigen Sie 2-d Daten mit der gleichen Anzahl von Zeilen von jedem internen Transformator.

Sie können hierfür reshape(-1,1) verwenden.

So Ihre Methoden wie folgt ändern:

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) 

nun die Ausgabe korrekt sein sollte. Fühlen Sie sich frei zu fragen, ob noch irgendein Problem.

Verwandte Themen