Module sktmls.utils.logic

Classes

class LogicProcessor

상품 선택 로직 등을 프로세스하는 클래스입니다.

아래 operations를 참조하여 json 형식의 로직을 구현하면 됩니다.

기본 문법

기본적으로 JSON 형태의 로직은 아래 포맷을 따릅니다.

{
    "operator": [*args]
}

각각의 arg는 또 다른 JSON 형태의 로직이 될 수 있으며 recursive하게 프로세스됩니다.

{
    "and": [
        {"==": [3, 3]},
        {">": [
            5,
            {"max": [3, 10]}
        ]}
    ]
}

피쳐 참조

피쳐를 참조하는 방법은

{
    "var": ["feature_name", 기본값]
}

형식입니다.

리스트 또는 딕셔너리 타입의 피쳐 값을 참조하는 경우

{
    "var": ["feature_name.0", 기본값]
}
{
    "var": ["feature_name.key_name", 기본값]
}

과 같은 형태로 하위 값에 접근이 가능합니다.

추가 키 참조

Recommendation API v3 이후부터 지원하는 추가 키(세컨 키 등) 리스트는

{
    "var": ["additional_keys.0", 기본값]
}

와 같이 additional_key.index 포맷으로 접근 가능합니다.

연산자

  • ==: 두 값이 같은 경우 True. 타입을 고려하지 않음
  • ===: 두 값이 같은 경우 True. 타입을 고려함
  • !=: 두 값이 다른 경우 True. 타입을 고려하지 않음
  • !==: 두 값이 다른 경우 True. 타입을 고려함
  • <: 왼쪽 값이 오른쪽 값보다 작은 경우 True
  • <=: 왼쪽 값이 오른쪽 값보다 작거나 같은 경우 True
  • >: 왼쪽 값이 오른쪽 값보다 큰 경우 True
  • >=: 왼쪽 값이 오른쪽 값보다 크거나 같은 경우 True
  • !: not
  • and: 모든 args가 True인 경우 True
  • or: 하나 이상의 args가 True인 경우 True
  • any: args[0]의 하나 이상의 element가 True인 경우 True
  • all: arg[0]의 모든 element가 True인 경우 True
  • ?:: args[0]이 True이면 args[1] 반환, 아니면 args[2] 반환
  • is: args[0] is args[1]
  • if: args[0]이 True이면 args[1] 반환, 아닌 경우 만약 args[2]이 True이면 args[3] 반환, … , 조건이 모두 False면 args[-1] 반환
  • if_min: args[0], args[2], args[4]… 중 args[i]가 최소인 경우 args[i + 1] 반환
  • if_max: args[0], args[2], args[4]… 중 args[i]가 최대인 경우 args[i + 1] 반환
  • if_closest: args[1], args[3], args[5]… 중 args[0]과 가장 가까운 값이 args[i]인 경우 args[i + 1] 반환
  • if_closest_upper: args[1], args[3], args[5]… 중 args[0]보다 크면서 가장 가까운 값이 args[i]인 경우 args[i + 1] 반환
  • if_closest_lower: args[1], args[3], args[5]… 중 args[0]보다 작으면서 가장 가까운 값이 args[i]인 경우 args[i + 1] 반환
  • all_in: args[0]의 element가 모두 args[1]에 포함된 경우 True
  • any_in: args[0]의 element가 하나라도 args[1]에 포함된 경우 True
  • in: 왼쪽 값이 오른쪽 값에 포함된 경우 True
  • cat: args들을 문자열 join
  • join: 리스트 args[0]을 args[1]을 구분자로 하여 문자열로 join
  • split: 문자열 args[0]을 args[1]을 구분자로 하여 분할
  • +: args들의 합
  • *: args들의 곱
  • -: 왼쪽 빼기 오른쪽. args의 길이가 1인 경우 -args[0]
  • /: 왼쪽 나누기 오른쪽
  • %: 왼쪽 나누기 오른쪽한 나머지
  • inner: arg[0]과 arg[1]의 내적 (둘 모두 1차원 배열인 경우 숫자를 반환하고 2차원 배열인 경우 리스트 반환)
  • exp: 지수함수 값 반환
  • sigmoid: Sigmoid 함수 값 반환
  • norm: norm 값 반환
  • min: args 중 최소값
  • max: args 중 최대값
  • argmin: 최소값을 가지는 인덱스
  • argmax: 최대값을 가지는 인덱스
  • get: args[0]의 args[1]번째 element. 딕셔너리 타입의 경우 args[0]의 args[1] 키에 해당하는 값
  • for_get: args[0] 자료구조 내 모든 element들의 args[1]번째 값을 모아 리스트로 반환한다.
  • int: int 파싱
  • float: float 파싱
  • str: str 파싱
  • list: args들을 리스트에 넣어 그대로 반환
  • dict: {args[0]: args[1], args[2]: args[3], …}
  • dict_keys: 딕셔너리 타입의 args[0]의 키 리스트 반환
  • dict_values: 딕셔너리 타입의 args[0]의 값 리스트 반환
  • pick: args[0] 리스트 element 중 args[1]에서 정의한 인덱스만 뽑아냄
  • pick_in: args[0] 리스트 element 중 args[1]에 존재하는 것들만 필터
  • remove: args[1]에서 args[0] 값을 가진 element들을 삭제 후 반환
  • remove_empty: args[0]에서 빈 자료구조나 None인 element들을 삭제
  • remove_duplicated: 중복된 element들을 삭제. 순서가 앞인 element가 우선 (args[1]: 비교 index. None인 경우 element 자체를 비교).
  • sample: args[0] 중 args[1]개 만큼 랜덤 추출 (seed: args[2])
  • first: args[0] 중 첫 args[1]개를 반환
  • replace: args[2]의 element 중 args[0] 값을 args[1] 값으로 교체하여 반환
  • repeat: args[0]이 args[1]번 반복되는 리스트 반환
  • range: range 함수 값 반환
  • len: args[0]의 길이 반환
  • empty: args[0]의 길이가 0이면 True
  • unique: args[0] 리스트에서 중복값을 제거
  • merge: args들을 하나의 리스트로 합침
  • vmerge: 길이가 같은 리스트 args[0], args[1], args[2]… 의 같은 순서 element들끼리 묶어 반환
  • count: args의 길이
  • abs: args[0]의 절대값
  • round: 반올림 (args[0]을 args[1] 자리까지 반올림)
  • mean: 평균값 (리스트들이 args로 들어오는 경우 각 element의 평균값을 가지는 리스트 반환)
  • closest: args[1], args[2]… 중 args[0]과 가장 가까운 값
  • closest_upper: args[1], args[2]… 중 args[0]보다 크면서 가장 가까운 값
  • closest_lower: args[1], args[2]… 중 args[0]보다 작으면서 가장 가까운 값
  • weekday: 요일 인덱스 반환 (월요일 1 ~ 일요일 7)
  • ndays: 이번 달의 마지막 날짜
  • day: 오늘 날짜
  • month: 이번 달
  • year: 올해
  • hour: 시
  • minute: 분
  • second: 초
  • microsecond: 마이크로초
  • now: 현재 시각 반환 (datetime 객체)
  • strptime: 문자열을 시각으로 변환 (시각 문자열: args[0], 형식: args[1])
  • strftime: 시각을 문자열로 변환 (datetime 객체: args[0], 형식: args[1])
  • timedelta: 시간차 객체 반환 (relativedelta 객체) (참조)
  • dt+: datetime 객체와 relativedelta 객체들의 합을 반환 (datetime 객체)
  • km_to_latitude_degrees: km 거리를 위도상 각도로 변환 (args[0]: km)
  • km_to_longitude_degrees: km 거리를 경도상 각도로 변환 (args[0]: km, args[1]: 기준 위도)
  • distance: 유클리디안 거리 계산 (args: x1, y1, x2, y2)
  • geo_distance: 위경도 기반 거리 계산 (args: lat1, lon1, lat2, lon2) (단위: km)
  • rand: 0~1 사이의 난수 (seed: args[0])
  • beta: 베타 분포를 따르는 random variable (a: args[0], b: args[1], seed: args[2])
  • pf: 프로파일 API 조회 (api_type: args[0], profile_id: args[1], item_id/user_id: args[2], keys: args[3])
  • with: args[-1]의 프로세스에 {args[0]: arg[1], args[2]: args[3]…}의 데이터를 var로 참조 가능
  • for: args[0]를 iterator로 사용하여 args[1] 루프. {"var": "i"}, {"var": "i.0"} 등으로 iterator 참조 가능 (map과 유사)

Methods

def apply(self, tests, data=None, pf_client=None, graph_client=None, dynamodb_client=None)

Args

  • tests: (dict) 테스트 할 json 형식의 로직
  • data: (optional) (dict) 로직에서 참조할 데이터 dict (기본값: None)
  • pf_client: (optional) (MLSProfileAPIClient) 로직에서 사용할 프로파일 API 클라이언트 (기본값: None)
  • graph_client: (optional) (MLSGraphAPIClient) 로직에서 사용할 그래프 API 클라이언트 (기본값: None)
  • dynamodb_client: (optional) (DynamoDBClient) 로직에서 사용할 DynamoDB 클라이언트 (기본값: None)