字符串离散化器

2024-05-15 10:27:05 发布

您现在位置:Python中文网/ 问答频道 /正文

^{}数值数据

我有字符串数据整个^{}如下所示:

MTS RUS                   495
Tele2                     484
MegaFon                   437
Beeline                   431
Vodafone UA               402
                         ... 
3 Austria                   1
FJ VODAFONE | Vodafone      1
Babilon-M                   1
MOOV BENIN                  1
3 | Beeline                 1
Name: carrier, Length: 822, dtype: int64

这已经是绝对的,但是有太多不同的值(822!)

我想把它分为几个不同的值(5-10),每个值的高度都相等(比如strategy="quantile"KBinsDiscretizer

该算法非常简单:将KBinsDiscretizer应用于转换为value_counts中值的数值秩的数据

我想知道是否已经有了一种方法(如果没有,如何按照惯用的方式进行)

PS.一个关键的限制是该方法必须是“通用的”,我不能检查每个字符串列,我必须单独优化装箱


Tags: 数据方法字符串mtsuavodafone数值数据rus
1条回答
网友
1楼 · 发布于 2024-05-15 10:27:05

这是我放在一起的东西,看起来很有用,但我希望我能用一些OOTB:

import sklearn
from sklearn.base import TransformerMixin, BaseEstimator

def only_column(df):
    if df.shape[1] != 1:
        raise ValueError("only_column",df.shape)
    return df[df.columns[0]]

class ObjectDiscretizer(TransformerMixin, BaseEstimator):
    def __init__(self, **kwargs):
        self.kbin_discr = sklearn.preprocessing.KBinsDiscretizer(**kwargs)
        self.name2rank = None
        self.names = None
        self.ranks = None
    
    def __str__(self):
        if self.name2rank is None:
            return "%s(%s)" % (self.__class__.__name__, self.kbin_discr)
        return "%s(n=%d, b=%d, %s)" % (
            self.__class__.__name__, len(self.name2rank), 
            len(self.kbin_discr.bin_edges_), self.kbin_discr)

    def fit(self, X, y=None):
        "Learn how to discretize the data."
        col = only_column(X).astype(str)
        # np.unique does not always work
        # https://github.com/numpy/numpy/issues/18288
        vc = col.value_counts(dropna=False)
        self.name2rank = {v:i for i,v in enumerate(vc.index)}
        self.names, self.ranks = np.array(list(zip(*sorted(self.name2rank.items()))))
        self.kbin_discr.fit(col.replace(self.name2rank).values.reshape((-1,1)))
        return self
    
    def transform(self, X):
        "Discretize the data."
        return self.kbin_discr.transform(self.ranks[np.searchsorted(self.names, X.astype(str))]).astype(int)

相关问题 更多 >