def fit(self, i, x, y, yerr = None): ff = self.ff[i] if ff: ff = ff.replace(' ', '') log.info('fitting function {}'.format(ff)) fitfunc = eval('lambda x,*p:' + ff) x, y = np.array(x), np.array(y) m = np.logical_and(np.isfinite(x), np.isfinite(y)) if yerr is not None: yerr = np.array(yerr) m = np.logical_and(m, np.isfinite(yerr)) yerr = yerr[m] x , y = x[m], y[m] p = eval(self.fp[i]) try: p, c = curve_fit(fitfunc, x, y, p, yerr) log.info('parameters = {}'.format(p)) log.info('covariance = {}'.format(c)) fit_status = '' except Exception as e: fit_status = ' (failed: {})'.format(e) c = None log.exception('fit failed') # plot fit result xfit = np.linspace(np.nanmin(x), np.nanmax(x), 1000) yfit = fitfunc(xfit, *p) args = [xfit, yfit] if self.fl[i]: args.append(self.fl[i]) l, = plt.plot(*args) N = len(x) chi2 = fitfunc(x, *p) - y if yerr is not None: chi2 = chi2 / yerr chi2 = (chi2 ** 2).sum() # add textbox t = 'y=' + ff t += '\n$\\chi^2$/N = {}/{}'.format(number_format(chi2), number_format(N)) for k, v in enumerate(p): try: t += '\np[{}] = {}$\\pm${}'.format(k, number_format(v), number_format(np.sqrt(c[k, k]))) except: t += '\np[{}] = {}$\\pm${}'.format(k, v, c) self.textboxes.append(t) ll = ('Fit' + fit_status + ' y=' + ff) for k, v in enumerate(p): ll = ll.replace('p[{}]'.format(k), number_format(v, 3)) self.legend.append((l, ll))
def fit(self, i, x, y, yerr=None): ff = self.ff[i] if ff: ff = ff.replace(' ', '') log.info('fitting function {}'.format(ff)) fitfunc = eval('lambda x,*p:' + ff) x, y = np.array(x), np.array(y) m = np.logical_and(np.isfinite(x), np.isfinite(y)) if yerr is not None: yerr = np.array(yerr) m = np.logical_and(m, np.isfinite(yerr)) yerr = yerr[m] x, y = x[m], y[m] p = eval(self.fp[i]) try: p, c = curve_fit(fitfunc, x, y, p, yerr) log.info('parameters = {}'.format(p)) log.info('covariance = {}'.format(c)) fit_status = '' except Exception as e: fit_status = ' (failed: {})'.format(e) c = None log.exception('fit failed') # plot fit result xfit = np.linspace(np.nanmin(x), np.nanmax(x), 1000) yfit = fitfunc(xfit, *p) args = [xfit, yfit] if self.fl[i]: args.append(self.fl[i]) l, = plt.plot(*args) N = len(x) chi2 = fitfunc(x, *p) - y if yerr is not None: chi2 = chi2 / yerr chi2 = (chi2**2).sum() # add textbox t = 'y=' + ff t += '\n$\\chi^2$/N = {}/{}'.format(number_format(chi2), number_format(N)) for k, v in enumerate(p): try: t += '\np[{}] = {}$\\pm${}'.format( k, number_format(v), number_format(np.sqrt(c[k, k]))) except: t += '\np[{}] = {}$\\pm${}'.format(k, v, c) self.textboxes.append(t) ll = ('Fit' + fit_status + ' y=' + ff) for k, v in enumerate(p): ll = ll.replace('p[{}]'.format(k), number_format(v, 3)) self.legend.append((l, ll))
def stats_fields2d(self, i, contents, xcenters, ycenters): stats = {} stats['N'] = N = contents.sum() stats['mean'] = mean = np.array([ (contents.sum(axis = 0) * xcenters).sum(), (contents.sum(axis = 1) * ycenters).sum()]) / N stats['std'] = np.sqrt(np.array([(contents.sum(axis = 0) * (xcenters - mean[0]) ** 2).sum(), (contents.sum(axis = 1) * (ycenters - mean[1]) ** 2).sum()]) / N) cov = 0 for k, l in product(xrange(contents.shape[1]), xrange(contents.shape[0])): cov += contents[l, k] * (xcenters[k] - mean[0]) * (ycenters[l] - mean[1]) stats['cov'] = cov / N log.debug(stats) text = '{:6} {}'.format('hist', self.llabel(i)) sb = self.sb[i] if 'a' in sb: sb = 'nmscpewx' if 'uflow' in stats and stats['uflow']: sb += 'u' if 'oflow' in stats and stats['oflow']: sb += 'o' for k in sb: k = stats_abrv[k] if k in stats: v = stats[k] try: v = number_format(v) except: v = '({})'.format(','.join(map(number_format, v))) text += '\n{:6} {}'.format(k, v) self.textboxes.append(text)
def stats_fields1d(self, i, data, contents, errors, edges): centers = (edges[1:] + edges[:-1]) / 2 widths = np.diff(edges) stats = {} stats['N'] = N = np.sum(contents) stats['uflow'] = np.sum(data < edges[0]) stats['oflow'] = np.sum(edges[-1] < data) stats['mean'] = mean = np.sum(centers * contents) / N stats['std'] = std = np.sqrt(np.sum((centers - mean) ** 2 * contents) / N) stats['mode'] = centers[np.argmax(contents)] bc, be = get_density(contents, errors, widths) bc, be = get_cumulative(bc, be, 1, widths) median_i = np.minimum(len(centers)-1, np.searchsorted(bc, 0.5, side = 'right')) stats['median'] = median = centers[median_i] if len(centers) % 2 == 0: # even # of s stats['median'] = median = (median + centers[median_i - 1]) / 2 stats['skew'] = np.sum(((centers - mean) / std) ** 3 * contents) / N stats['kurtos'] = kurtosis = np.sum(((centers - mean) / std) ** 4 * contents) / N stats['excess'] = kurtosis - 3 log.debug(stats) text = '{:6} {}'.format('hist', self.llabel(i)) sb = self.sb[i] if 'a' in sb: sb = 'nmscpewx' if 'uflow' in stats and stats['uflow']: sb += 'u' if 'oflow' in stats and stats['oflow']: sb += 'o' for k in sb: k = stats_abrv[k] if k in stats: text += '\n{:6} {}'.format(k, number_format(stats[k])) self.textboxes.append(text)
def stats_fields2d(self, i, contents, xcenters, ycenters): stats = {} stats['N'] = N = contents.sum() stats['mean'] = mean = np.array( [(contents.sum(axis=0) * xcenters).sum(), (contents.sum(axis=1) * ycenters).sum()]) / N stats['std'] = np.sqrt( np.array([(contents.sum(axis=0) * (xcenters - mean[0])**2).sum(), (contents.sum(axis=1) * (ycenters - mean[1])**2).sum()]) / N) cov = 0 for k, l in product(xrange(contents.shape[1]), xrange(contents.shape[0])): cov += contents[l, k] * (xcenters[k] - mean[0]) * (ycenters[l] - mean[1]) stats['cov'] = cov / N log.debug(stats) text = '{:6} {}'.format('hist', self.llabel(i)) sb = self.sb[i] if 'a' in sb: sb = 'nmscpewx' if 'uflow' in stats and stats['uflow']: sb += 'u' if 'oflow' in stats and stats['oflow']: sb += 'o' for k in sb: k = stats_abrv[k] if k in stats: v = stats[k] try: v = number_format(v) except: v = '({})'.format(','.join(map(number_format, v))) text += '\n{:6} {}'.format(k, v) self.textboxes.append(text)
def stats_fields1d(self, i, data, contents, errors, edges): centers = (edges[1:] + edges[:-1]) / 2 widths = np.diff(edges) stats = {} stats['N'] = N = np.sum(contents) stats['uflow'] = np.sum(data < edges[0]) stats['oflow'] = np.sum(edges[-1] < data) stats['mean'] = mean = np.sum(centers * contents) / N stats['std'] = std = np.sqrt( np.sum((centers - mean)**2 * contents) / N) stats['mode'] = centers[np.argmax(contents)] bc, be = get_density(contents, errors, widths) bc, be = get_cumulative(bc, be, 1, widths) median_i = np.minimum( len(centers) - 1, np.searchsorted(bc, 0.5, side='right')) stats['median'] = median = centers[median_i] if len(centers) % 2 == 0: # even # of s stats['median'] = median = (median + centers[median_i - 1]) / 2 stats['skew'] = np.sum(((centers - mean) / std)**3 * contents) / N stats['kurtos'] = kurtosis = np.sum( ((centers - mean) / std)**4 * contents) / N stats['excess'] = kurtosis - 3 log.debug(stats) text = '{:6} {}'.format('hist', self.llabel(i)) sb = self.sb[i] if 'a' in sb: sb = 'nmscpewx' if 'uflow' in stats and stats['uflow']: sb += 'u' if 'oflow' in stats and stats['oflow']: sb += 'o' for k in sb: k = stats_abrv[k] if k in stats: text += '\n{:6} {}'.format(k, number_format(stats[k])) self.textboxes.append(text)