def nanskew(values, axis=None, skipna=True): mask = isnull(values) if not is_floating_dtype(values): values = values.astype('f8') count = _get_counts(mask, axis) if skipna: values = values.copy() np.putmask(values, mask, 0) A = values.sum(axis) / count B = (values**2).sum(axis) / count - A**2 C = (values**3).sum(axis) / count - A**3 - 3 * A * B # floating point error B = _zero_out_fperr(B) C = _zero_out_fperr(C) result = ((np.sqrt( (count**2 - count)) * C) / ((count - 2) * np.sqrt(B)**3)) if isinstance(result, np.ndarray): result = np.where(B == 0, 0, result) result[count < 3] = np.nan return result else: result = 0 if B == 0 else result if count < 3: return np.nan return result
def nankurt(values, axis=None, skipna=True): mask = isnull(values) if not is_floating_dtype(values): values = values.astype('f8') count = _get_counts(mask, axis) if skipna: values = values.copy() np.putmask(values, mask, 0) A = values.sum(axis) / count B = (values**2).sum(axis) / count - A**2 C = (values**3).sum(axis) / count - A**3 - 3 * A * B D = (values**4).sum(axis) / count - A**4 - 6 * B * A * A - 4 * C * A B = _zero_out_fperr(B) D = _zero_out_fperr(D) if not isinstance(B, np.ndarray): # if B is a scalar, check these corner cases first before doing division if count < 4: return np.nan if B == 0: return 0 result = (((count * count - 1.) * D / (B * B) - 3 * ((count - 1.)**2)) / ((count - 2.) * (count - 3.))) if isinstance(result, np.ndarray): result = np.where(B == 0, 0, result) result[count < 4] = np.nan return result
def nankurt(values, axis=None, skipna=True): mask = isnull(values) if not is_floating_dtype(values): values = values.astype('f8') count = _get_counts(mask, axis) if skipna: values = values.copy() np.putmask(values, mask, 0) A = values.sum(axis) / count B = (values ** 2).sum(axis) / count - A ** 2 C = (values ** 3).sum(axis) / count - A ** 3 - 3 * A * B D = (values ** 4).sum(axis) / count - A ** 4 - 6 * B * A * A - 4 * C * A B = _zero_out_fperr(B) D = _zero_out_fperr(D) if not isinstance(B, np.ndarray): # if B is a scalar, check these corner cases first before doing division if count < 4: return np.nan if B == 0: return 0 result = (((count * count - 1.) * D / (B * B) - 3 * ((count - 1.) ** 2)) / ((count - 2.) * (count - 3.))) if isinstance(result, np.ndarray): result = np.where(B == 0, 0, result) result[count < 4] = np.nan return result
def nanskew(values, axis=None, skipna=True): mask = isnull(values) if not is_floating_dtype(values): values = values.astype('f8') count = _get_counts(mask, axis) if skipna: values = values.copy() np.putmask(values, mask, 0) A = values.sum(axis) / count B = (values ** 2).sum(axis) / count - A ** 2 C = (values ** 3).sum(axis) / count - A ** 3 - 3 * A * B # floating point error B = _zero_out_fperr(B) C = _zero_out_fperr(C) result = ((np.sqrt((count ** 2 - count)) * C) / ((count - 2) * np.sqrt(B) ** 3)) if isinstance(result, np.ndarray): result = np.where(B == 0, 0, result) result[count < 3] = np.nan return result else: result = 0 if B == 0 else result if count < 3: return np.nan return result
def nansem(values, axis=None, skipna=True, ddof=1): var = nanvar(values, axis, skipna, ddof=ddof) mask = isnull(values) if not is_floating_dtype(values): values = values.astype('f8') count, _ = _get_counts_nanvar(mask, axis, ddof) return np.sqrt(var) / np.sqrt(count)
def nansem(values, axis=None, skipna=True, ddof=1): var = nanvar(values, axis, skipna, ddof=ddof) mask = isnull(values) if not is_floating_dtype(values): values = values.astype('f8') count, _ = _get_counts_nanvar(mask, axis, ddof) return np.sqrt(var)/np.sqrt(count)
def _nanvar(values, axis=None, skipna=True, ddof=1): # private nanvar calculator mask = isnull(values) if not is_floating_dtype(values): values = values.astype('f8') count, d = _get_counts_nanvar(mask, axis, ddof) if skipna: values = values.copy() np.putmask(values, mask, 0) X = _ensure_numeric(values.sum(axis)) XX = _ensure_numeric((values ** 2).sum(axis)) return np.fabs((XX - X ** 2 / count) / d)