Source code for varwg.ecdf

import numpy as np
from scipy import stats, interpolate
import matplotlib.pyplot as plt


[docs] class ECDF: def __init__(self, data, data_min=None, data_max=None): self.data = data fin_mask = np.isfinite(data) data_fin = data[fin_mask] if data_min is None: data_min = data_fin.min() if data_max is None: data_max = data_fin.max() sort_ii = np.argsort(data_fin) self.ranks_rel = np.full(len(data), np.nan) self.ranks_rel[fin_mask] = ( stats.rankdata(data_fin, "min") - 0.5 ) / len(data_fin) self._data_sort_pad = np.concatenate( ([data_min], data_fin[sort_ii], [data_max]) ) self._ranks_sort_pad = np.concatenate( ([0], self.ranks_rel[fin_mask][sort_ii], [1]) ) self._cdf = interpolate.interp1d( self._data_sort_pad, self._ranks_sort_pad, bounds_error=False, fill_value=(0, 1), ) self._ppf = interpolate.interp1d( self._ranks_sort_pad, self._data_sort_pad, # bounds_error=False, fill_value=(data_min, data_max), )
[docs] def cdf(self, x=None): if x is None: return self.ranks_rel return np.where(np.isfinite(x), self._cdf(x), np.nan)
[docs] def ppf(self, p=None): if p is None: return self.data return np.where(np.isfinite(p), self._ppf(p), np.nan)
[docs] def plot_cdf(self, fig=None, ax=None, *args, **kwds): if fig is None or ax is None: fig, ax = plt.subplots() ax.plot(self._data_sort_pad, self._ranks_sort_pad, *args, **kwds) return fig, ax