/timm's /charming /python /tricks
Download
table.py.
Read more on How to be Charming (in Python).
01: import sys
02: sys.dont_write_bytecode=True
03: from about import *
04:
05: ###############################
06: class Row(Charmed):
07: "Information about decisions, objectives."
08: id = -1
09: def __init__(i,t,cells):
10: i.id = Row.id = Row.id + 1
11: i.cells, i.t = cells,t
12: i.theScore=None
13: def score(i):
14: if i.theScore == None:
15: i.theScore = fromhell(i.cells,i.t)
16: return i.theScore
17: def approx(i):
18: out = i.cells[:]
19: for h in i.t.nums:
20: out[h.pos] = approx(h.bins(),out[h.pos])
21: return out
22:
23: def fromhell(cells,t):
24: "Sum of the distance from hell on all objectives."
25: s = 0.0
26: less, more = t.less, t.more
27: for h in less:
28: x= h.norm(cells[h.pos])
29: s += (1-x)
30: for h in more:
31: x= h.norm(cells[h.pos])
32: s += x
33: return s/ (len(less)+len(more) + 1/The.math.inf)
34:
35: class Table(Charmed):
36: "Storage for what we know about Rows."
37: id = -1
38: def __init__(i,spec=[],keeping=True):
39: i.id = Table.id = Table.id+1
40: i.more, i.less, i.klass, i.nums = [] ,[], [], []
41: i.syms, i.rows, i.columns = [], [], []
42: i.dep , i.indep, i._at = [], [], {}
43: i.keeping = keeping
44: if spec:
45: i.header(spec)
46: def at(i,x): return i._at[x]
47: def centroid(i):
48: return [h.centroid() for h in i.columns]
49: def clone(i,lstOfCells=[],keeping=True):
50: t = Table(spec=i.spec(), keeping=keeping)
51: for cells in lstOfCells: t.seen(cells)
52: return t
53: def discretize(i,rnn=True):
54: def sym(x):
55: return x.translate(None,The.read.num)
56: t = Table(spec = [sym(h.name) for h in i.columns])
57: for row in i.rows:
58: t.seen(row.approx())
59: return t
60: def spec(i) : return [x.name for x in i.columns]
61: def nump(i,x) : return x in [The.read.less,
62: The.read.more,The.read.num]
63: def add(i,txt,head):
64: r = The.read
65: if txt[0] == r.more : also = i.more
66: elif txt[0] == r.less : also = i.less
67: elif txt[0] == r.klass : also = i.klass
68: elif txt[0] == r.num : also = i.nums
69: else: also = i.syms
70: i.columns += [head]
71: head.pos = i._at[txt] = len(i.columns) -1
72: txt1 = ''.join([y.strip(The.read.chars)
73: for y in txt])
74: i._at[txt1] = head.pos
75: also += [head]
76: i.indep = i.nums + i.syms
77: i.dep = i.more + i.less + i.klass
78: def has(i,*things):
79: for thing in things: i.add(thing.name,thing)
80: def header(i,spec): # e.g. Num(name=fred,min=
81: for m,txt in enumerate(spec):
82: head = Num if i.nump(txt[0]) else Sym
83: i.add(txt, head(name=txt))
84: def __repr__(i):
85: return 'Table(%g,%g)' % (i.id,len(i.rows))
86: def seen(i,cells):
87: row = [None] * len(i.columns)
88: for head in i.columns:
89: cell = cells[head.pos]
90: if cell != The.read.ignore:
91: cell = head.seen(cell)
92: row[head.pos] = cell
93: if i.keeping:
94: i.rows += [Row(cells=row,t=i)]
95:
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.