def FILTER(index, x, *conds: int): for cond in conds: if is_missing(cond, True): return -2147483648 if not cond: return -2147483648 return x
def RECODE(index, x, *args): for i in range(0, len(args) - 1, 2): cond = args[i] if not is_missing(cond) and cond: return args[i + 1] if len(args) % 2 == 1: return args[-1] else: return x
def ABS(index, value: num): if is_missing(value): return value return abs(value)
def NOT(index, x): if is_missing(x): return x return 1 if not x else 0
def IFMISS(index, cond, x=1, y=-2147483648): return x if is_missing(cond, empty_str_is_missing=True) else y
def IFELSE(index, cond: int, x=1, y=0): if is_missing(cond, True): return -2147483648 return x if cond else y
def IF(index, cond: int, x=1): if is_missing(cond, True): return -2147483648 return x if cond else -2147483648
def VN(values): values = filter(lambda v: not is_missing(v), values) return sum(1 for _ in values)
def SUM(index, arg0: float, *args: float, ignore_missing: int = 0): values = [arg0] values.extend(args) if ignore_missing != 0: values = list(filter(lambda x: not is_missing(x), values)) return math.fsum(values)
def STDEV(index, arg0: float, *args: float, ignore_missing: int = 0): values = [arg0] values.extend(args) if ignore_missing != 0: values = list(filter(lambda x: not is_missing(x), values)) return stats.stdev(values)
def MIN(index, arg0: float, *args: float): values = [arg0] values.extend(args) values = list(filter(lambda x: not is_missing(x), values)) return min(values)