Пример #1
0
    def sub(self, left: IndexOpsLike, right: Any) -> SeriesOrIndex:
        _sanitize_list_like(right)
        if not is_valid_operand_for_numeric_arithmetic(right):
            raise TypeError("Subtraction can not be applied to given types.")

        right = transform_boolean_operand_to_numeric(right, spark_type=left.spark.data_type)
        return column_op(Column.__sub__)(left, right)
Пример #2
0
    def mul(self, left: IndexOpsLike, right: Any) -> SeriesOrIndex:
        if not is_valid_operand_for_numeric_arithmetic(right):
            raise TypeError(
                "Multiplication can not be applied to given types.")

        right = transform_boolean_operand_to_numeric(
            right, spark_type=left.spark.data_type)
        return column_op(Column.__mul__)(left, right)
Пример #3
0
    def pow(self, left: IndexOpsLike, right: Any) -> SeriesOrIndex:
        if not is_valid_operand_for_numeric_arithmetic(right):
            raise TypeError("Exponentiation can not be applied to given types.")

        def pow_func(left: Column, right: Any) -> Column:
            return F.when(left == 1, left).otherwise(Column.__pow__(left, right))

        right = transform_boolean_operand_to_numeric(right, spark_type=left.spark.data_type)
        return column_op(pow_func)(left, right)
Пример #4
0
    def mod(self, left: IndexOpsLike, right: Any) -> SeriesOrIndex:
        if not is_valid_operand_for_numeric_arithmetic(right):
            raise TypeError("Modulo can not be applied to given types.")

        def mod(left: Column, right: Any) -> Column:
            return ((left % right) + right) % right

        right = transform_boolean_operand_to_numeric(right, spark_type=left.spark.data_type)
        return column_op(mod)(left, right)
Пример #5
0
    def mul(self, left: IndexOpsLike, right: Any) -> SeriesOrIndex:
        _sanitize_list_like(right)
        if isinstance(right, IndexOpsMixin) and isinstance(right.spark.data_type, StringType):
            return column_op(SF.repeat)(right, left)

        if not is_valid_operand_for_numeric_arithmetic(right):
            raise TypeError("Multiplication can not be applied to given types.")

        right = transform_boolean_operand_to_numeric(right, spark_type=left.spark.data_type)
        return column_op(Column.__mul__)(left, right)
Пример #6
0
    def truediv(self, left: IndexOpsLike, right: Any) -> SeriesOrIndex:
        if not is_valid_operand_for_numeric_arithmetic(right):
            raise TypeError("True division can not be applied to given types.")

        def truediv(left: Column, right: Any) -> Column:
            return F.when(
                SF.lit(right != 0) | SF.lit(right).isNull(), left.__div__(right)
            ).otherwise(SF.lit(np.inf).__div__(left))

        right = transform_boolean_operand_to_numeric(right, spark_type=left.spark.data_type)
        return numpy_column_op(truediv)(left, right)
Пример #7
0
 def floordiv(self, left, right) -> Union["Series", "Index"]:
     if not is_valid_operand_for_numeric_arithmetic(right, allow_bool=False):
         raise TypeError(
             "Floor division can not be applied to %s and the given type." % self.pretty_name)
     if isinstance(right, numbers.Number) and not isinstance(right, bool):
         left = left.spark.transform(lambda scol: scol.cast(as_spark_type(type(right))))
         return left // right
     else:
         assert isinstance(right, IndexOpsMixin)
         left = transform_boolean_operand_to_numeric(left, right.spark.data_type)
         return left // right
Пример #8
0
 def sub(self, left: T_IndexOps, right: Any) -> IndexOpsLike:
     if not is_valid_operand_for_numeric_arithmetic(right, allow_bool=False):
         raise TypeError(
             "Subtraction can not be applied to %s and the given type." % self.pretty_name
         )
     if isinstance(right, numbers.Number) and not isinstance(right, bool):
         left = left.spark.transform(lambda scol: scol.cast(as_spark_type(type(right))))
         return left - right
     else:
         assert isinstance(right, IndexOpsMixin)
         left = transform_boolean_operand_to_numeric(left, right.spark.data_type)
         return left - right
