我有一个Scikit-Learn变压器如下:
from sklearn.pipeline import Pipeline
from sklearn.base import BaseEstimator, TransformerMixin
class ScoreTransformer(TransformerMixin, BaseEstimator):
def __init__(self):
pass
def fit(self, X, y=None):
return self
def purchase_date_score(self, purchases):
purchases['date_x'] = pd.to_datetime(purchases['FinishDate'])
purchases['date_rank'] = purchases.sort_values(['uid','date_x'], ascending=False).groupby('uid')['date_x'].rank("dense", ascending=False).astype(int)
print(f'step1 -----\n{purchases.head()}')
df2 = purchases[purchases.groupby("bid")['uid'].transform('size') > 20].reset_index(drop=True)
print(f'step2 -----\n{df2.head()}')
df2 = df2[df2.groupby("uid")['bid'].transform('size') > 10].reset_index(drop=True)
print(f'step3 -----\n{df2.head()}')
df2 = df2[['uid', 'bid', 'date_rank']]
df2['normal_rank'] = df2[['uid', 'date_rank']].groupby('uid')['date_rank'].transform(lambda x: round(x * 2 / x.max() + 3))
print(f'step4 -----\n{df2.head()}')
return df2.drop(['date_rank'], axis=1)
def transform(self, X, y=None):
return self.purchase_date_score(X)
我在一个管道中使用这个Transformer,如下所示:
ranking_score_pipeline = Pipeline(([
('score', ScoreTransformer())
]))
data = ranking_score_pipeline.fit_transform(data)
当我在我的Google-Colab笔记本上运行这段代码时,我得到了以下输出:
但是当我在VSCODE上运行相同的代码时,我得到了以下结果:
你知道为什么吗?!我已经检查了所有的东西,甚至环境之间的Python和Panda版本,它们在两个地方都是一样的。
下面是我在此任务中使用的一个小样本数据集(Pandas DataFrame):
uid bid FinishDate
0 41,5,2013-09-14 10:44:59.877
1 43,37,2013-09-21 11:53:20.193
2 43,45,2013-09-21 12:01:42.390
3 41,99,2013-11-18 18:37:52.190
4 75,99,2013-12-19 09:24:55.717
1条答案
按热度按时间muk1a3rh1#
我在这里发现了这个bug!这是因为两个系统中使用的panda版本不同。在google colab notebook(我开发transformer的地方)中,我安装了最新版本的panda。但是在我的本地系统中,我的panda版本稍旧一些,并且不支持这个命令:
df2 = df2[['uid', 'bid', 'date_rank']]
因此它返回了一个空的DataFrame。