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 MATCH(index, needle, *haystack): if is_missing(needle): -2147483648 for index, value in enumerate(haystack): if is_equal(needle, value): return index + 1 else: return -2147483648
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 SUM(index, arg0: float, *args: float, ignore_missing: int = 0, min_valid: int = 0): values = [arg0] values.extend(args) if min_valid > 0 or ignore_missing != 0: values = list(filter(lambda x: not is_missing(x), values)) if len(values) < min_valid: return NaN return math.fsum(values)
def MEAN(index, arg0: float, *args: float, ignore_missing: int = 0, min_valid: int = 0): values = [arg0] values.extend(args) if min_valid > 0 or ignore_missing != 0: values = list(filter(lambda x: not is_missing(x), values)) if len(values) < min_valid: return NaN else: return stats.mean(values)
def ABS(index, value: num): if is_missing(value): return value return abs(value)
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)
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 IF(index, cond: int, x=1, y=-2147483648): if is_missing(cond, True): return -2147483648 return x if cond else y
def VN(values): values = filter(lambda v: not is_missing(v), values) return sum(1 for _ in values)