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)