Ejemplo n.º 1
0
class Num:
    def __init__(self, mx):
        self.n = 0
        self.mu = 0
        self.m2 = 0
        self.sd = 0
        self.lo = pow(10, 32)
        self.hi = pow(-10, 32)
        self._some = Sample(mx)
        self.w = 1

    def Nums(t, f):
        if f is None:
            f = lambda x: x

        n = Num(0)

        for x in t:
            n.NumInc(f(x))

        return n

    def NumInc(self, x):
        if x == "?":
            return x

        self.n += 1
        self._some.SampleInc(x)
        d = x - self.mu
        self.mu += d / self.n
        self.m2 += d * (x - self.mu)

        if x > self.hi:
            self.hi = x
        if x < self.lo:
            self.lo = x

        if self.n >= 2:
            self.sd = pow(self.m2 / (self.n - 1 + pow(10, -32)), 0.5)

        return x

    def NumDec(self, x):
        if x == "?":
            return x
        if (self.n == 1):
            return x

        self.n -= 1
        d = x - self.mu
        self.mu -= d / self.n
        self.m2 -= d * (x - self.mu)

        if self.n >= 2:
            self.sd = pow(self.m2 / (self.n - 1 + pow(10, -32)), 0.5)

        return x

    def NumNorm(self, x):
        return x == "?" and 0.5 or (x - self.lo) / (self.hi - self.lo +
                                                    pow(10, -32))

    def NumXpect(self, j):
        n = self.n + j.n + 0.0001

        return self.n / n * self.sd + j.n / n * j.sd