同样的Pandas命令在一个地方有效,但在另一个地方无效?

abithluo  于 2023-02-17  发布在  其他
关注(0)|答案(1)|浏览(129)

我有一个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
muk1a3rh

muk1a3rh1#

我在这里发现了这个bug!这是因为两个系统中使用的panda版本不同。在google colab notebook(我开发transformer的地方)中,我安装了最新版本的panda。但是在我的本地系统中,我的panda版本稍旧一些,并且不支持这个命令:df2 = df2[['uid', 'bid', 'date_rank']]
因此它返回了一个空的DataFrame。

相关问题