我有一个转换器,它可以计算每组值的百分比。最初,使用熊猫是因为我是从熊猫开始的,而colnames更容易处理。但是,现在我需要集成到sklearn管道中。在
如何将转换器转换为支持sklearn管道中的numpy数组,而不是pandas数据帧?
关键是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
它将用于这样的管道中:
^{pr2}$pipeline
将安装X
和{X.as_matrix
会有帮助。在
Pandas有一个.to_records()方法,如您所述,还有一个.as_matrix()方法。.to_records()方法实际上会为您保留列名。Numpy不支持数组中的命名列。见here。在
熊猫有熊猫泡菜(obj,filename)方法,它接受pandas对象并pickles。有一个对应的熊猫。读琰泡菜(文件名)方法。在
Numpy还有一个save和load函数。在
相关问题 更多 >
编程相关推荐