Пример #9
0
    def sub(self, left: T_IndexOps, right: Any) -> IndexOpsLike:
        if (isinstance(right, IndexOpsMixin) and isinstance(
                right.spark.data_type, StringType)) or isinstance(right, str):
            raise TypeError(
                "subtraction can not be applied to string series or literals.")

        if not is_valid_operand_for_numeric_arithmetic(right):
            raise TypeError("subtraction can not be applied to given types.")

        right = transform_boolean_operand_to_numeric(right,
                                                     left.spark.data_type)

        return column_op(Column.__sub__)(left, right)
Пример #10
0
 def sub(self, left: IndexOpsLike, right: Any) -> SeriesOrIndex:
     _sanitize_list_like(right)
     if not is_valid_operand_for_numeric_arithmetic(right, allow_bool=False):
         raise TypeError(
             "Subtraction can not be applied to %s and the given type." % self.pretty_name
         )
     if isinstance(right, numbers.Number):
         left = transform_boolean_operand_to_numeric(left, spark_type=as_spark_type(type(right)))
         return left - right
     else:
         assert isinstance(right, IndexOpsMixin)
         left = transform_boolean_operand_to_numeric(left, spark_type=right.spark.data_type)
         return left - right
Пример #11
0
    def add(self, left, right) -> Union["Series", "Index"]:
        if (isinstance(right, IndexOpsMixin) and isinstance(
                right.spark.data_type, StringType)) or isinstance(right, str):
            raise TypeError(
                "string addition can only be applied to string series or literals."
            )

        if not is_valid_operand_for_numeric_arithmetic(right):
            raise TypeError("addition can not be applied to given types.")

        right = transform_boolean_operand_to_numeric(right,
                                                     left.spark.data_type)

        return column_op(Column.__add__)(left, right)
Пример #12
0
    def mod(self, left: T_IndexOps, right: Any) -> IndexOpsLike:
        if (isinstance(right, IndexOpsMixin) and isinstance(
                right.spark.data_type, StringType)) or isinstance(right, str):
            raise TypeError(
                "modulo can not be applied on string series or literals.")

        if not is_valid_operand_for_numeric_arithmetic(right):
            raise TypeError("modulo can not be applied to given types.")

        right = transform_boolean_operand_to_numeric(right,
                                                     left.spark.data_type)

        def mod(left: Column, right: Any) -> Column:
            return ((left % right) + right) % right

        return column_op(mod)(left, right)
Пример #13
0
 def mul(self, left, right) -> Union["Series", "Index"]:
     if not is_valid_operand_for_numeric_arithmetic(right):
         raise TypeError(
             "Multiplication can not be applied to %s and the given type." % self.pretty_name
         )
     if isinstance(right, bool):
         return left.__and__(right)
     elif isinstance(right, numbers.Number):
         left = left.spark.transform(lambda scol: scol.cast(as_spark_type(type(right))))
         return left * right
     else:
         assert isinstance(right, IndexOpsMixin)
         if isinstance(right, IndexOpsMixin) and isinstance(right.spark.data_type, BooleanType):
             return left.__and__(right)
         else:
             left = transform_boolean_operand_to_numeric(left, right.spark.data_type)
             return left * right
Пример #14
0
    def mul(self, left: T_IndexOps, right: Any) -> IndexOpsLike:
        if isinstance(right, str):
            raise TypeError(
                "multiplication can not be applied to a string literal.")

        if isinstance(right, IndexOpsMixin) and isinstance(
                right.spark.data_type, TimestampType):
            raise TypeError("multiplication can not be applied to date times.")

        if not is_valid_operand_for_numeric_arithmetic(right):
            raise TypeError(
                "multiplication can not be applied to given types.")

        right = transform_boolean_operand_to_numeric(right,
                                                     left.spark.data_type)

        return column_op(Column.__mul__)(left, right)
Пример #15
0
 def mul(self, left: IndexOpsLike, right: Any) -> SeriesOrIndex:
     _sanitize_list_like(right)
     if not is_valid_operand_for_numeric_arithmetic(right):
         raise TypeError(
             "Multiplication can not be applied to %s and the given type." % self.pretty_name
         )
     if isinstance(right, bool):
         return left.__and__(right)
     elif isinstance(right, numbers.Number):
         left = transform_boolean_operand_to_numeric(left, spark_type=as_spark_type(type(right)))
         return left * right
     else:
         assert isinstance(right, IndexOpsMixin)
         if isinstance(right, IndexOpsMixin) and isinstance(right.spark.data_type, BooleanType):
             return left.__and__(right)
         else:
             left = transform_boolean_operand_to_numeric(left, spark_type=right.spark.data_type)
             return left * right
