def m_datetime_only_hour_minute(seq): """ 时间字符串只保留时分 :param seq: 日期字符串 或 日期字符串组成的列表 :return: 日期字符串只保留时分 example: :seq ['2017-01-01 12:20:00', '2017-02-28 09:10:30'] :return ['12:20', '09:10'] """ if not isinstance(seq, list): try: seq = datetime.strptime(seq, "%Y-%m-%d %H:%M:%S") except: raise FeatureProcessError('%s time format error ' % seq) else: try: seq = map(lambda x: datetime.strptime(x, "%Y-%m-%d %H:%M:%S"), seq) except: raise FeatureProcessError('%s time format error ' % seq) seq = float(str(seq.hour) + '.' + str(seq.minute)) return seq
def f_assert_must_digit(value_list, args=False): """ 检测列表中的元素是否为数字 :param value_list: 待检测列表 :param args: 负数是否通过 false 不通过报异常 True 负数通过 :return: 异常或原值 example: :value_list [-2,'-2', 3] :args false :return 异常 :value_list [-2,'-2', 3] :args True :return [-2,'-2', 3] """ for value in value_list: if args: if not str(value).lstrip('-').isdigit(): raise FeatureProcessError( '%s negative number=%s f_assert_must_digit Error' % (value_list, args)) else: if not str(value).isdigit(): raise FeatureProcessError( '%s negative number=%s f_assert_must_digit Error' % (value_list, args)) return value_list
def m_city_name_to_level2_0(city_name): """ 获取城市名所对应的level :param city_name: 城市 :return: code example: :address '北京' :return 1 """ ccf = CityCodeField.objects.filter(city_name_cn=city_name, is_delete=False) if not ccf: raise FeatureProcessError( 'not find %s level config in database table' % city_name) company_addr_city_level = ccf[0].city_level if not str(company_addr_city_level).isdigit(): raise FeatureProcessError( '%s city_level config error in database table' % city_name) seq = int(company_addr_city_level) if seq == 1: seq = "一线" elif seq == 2: seq = "二线" elif seq == 3: seq = "三线" elif seq == 4: seq = "四线" elif seq == 5: seq = "其他" return seq
def f_assert_must_digit_or_float(value_list, args=False): """ 检测列表中的元素是否为数字或float, args=false 负数报异常 True 负数通过 :param value_list: 待检测列表 :param args: 负数是否通过 false 不通过报异常 True 负数通过 :return: 异常或原值 example: :value_list [-2.0,'-2', 3] :args false :return 异常 :value_list [-2.0,'-2', 3] :args True :return [-2.0,'-2', 3] """ for value in value_list: if args: if not (str(value).count('.') <= 1 and str(value).replace('.', '').lstrip('-').isdigit()): raise FeatureProcessError( '%s negative number=%s f_assert_must_digit_or_float Error' % (value_list, args)) else: if not (str(value).count('.') <= 1 and str(value).replace('.', '').isdigit()): raise FeatureProcessError( '%s negative number=%s f_assert_must_digit_or_float Error' % (value_list, args)) return value_list
def f_assert_not_null(seq): """检测值是否非空或值得列表是否存在非空元素""" if seq in (None, '', [], {}, ()): raise FeatureProcessError("value: %s f_assert_not_null Error" % seq) if isinstance(seq, list): for value in seq: if value in (None, '', {}, [], ()): raise FeatureProcessError("value: %s f_assert_not_null Error" % seq) return seq
def func_exec_operator_chain(value, chains): chain_list = chains.split('->') if chains else [] for operator in chain_list: if '#' in operator: judge = eval(operator[1:]) if judge: continue else: raise FeatureProcessError('exec_operator_chain Error value: %s assert: %s' % (value, operator[1:])) try: value = eval(operator) except: raise FeatureProcessError('exec_operator_chain Error value: %s operator: %s' % (value, operator)) return value
def f_assert_must_basestring(value_list): """检测列表中的元素是否为字符串""" for value in value_list: if not isinstance(value, basestring): raise FeatureProcessError('%s f_assert_must_basestring Error' % value_list) return value_list
def f_assert_must_dict(value_list): """检测列表中的元素是否为dict类型""" for value in value_list: if not isinstance(value, dict): raise FeatureProcessError('%s f_assert_must_dict Error' % value_list) return value_list
def m_single_check_code(seq, feature_name): """ 获取单值匹配(不是区间)所对应的Code :param feature_name: 特征名称 :param seq: 特征对应的返回值 :return: code example: :feature_name education_degree_code :seq: 20 :return 2 """ if not seq: return [] res = '' feature_code = FeatureCodeMapping.objects.filter( feature_name=feature_name, ) num_map = { int(conf.mapped_value): conf.unitary_value for conf in feature_code } for key, value in num_map.iteritems(): if seq[0] == value: res = key break if res in ('', None): raise FeatureProcessError("don't find %s=%s code value" % (feature_name, seq)) return res
def func_exec_chain(data, chains): chain_list = chains.split('->') if chains else [] for func in chain_list: args = '' try: f = re.search("(.*)\\((.*)\\)", func) if f: func = f.group(1) args = f.group(2) func = eval(func) except: raise FeatureProcessError("exec_chain Error: don't find function %s" % func) if args: if args.startswith("[") or args.startswith("{"): args = eval(args) else: args = args.split(',') args_tmp = [] for i in args: if i.startswith("\'"): arg = i.strip("\'") elif i.startswith("""\""""): arg = i.strip("\"") else: arg = eval(i) args_tmp.append(arg) args = args_tmp if len(args) == 1: args = args[0] # print args data = func(data, args) else: data = func(data) return data
def get(self, feature_name): if self._feature_code_context is None: self._load_data_from_db() if not isinstance(self._feature_code_context, dict): raise FeatureProcessError( "Feature code context is not initialize.") return self._feature_code_context.get(feature_name, None)
def m_city_name_to_code(city_name): """ 获取城市名所对应的Code :param city_name: 城市 :return: code example: :address '北京' :return 1 """ ccf = CityCodeField.objects.filter(city_name_cn=city_name, is_delete=False) if not ccf: raise FeatureProcessError('not find %s code config in database table' % city_name) company_addr_city_code = ccf[0].city_code if not str(company_addr_city_code).isdigit(): raise FeatureProcessError( '%s city_code config error in database table' % city_name) seq = company_addr_city_code return seq
def f_assert_must_percent(value_list): """ 检测是否是百分数 """ for value in value_list: if not (str(value)[-1] == '%' and (str(value[:-1]).count('.') <= 1 and str(value[:-1]).replace('.', '').isdigit())): raise FeatureProcessError('%s f_assert_must_percent Error' % value_list) return value_list
def m_sex_to_code(seq): """ 返回性别的code值 :param seq: 包含性别的字符串 :return: code example: :seq '男生' :return '男' """ if '男' in seq: seq = '男' elif '女' in seq: seq = '女' else: raise FeatureProcessError("'don't know sex") return seq
def m_check_code(seq, args=None): """ 将数值转化成对应的code :param seq: 上一步得到的数据 :param args: [feature_name,操作符] :return: 对应code example: :data: 20 :args ['education_degree_code','gte_lt'] :return 2 """ if not seq: return [] feature_name = args[0] op = args[1] fcm = FeatureCodeMapping.objects.filter(feature_name=feature_name, ) res = '' num_map = { int(conf.mapped_value): [conf.unitary_value, conf.dual_value] for conf in fcm } for key, value in num_map.iteritems(): if op == 'gte_lt': if float(value[0]) <= float(seq) < float(value[1]): res = key break elif op == 'gt_lte': if float(value[0]) < float(seq) <= float(value[1]): res = key break elif op == 'in': if seq in value[0]: res = key break elif op == 'eq': if seq == value[0]: res = key break if res in ('', None): raise FeatureProcessError("don't find %s=%s code value" % (feature_name, seq)) return res
def m_max_flight_area(seq): """ 一年内飞机出行中最多出行区域 :param seq: 飞行次数、国内次数、国外次数 :return: 飞行次数==0 返回0 国内次数>国外次数 返回inland 国外次数>国内次数 返回international example: :seq [2, 2, 3] :return international """ """""" flight_times = seq[0] inland_count = seq[1] international_count = seq[2] if int(flight_times) == 0: seq = 0 elif int(inland_count) >= int(international_count): seq = 'inland' elif int(inland_count) < int(international_count): seq = 'international' else: raise FeatureProcessError("don't know max_flight_area code") return seq
def f_assert_must_between(value_list, args): """ 检测列表中的元素是否为数字或浮点数且在args的范围内 :param value_list: 待检测列表 :param args: 范围列表 :return: 异常或原值 example: :value_list [2, 2, 3] :args [1,3] :value_list ['-2', '-3', 3] :args ['-5',3] """ assert len(args) == 2 for value in value_list: if not (str(value).count('.') <= 1 and str(value).replace('.', '').lstrip('-').isdigit() and float(args[0]) <= float(value) <= float(args[1])): raise FeatureProcessError('%s f_assert_must_between %s Error' % (value_list, args)) return value_list
def f_assert_seq0_gte_seq1(value_list): """检测列表中的第一个元素是否大于等于第二个元素""" if not value_list[0] >= value_list[1]: raise FeatureProcessError('%s f_assert_seq0_gte_seq1 Error' % value_list) return value_list
def f_assert_jsonpath_true(seq): """假设jsonpath查询到的为true seq为[]空列表时代表没查到字段""" if seq in ([], ): raise FeatureProcessError("jsonpath not find field") return seq
def m_to_code(seq, args=None): """ 将数值转化成对应的code :param seq: 上一步得到的数据 :param args: feature_name :return: 对应code example: :data: 20 :args 'education_degree_code' :return 2 """ if not seq and seq != 0: return [] if isinstance(seq, list): seq = seq[0] feature_name = args fcm = FeatureCodeMapping.objects.filter(feature_name=feature_name, is_delete=False) res = '' num_map = { int(conf.mapped_value): [ conf.unitary_value, conf.dual_value, conf.arithmetic_type, conf.feature_desc ] for conf in fcm } for key, value in num_map.iteritems(): arithmetic_type = value[2] if arithmetic_type == '[)': if float(value[0]) <= float(seq) < float(value[1]): res = key break elif arithmetic_type == '(]': if float(value[0]) < float(seq) <= float(value[1]): res = key break elif arithmetic_type == '()': if float(value[0]) < float(seq) < float(value[1]): res = key break elif arithmetic_type == '>=': if float(seq) >= float(value[0]): res = key break elif arithmetic_type == '<=': if float(seq) <= float(value[0]): res = key break elif arithmetic_type == 'in': if seq in value[0]: res = key break elif arithmetic_type == '==': if str(seq) == value[0]: res = value[3] break if res in ('', None): raise FeatureProcessError("don't find %s=%s code value" % (feature_name, seq)) return res