def _binop(self, other, func, level=None, fill_value=None):
if not isinstance(other, Series):<EOL><INDENT>raise AssertionError('<STR_LIT>')<EOL><DEDENT>new_index = self.index<EOL>this = self<EOL>if not self.index.equals(other.index):<EOL><INDENT>this, other = self.align(other, level=level, join='<STR_LIT>',<EOL>copy=False)<EOL>new_index = this.index<EOL><DEDENT>this_vals, other_vals = ops.fill_binop(this.values, other.values,<EOL>fill_value)<EOL>with np.errstate(all='<STR_LIT:ignore>'):<EOL><INDENT>result = func(this_vals, other_vals)<EOL><DEDENT>name = ops.get_op_result_name(self, other)<EOL>if func.__name__ in ['<STR_LIT>', '<STR_LIT>']:<EOL><INDENT>ret = ops._construct_divmod_result(self, result, new_index, name)<EOL><DEDENT>else:<EOL><INDENT>ret = ops._construct_result(self, result, new_index, name)<EOL><DEDENT>return ret<EOL>
Perform generic binary operation with optional fill value.

Parameters
----------
other : Series
func : binary operator
fill_value : float or object
    Value to substitute for NA/null values. If both Series are NA in a
    location, the result will be NA regardless of the passed fill value
level : int or level name, default None
    Broadcast across a level, matching Index values on the
    passed MultiIndex level

Returns
-------
Series