Пример #1
0
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
Пример #2
0
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
Пример #3
0
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
Пример #4
0
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
Пример #5
0
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
Пример #6
0
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
Пример #7
0
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
Пример #8
0
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
Пример #9
0
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
Пример #10
0
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
Пример #11
0
    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)
Пример #12
0
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
Пример #13
0
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
Пример #14
0
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
Пример #15
0
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
Пример #16
0
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
Пример #17
0
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
Пример #18
0
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
Пример #19
0
def f_assert_jsonpath_true(seq):
    """假设jsonpath查询到的为true seq为[]空列表时代表没查到字段"""
    if seq in ([], ):
        raise FeatureProcessError("jsonpath not find field")
    return seq
Пример #20
0
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