def __rmul__(self, other):

        from probability.calculations.calculation_types import SampleCalculation
        from probability.calculations.calculation_types import \
            BinaryOperatorCalculation
        from probability.calculations.calculation_types.value_calculation import \
            ValueCalculation

        if isinstance(other, ProbabilityCalculationMixin):
            context = other.context
            input_1 = other
        else:
            context = CalculationContext()
            if is_scalar(other):
                input_1 = ValueCalculation(calc_input=other, context=context)
            elif is_rvs(other):
                input_1 = SampleCalculation(calc_input=other, context=context)
            elif isinstance(other, Series) or isinstance(other, DataFrame):
                return other * self
            else:
                raise TypeError(
                    'other must be type Rvs1dMixin, RvsNdMixin float, '
                    'Series or DataFrame')

        input_2 = SampleCalculation(calc_input=self, context=context)

        return BinaryOperatorCalculation(calc_input_1=input_1,
                                         calc_input_2=input_2,
                                         operator=MultiplyOperator,
                                         context=context)
    def __truediv__(self, other):
        """
        Multiply the Distribution by a float, distribution, Series or DataFrame.

        :param other: The divisor. N.B. if it is a Series or a DataFrame,
                      the context of each value will not be synced. Use
                      `sync_context` if syncing is needed.
        """
        from probability.calculations.calculation_types import SampleCalculation
        from probability.calculations.calculation_types import \
            BinaryOperatorCalculation
        from probability.calculations.calculation_types.value_calculation import \
            ValueCalculation

        if isinstance(other, ProbabilityCalculationMixin):
            context = other.context
            input_2 = other
        else:
            context = CalculationContext()
            if is_scalar(other):
                input_2 = ValueCalculation(calc_input=other, context=context)
            elif is_rvs(other):
                input_2 = SampleCalculation(calc_input=other, context=context)
            elif isinstance(other, Series):
                return Series(
                    {key: self / value
                     for key, value in other.iteritems()})
            elif isinstance(other, DataFrame):
                return DataFrame({
                    column: {
                        key: self / value
                        for key, value in other[column].iteritems()
                    }
                    for column in other.columns
                })
            else:
                raise TypeError(
                    'other must be type Rvs1dMixin, RvsNdMixin float, '
                    'Series or DataFrame')

        input_1 = SampleCalculation(calc_input=self, context=context)

        return BinaryOperatorCalculation(calc_input_1=input_1,
                                         calc_input_2=input_2,
                                         operator=DivideOperator,
                                         context=context)
def reverse_binary_operation(item_1, item_2, builtin_operator,
                             calc_operator_type):

    if isinstance(item_2, ProbabilityCalculationMixin):
        input_1 = item_2
        input_1.set_context(item_1.context)
    else:
        context = CalculationContext()
        if is_scalar(item_2):
            input_1 = ValueCalculation(calc_input=item_2, context=context)
        elif is_rvs(item_2):
            input_1 = SampleCalculation(calc_input=item_2, context=context)
        elif isinstance(item_2, Series):
            return Series({
                key: builtin_operator(value, item_1)
                for key, value in item_2.items()
            })
        elif isinstance(item_2, DataFrame):
            return DataFrame({
                column: {
                    key: builtin_operator(value, item_1)
                    for key, value in item_2[column].items()
                }
                for column in item_2.columns
            })
        else:
            raise TypeError(
                'item_2 must be type Rvs1dMixin, RvsNdMixin, int, float, '
                'Series or DataFrame')

    from \
        probability.calculations.calculation_types.binary_operator_calculation \
        import BinaryOperatorCalculation

    return BinaryOperatorCalculation(calc_input_1=input_1,
                                     calc_input_2=item_1,
                                     operator=calc_operator_type,
                                     context=item_1.context)