Computes the standard deviation of either the positive or negative subset of values.
       The subset is first converted into a symmetrical set of values by unioning it with its complemented/mirrored set
       along the origin i.e. if x is a value in the subset then both x and -x are members of the symmetrical set.
       The standard deviation is then computed on this symmetrical set.

       Note: zeroes are generally ignored as they could be included into both sides of a distribution split.

    :param values: A list of numerical values.
    :param take_positive_values: If True then the subset of positive numbers in values is considered. Otherwise, the subset of negative values is considered.
    :param ignore_zeros: Whether or not zeroes should be considered when determining the standard deviations.
    :return:

def get_symmetrical_std_dev(values, take_positive_values, ignore_zeros = True):
    """Computes the standard deviation of either the positive or negative subset of values.
       The subset is first converted into a symmetrical set of values by unioning it with its complemented/mirrored set
       along the origin i.e. if x is a value in the subset then both x and -x are members of the symmetrical set.
       The standard deviation is then computed on this symmetrical set.

       Note: zeroes are generally ignored as they could be included into both sides of a distribution split.

    :param values: A list of numerical values.
    :param take_positive_values: If True then the subset of positive numbers in values is considered. Otherwise, the subset of negative values is considered.
    :param ignore_zeros: Whether or not zeroes should be considered when determining the standard deviations.
    :return:
    """
    if take_positive_values:
        if ignore_zeros:
            temp_pos = np.array([value for value in values if value > 0.0])
        else:
            temp_pos = np.array([value for value in values if value >= 0.0])
    else:
        if ignore_zeros:
            temp_pos = np.array([value for value in values if value < 0.0])
        else:
            temp_pos = np.array([value for value in values if value <= 0.0])

    # Convert the subset into a symmetrical distribution
    temp_pos = np.concatenate((temp_pos, -temp_pos))

    # Calculate standard deviations for sigma-based significance cutoffs
    std_dev = np.std(temp_pos)

    if not take_positive_values:
        # Return a negative standard deviation for the subset of negative values
        std_dev = -std_dev
    return std_dev