Пример #16
0
    def truediv(self, left: T_IndexOps, right: Any) -> IndexOpsLike:
        if (isinstance(right, IndexOpsMixin) and isinstance(
                right.spark.data_type, StringType)) or isinstance(right, str):
            raise TypeError(
                "division can not be applied on string series or literals.")

        if not is_valid_operand_for_numeric_arithmetic(right):
            raise TypeError("division can not be applied to given types.")

        right = transform_boolean_operand_to_numeric(right,
                                                     left.spark.data_type)

        def truediv(left: Column, right: Any) -> Column:
            return F.when(
                F.lit(right != 0) | F.lit(right).isNull(),
                left.__div__(right)).otherwise(F.lit(np.inf).__div__(left))

        return numpy_column_op(truediv)(left, right)
Пример #17
0
    def floordiv(self, left: IndexOpsLike, right: Any) -> SeriesOrIndex:
        _sanitize_list_like(right)
        if not is_valid_operand_for_numeric_arithmetic(right):
            raise TypeError("Floor division can not be applied to given types.")

        def floordiv(left: Column, right: Any) -> Column:
            return F.when(SF.lit(right is np.nan), np.nan).otherwise(
                F.when(
                    SF.lit(right != 0) | SF.lit(right).isNull(), F.floor(left.__div__(right))
                ).otherwise(
                    F.when(SF.lit(left == np.inf) | SF.lit(left == -np.inf), left).otherwise(
                        SF.lit(np.inf).__div__(left)
                    )
                )
            )

        right = transform_boolean_operand_to_numeric(right, spark_type=left.spark.data_type)
        return numpy_column_op(floordiv)(left, right)
Пример #18
0
    def pow(self, left: T_IndexOps, right: Any) -> IndexOpsLike:
        if (isinstance(right, IndexOpsMixin) and isinstance(
                right.spark.data_type, StringType)) or isinstance(right, str):
            raise TypeError(
                "exponentiation can not be applied on string series or literals."
            )

        if not is_valid_operand_for_numeric_arithmetic(right):
            raise TypeError(
                "exponentiation can not be applied to given types.")

        right = transform_boolean_operand_to_numeric(right,
                                                     left.spark.data_type)

        def pow_func(left: Column, right: Any) -> Column:
            return F.when(left == 1,
                          left).otherwise(Column.__pow__(left, right))

        return column_op(pow_func)(left, right)
Пример #19
0
    def floordiv(self, left, right) -> Union["Series", "Index"]:
        if (isinstance(right, IndexOpsMixin) and isinstance(
                right.spark.data_type, StringType)) or isinstance(right, str):
            raise TypeError(
                "division can not be applied on string series or literals.")

        if not is_valid_operand_for_numeric_arithmetic(right):
            raise TypeError("division can not be applied to given types.")

        right = transform_boolean_operand_to_numeric(right,
                                                     left.spark.data_type)

        def floordiv(left, right):
            return F.when(F.lit(right is np.nan), np.nan).otherwise(
                F.when(
                    F.lit(right != 0) | F.lit(right).isNull(),
                    F.floor(left.__div__(right))).otherwise(
                        F.lit(np.inf).__div__(left)))

        return numpy_column_op(floordiv)(left, right)
Пример #20
0
    def add(self, left: IndexOpsLike, right: Any) -> SeriesOrIndex:
        if not is_valid_operand_for_numeric_arithmetic(right):
            raise TypeError(
                "Addition can not be applied to %s and the given type." %
                self.pretty_name)

        if isinstance(right, bool):
            return left.__or__(right)
        elif isinstance(right, numbers.Number):
            left = left.spark.transform(
                lambda scol: scol.cast(as_spark_type(type(right))))
            return left + right
        else:
            assert isinstance(right, IndexOpsMixin)
            if isinstance(right, IndexOpsMixin) and isinstance(
                    right.spark.data_type, BooleanType):
                return left.__or__(right)
            else:
                left = transform_boolean_operand_to_numeric(
                    left, right.spark.data_type)
                return left + right