📚 The CoCalc Library - books, templates and other resources
License: OTHER
"""This file contains code for use with "Think Stats",1by Allen B. Downey, available from greenteapress.com23Copyright 2010 Allen B. Downey4License: GNU GPLv3 http://www.gnu.org/licenses/gpl.html5"""67import bisect8import random910def Mean(t):11"""Computes the mean of a sequence of numbers.1213Args:14t: sequence of numbers1516Returns:17float18"""19return float(sum(t)) / len(t)202122def MeanVar(t):23"""Computes the mean and variance of a sequence of numbers.2425Args:26t: sequence of numbers2728Returns:29tuple of two floats30"""31mu = Mean(t)32var = Var(t, mu)33return mu, var343536def Trim(t, p=0.01):37"""Trims the largest and smallest elements of t.3839Args:40t: sequence of numbers41p: fraction of values to trim off each end4243Returns:44sequence of values45"""46n = int(p * len(t))47t = sorted(t)[n:-n]48return t495051def Jitter(values, jitter=0.5):52"""Jitters the values by adding a uniform variate in (-jitter, jitter)."""53return [x + random.uniform(-jitter, jitter) for x in values]545556def TrimmedMean(t, p=0.01):57"""Computes the trimmed mean of a sequence of numbers.5859Side effect: sorts the list.6061Args:62t: sequence of numbers63p: fraction of values to trim off each end6465Returns:66float67"""68t = Trim(t, p)69return Mean(t)707172def TrimmedMeanVar(t, p=0.01):73"""Computes the trimmed mean and variance of a sequence of numbers.7475Side effect: sorts the list.7677Args:78t: sequence of numbers79p: fraction of values to trim off each end8081Returns:82float83"""84t = Trim(t, p)85mu, var = MeanVar(t)86return mu, var878889def Var(t, mu=None):90"""Computes the variance of a sequence of numbers.9192Args:93t: sequence of numbers94mu: value around which to compute the variance; by default,95computes the mean.9697Returns:98float99"""100if mu is None:101mu = Mean(t)102103# compute the squared deviations and return their mean.104dev2 = [(x - mu)**2 for x in t]105var = Mean(dev2)106return var107108109def Binom(n, k, d={}):110"""Compute the binomial coefficient "n choose k".111112Args:113n: number of trials114k: number of successes115d: map from (n,k) tuples to cached results116117Returns:118int119"""120if k == 0:121return 1122if n == 0:123return 0124125try:126return d[n, k]127except KeyError:128res = Binom(n-1, k, d) + Binom(n-1, k-1, d)129d[n, k] = res130return res131132133class Interpolator(object):134"""Represents a mapping between sorted sequences; performs linear interp.135136Attributes:137xs: sorted list138ys: sorted list139"""140def __init__(self, xs, ys):141self.xs = xs142self.ys = ys143144def Lookup(self, x):145"""Looks up x and returns the corresponding value of y."""146return self._Bisect(x, self.xs, self.ys)147148def Reverse(self, y):149"""Looks up y and returns the corresponding value of x."""150return self._Bisect(y, self.ys, self.xs)151152def _Bisect(self, x, xs, ys):153"""Helper function."""154if x <= xs[0]:155return ys[0]156if x >= xs[-1]:157return ys[-1]158i = bisect.bisect(xs, x)159frac = 1.0 * (x - xs[i-1]) / (xs[i] - xs[i-1])160y = ys[i-1] + frac * 1.0 * (ys[i] - ys[i-1])161return y162163164165166