2016-10-23 2 views
1

У меня есть трансформатор, который вычисляет процент значений для каждой группы. Первоначально, панды использовались, потому что я начал с панд, а colnames лучше обрабатывать. Однако теперь мне нужно интегрироваться в sklearn-конвейер.pandas to numpy array для конвейера sklearn

Как я могу конвертировать мой трансформатор для поддержки Numpy массивов из более sklearn трубопровода вместо фреймов данных панд? Дело в том, что self.colname нельзя использовать для массивов numpy, и я думаю, что группировка должна выполняться по-разному.

Как реализовать упорства такого трансформатора, как эти веса необходимости быть загружаемыми с диска для развертывания такого трансформатора в трубопроводе.

class PercentageTransformer(TransformerMixin): 
    def __init__(self, colname,typePercentage='totalTarget', _target='TARGET', _dropOriginal=True): 
     self.colname = colname 
     self._target = _target 
     self._dropOriginal = _dropOriginal 
     self.typePercentage = typePercentage 

    def fit(self, X, y, *_): 
     original = pd.concat([y,X], axis=1) 
     grouped = original.groupby([self.colname, self._target]).size() 
     if self.typePercentage == 'totalTarget': 
      df = grouped/original[self._target].sum() 
     else: 
      df = (grouped/grouped.groupby(level=0).sum()) 

     if self.typePercentage == 'totalTarget': 
      nameCol = "pre_" + self.colname 
     else: 
      nameCol = "pre2_" + self.colname 
     self.nameCol = nameCol 
     grouped = df.reset_index(name=nameCol) 
     groupedOnly = grouped[grouped[self._target] == 1] 
     groupedOnly = groupedOnly.drop(self._target, 1) 

     self.result = groupedOnly 
     return self 

    def transform(self, dataF): 
     mergedThing = pd.merge(dataF, self.result, on=self.colname, how='left') 
     mergedThing.loc[(mergedThing[self.nameCol].isnull()), self.nameCol] = 0 
     if self._dropOriginal: 
      mergedThing = mergedThing.drop(self.colname, 1) 
     return mergedThing 

Он будет использоваться в трубопроводе, как это:

pipeline = Pipeline([ 
    ('features', FeatureUnion([ 
     ('continuous', Pipeline([ 
      ('extract', ColumnExtractor(CONTINUOUS_FIELDS)), 
     ])), 
     ('factors', Pipeline([ 
      ('extract', ColumnExtractor(FACTOR_FIELDS)), 
      # using labelencoding and all bias 
      ('bias', PercentageAllTransformer(FACTOR_FIELDS, _dropOriginal=True, typePercentage='totalTarget')), 
     ])) 
    ], n_jobs=-1)), 
    ('estimator', estimator) 
]) 

pipeline будет оснащен X и y, где оба являются кадры данных. Я не уверен в X.as_matrix.

+0

'объекты pandas' являются обертками вокруг объектов' numpy'. Нет массива 'pandas', я полагаю, вы имеете в виду' Series'? Во всяком случае, может быть, ваша проблема будет решена просто путем возврата 'self.values' вместо' self'. –

+0

Что касается настойчивости, есть несколько способов сделать это. Как правило, сериализация объектов в Python будет использовать модуль pickle. –

+0

Действительно, я имел в виду кадры данных панд. Дело в том, что если я правильно его понимаю: orignal 'original.groupby ([self.colname, self._target]' больше не является фреймворком данных, а массивом numpy, например, colnames больше не работают, поэтому self.values ​​не выглядит –

ответ

2
  • Преобразование Things вперед и назад

панды имеет .to_records() метод, и, как вы упомянули, метод .as_matrix(). Метод .to_records() фактически сохранит ваши имена столбцов для вас. Numpy Поддержка названий столбцов в массивах. См. here.

  • Постоянство

Панды есть (объект, имя файла) метод, в котором pandas.to_pickle принимает объект панд и pickles его. Существует соответствующий метод pandas.read_pickle (filename).

Numpy имеет функцию save и load.