Bin 一个连续变量而不会使 C901 flake8 太复杂
Bin a continuous variable without getting C901 flake8 too complex
我知道 pandas
和 numpy
具有合并功能,例如 pd.cut
和 np.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
。
两个问题:
- 这样的代码有什么问题,我不觉得它“复杂”。
- 我们如何让这个“更容易”?
并不是说此代码很复杂,但您可以通过在某些 (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 维护者
我知道 pandas
和 numpy
具有合并功能,例如 pd.cut
和 np.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
。
两个问题:
- 这样的代码有什么问题,我不觉得它“复杂”。
- 我们如何让这个“更容易”?
并不是说此代码很复杂,但您可以通过在某些 (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 维护者