annotate numerics/data.py @ 23:87615a38190c

more stubbing
author Jeff Hammel <k0scist@gmail.com>
date Fri, 03 Oct 2014 17:59:28 -0700
parents 61ef3985ec5b
children 36e47061187f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
19
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
1 # -*- coding: utf-8 -*-
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
2
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
3 """
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
4 data models
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
5 """
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
6
21
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
7 from collections import OrderedDict
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
8
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
9 __all__ = ['Rows', 'Columns']
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
10
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
11
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
12 class ColumnNumberException(Exception):
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
13 """
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
14 wrong number of columns: {given} given; {expected} expected
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
15 """
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
16 def __init__(self, given, expected):
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
17 self.given = given
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
18 self.expected = expected
23
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
19 Exception.__init__(self.__doc__.format(**self.__dict__).strip())
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
20
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
21
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
22 class ColumnLengthException(ColumnNumberException):
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
23 """
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
24 wrong length of column: {given} given; {expected} expected
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
25 """
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
26 # XXX should share ABC, not inherit from ColumnNumberException
21
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
27
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
28
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
29 class Rows(object):
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
30 """
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
31 row-based data
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
32 """
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
33
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
34 array = OrderedDict
19
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
35
21
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
36 def __init__(self, columns, *rows):
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
37 """
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
38 columns -- column labels
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
39 """
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
40 self.column_names = columns
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
41 self.rows = []
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
42
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
43 for row in rows:
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
44 self += row
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
45
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
46 def __iadd__(self, row):
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
47 """add a labeled row"""
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
48 if len(row) != len(self.columns_names):
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
49 raise ColumnNumberException(len(row), len(self.columns_names))
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
50 self.rows.append(self.array(zip(self.columns_names, row)))
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
51
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
52 def __len__(self):
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
53 return len(self.rows)
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
54
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
55 def __getitem__(self, item):
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
56 return self.rows[item]
22
61ef3985ec5b stub columns; do we need it
Jeff Hammel <k0scist@gmail.com>
parents: 21
diff changeset
57
61ef3985ec5b stub columns; do we need it
Jeff Hammel <k0scist@gmail.com>
parents: 21
diff changeset
58
61ef3985ec5b stub columns; do we need it
Jeff Hammel <k0scist@gmail.com>
parents: 21
diff changeset
59 class Columns(object):
61ef3985ec5b stub columns; do we need it
Jeff Hammel <k0scist@gmail.com>
parents: 21
diff changeset
60 """
61ef3985ec5b stub columns; do we need it
Jeff Hammel <k0scist@gmail.com>
parents: 21
diff changeset
61 column-oriented data
61ef3985ec5b stub columns; do we need it
Jeff Hammel <k0scist@gmail.com>
parents: 21
diff changeset
62 """
61ef3985ec5b stub columns; do we need it
Jeff Hammel <k0scist@gmail.com>
parents: 21
diff changeset
63
61ef3985ec5b stub columns; do we need it
Jeff Hammel <k0scist@gmail.com>
parents: 21
diff changeset
64 def __init__(self, *columns):
61ef3985ec5b stub columns; do we need it
Jeff Hammel <k0scist@gmail.com>
parents: 21
diff changeset
65 self.columns = OrderedDict() # this should be ordered
23
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
66 for name, values in columns:
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
67 self += (name, values)
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
68
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
69 def __iadd__(self, item):
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
70 column_name, values = item
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
71 assert column_name not in self.columns
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
72
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
73 return self