Bin 一个连续变量而不会使 C901 flake8 太复杂

Bin a continuous variable without getting C901 flake8 too complex

我知道 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. 我们如何让这个“更容易”?

并不是说此代码很复杂,但您可以通过在某些 (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 维护者