/timm's /charming /python /tricks

log.py

Download log.py.
Read more on How to be Charming (in Python).


001: import sys
002: sys.dont_write_bytecode=True # no .pyc files
003: from the import *
004: from about import *
005: from lib import *
006: 
007: class Nums(AutoDict):
008:   def __init__(i):
009:     AutoDict.__init__(i,Num)
010: 
011: stop=StopIteration 
012: 
013: class Control:
014:   def __init__(i,
015:                iter=range(0,100),
016:                epsilon= 0.005,
017:                also=None,
018:                era= 100,
019:                cohen=The.math.cohen,
020:                haltOn=None,
021:                cmp=lambda old, new: new - old):
022:     i.iter=iter
023:     i.era = era
024:     i.epsilon = epsilon
025:     i.all = Nums()
026:     i.now = Nums()
027:     i.also = also
028:     i.cohen = cohen
029:     i.haltOn = haltOn
030:     i.cmp = cmp
031:   def thisEra(i,tick):
032:     return int(tick/i.era)*i.era
033:   def small(i,where) : 
034:     if not where in i.all: 1/0
035:     return i.all[where].s*i.cohen
036:   def enough(i,where,when) :
037:     if (where,when) in i.now: 
038:       val  = i.now[(where,when)].mu
039:       return val > (1 - i.epsilon)
040:     else:
041:       return False
042:   def done(i,when):
043:     where = i.haltOn
044:     if where:
045:       if i.enough(where,when) or \
046:             not i.improving(where,when): 
047:         return True
048:     return False
049:   def improving(i,where,when):
050:     before = when - i.era
051:     if (where,before) in i.now and \
052:        (where,when) in i.now:
053:       new = i.now[(where,when)]
054:       old = i.now[(where,before)]
055:       return i.cmp(old.mu,new.mu) > i.small(where)
056:     return False
057:   def seen(i,tick,**d):
058:     when = i.thisEra(tick)
059:     for where,what in d.items():
060:       i.seen1(when,what,where)
061:   def seen1(i,when,what,where):
062:     if i.also: 
063:       i.also.seen1(when,what,where)
064:     i.all[where].seen(what)
065:     i.now[(where, when)].seen(what)
066:   def loop(i):
067:     before = 0
068:     for tick in i.iter:
069:       now = i.thisEra(tick)
070:       if before and now != before:
071:         if i.done(before):
072:           break
073:       before = now
074:       yield tick
075:       
076:  
077: def controlled(control,lo,hi,
078:            key  =lambda z:'%10s' %  z,
079:            value=lambda z: '%2d' %  z
080:            ):
081:     d = control.now
082:     wheres= {}
083:     whens = {}
084:     for where,when in d.keys():
085:       wheres[where] = 1
086:       whens[ when ] = 1
087:     wheres = sorted(wheres.keys())
088:     whens  = sorted(whens.keys())
089:     for where in wheres:
090:       print '\n------|',str(where),\
091:             '|----------------------------------\n'
092:       for when in whens:
093:         if (where,when) in d:
094:           all = d[(where,when)].cached()
095:           s   = "?"
096:           if len(all) > 5:
097:             s=   xtile(all,show = value,
098:                      lo=lo,hi=hi)
099:           print '%10s' % key(when),\
100:               '[%5s]' % len(all), s
101:         
102: """
103: ### xtile: Pretty Print  Distributions
104: 
105: The function _xtile_ takes a list of (possibly) unsorted numbers and
106: presents them as a horizontal xtile chart (in ascii format). The default
107: is a contracted _quintile_ that shows the 10,30,50,70,90 breaks in the
108: data (but this can be changed- see the optional flags of the function).
109: 
110: """
111: def xtile(lst,lo=0,hi=100,width=50,
112:              chops=[0.1 ,0.3,0.5,0.7,0.9],
113:              marks=["-" ," "," ","-"," "],
114:              bar="|",star="*",show= lambda s:" %3.0f" % s):
115:   def pos(p)   : return ordered[int(len(lst)*p)]
116:   def place(x) : 
117:     tmp= int(width*float((x - lo))/(hi - lo))
118:     if tmp == width: tmp += -1
119:     return tmp
120:   def pretty(lst) : 
121:     return ', '.join([show(x) for x in lst])
122:   ordered = sorted(lst)
123:   lo      = min(lo,ordered[0])
124:   hi      = max(hi,ordered[-1])
125:   what    = [pos(p)   for p in chops]
126:   where   = [place(n) for n in  what]
127:   out     = [" "] * width
128:   for one,two in pairs(where):
129:     for i in range(one,two): 
130:       out[i] = marks[0]
131:     marks = marks[1:]
132:   out[int(width/2)]    = bar
133:   loc = place(pos(0.5)) 
134:   #print loc, len(out)
135:   out[loc] = star 
136:   return ''.join(out) +  "," +  pretty(what)
137: 
138: def _tileX() :
139:   import random
140:   random.seed(1)
141:   nums = [random.random()**2 for _ in range(100)]
142:   print xtile(nums,lo=0,hi=1.0,width=25,show= lambda s:" %3.2f" % s)
143: 
144: 
145: #c = Control(haltOn='a',era=200,hi=1000,val='%5.2f')
146: #for x in c:
147: # c.seen(x,f(x**0.25),'a')
148: def _control():
149:   def f(t): return 1.0/(1 + e**(-1*t))
150:   c =  Control(range(0,100))
151:   for x in c.loop():
152:     c.seens(x/20,seen=f(x**0.1))
153:     print x
154:   controlled(c,0,1,
155:              value=lambda s: '%4.2f' % s)
156: 
157: 
158: 

This file is part of Timm's charming Python tricks.
© 2014, Tim Menzies: tim.menzies@gmail.com, http://menzies.us.

Timm's charming Python tricks are free software: you can redistribute it and/or modify it under the terms of the GNU Lesser Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

Timm's charming Python tricks are distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU Lesser Public License along with Foobar. If not, see http://www.gnu.org/licenses.