(1)当前需要判断4个模型特征全为0的时候,统一做处理:比如统一输出信息不足,不做预测;
首先,可以做一个接口,判断features_dto,以字典的形式,判断是否类型为int或float型,然后求和,求和为0就表示全部为0;
公共接口:
from abc import abstractmethod
class IFeatureDo(object):
"""
特征层接口
"""
@abstractmethod
def get_features(self):
"""
获取特征集
"""
然后在失信模块中运用它:
class ShinXinFeaturesDealDo(IFeatureDo):
def __init__(self, features, enterprise_code=None, result_code=None, industry_code=None, enterprise_status=None, is_shi_xin = None,shixin_cnt = None):
self.features = features
self.enterprise_code = enterprise_code
self.enterprise_status = enterprise_status
self.industry_code = industry_code
self.result_code = result_code
self.is_shi_xin = is_shi_xin
self.shixin_cnt = shixin_cnt
def get_features(self):
return self.features
然后,需要在控制层判断是否全为0,如下:
失信控制层的情况:
class BizShixinController(BizSingleControllerBase):
class BizSingleControllerBase(BaseBizController):
因为要实现(1)的逻辑,因此,需要添加公共的特征全为0判断逻辑,添加公共的判断逻辑原则上可以在BizSingleControllerBase上添加,也可以在BaseBizController添加,可以看到,公共的判断逻辑需要输入features_dto,而features_dto是通过BizSingleControllerBase得到的,因此,添加在BizSingleControllerBase中,如果添加在BaseBizController中,BaseBizController是位于BizSingleControllerBase下层,是他的基类(也叫父类),由于下层不能调用上层,因此,输入features_dto无法获取,因此不满足;
公共的特征全为0判断逻辑:
def _is_all_features_zero(self, features_dto):
"""
是否features的全部特征都为零
"""
if isinstance(features_dto, IFeatureDo):
features_count = Stream(features_dto.get_features().__dict__.values()) \
.filter(lambda x: isinstance(x, (int, float))) \
.sum()
return features_count == 0
else:
raise BizException(u'未实现指定接口')
规则:
基类与上层类的关系
mock测试找原因的方法:看为什么满足条件,一步一步跟踪,
测试,不要多重覆盖,难以维护,测试的条件可以写特征全为0和不全为0,但是测试的时候,只用写专门覆盖特征全为0的脚本,因为其他正常预测等已经本事都是特征不全为0了,所以不用再专门写特征不全为0的测试脚本了;