在不使C901太复杂的情况下存储连续变量

2024-09-24 04:30:56 发布

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

我知道pandasnumpy具有组合功能,例如pd.cutnp.digitalize。但是,当具有大型数组/列表/数据帧时,这些功能非常有用。就我而言,使用这些方法似乎有些过分,因为它只是我项目中的一个变量

现在,我有一个连续变量,我使用以下函数将其装箱(使其离散):

def bin_data(self):  # noqa: C901
    if self.value <= 300000:
        bin_cat = 999
    elif 300000 < self.value <= 500000:
        bin_cat = 15000
    elif 500000 < self.value <= 1000000:
        bin_cat = 30000
    elif 1000000 < self.value <= 2200000:
        bin_cat = 60000
    elif 2200000 < self.value <= 4400000:
        bin_cat = 120000
    elif 4400000 < self.value <= 8800000:
        bin_cat = 180000
    elif 8800000 < self.value <= 17500000:
        bin_cat = 300000
    elif 17500000 < self.value <= 35000000:
        bin_cat = 600000
    elif 35000000 < self.value <= 70000000:
        bin_cat = 900000
    elif 70000000 < self.value <= 140000000:
        bin_cat = 1500000
    else:
        bin_cat = 3000000

但这会导致一个flake8错误C901: function too complex

两个问题:

  1. 这样的代码有什么问题,我不觉得它“复杂”
  2. 我们如何使这“更容易”

Tags: self功能numpypandas列表binvaluenp
1条回答
网友
1楼 · 发布于 2024-09-24 04:30:56

并不是说这段代码很复杂,但您可以通过一些(end, result)元组上的循环,以一种不太容易出错、不太复杂的方式编写这段代码。另外请注意,默认情况下,flake8不会检测复杂性,您必须通过设置阈值来选择该行为

因为它不适合评论部分,这里有另一种方式来编写它,同时满足复杂性

BINS = (
    (300000, 999),
    (500000, 15000),
    (1000000, 30000),
    (2200000, 60000),
    (4400000, 120000),
    (8800000, 180000),
    (17500000, 300000),
    (35000000, 600000),
    (70000000, 900000),
    (14000000, 1600000), 
)
OTHERWISE = 3000000


def bin_data(value):
    for max_n, bucket in BINS:
        if value <= max_n:
            return bucket
    else:
        return OTHERWISE

免责声明:尽管我认为这与此特定信息无关,但我是目前的flake8维护者

相关问题 更多 >