annotate numerics/data.py @ 50:e39643d18d82

note to self
author Jeff Hammel <k0scist@gmail.com>
date Mon, 19 Jan 2015 12:45:06 -0800
parents 5caa67643162
children e7e49b46832b
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
48
36e47061187f stub a transposition function
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
9 __all__ = ['ColumnNumberException', 'ColumnLengthException', 'Rows', 'Columns']
21
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
48
36e47061187f stub a transposition function
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
22 def transpose(array):
36e47061187f stub a transposition function
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
23 """makes rows into columns or vice versa"""
36e47061187f stub a transposition function
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
24
36e47061187f stub a transposition function
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
25 if not array:
36e47061187f stub a transposition function
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
26 return array # nothing to do
36e47061187f stub a transposition function
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
27
36e47061187f stub a transposition function
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
28 n_cols = len(array[0])
49
5caa67643162 fuck you, Ovwrt
Jeff Hammel <k0scist@gmail.com>
parents: 48
diff changeset
29 retval = [[]] * n_cols
50
e39643d18d82 note to self
Jeff Hammel <k0scist@gmail.com>
parents: 49
diff changeset
30 return zip(*array)
e39643d18d82 note to self
Jeff Hammel <k0scist@gmail.com>
parents: 49
diff changeset
31 # XXX this is a nothing function; we shouldn't use this
48
36e47061187f stub a transposition function
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
32
23
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
33 class ColumnLengthException(ColumnNumberException):
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
34 """
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
35 wrong length of column: {given} given; {expected} expected
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
36 """
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
37 # XXX should share ABC, not inherit from ColumnNumberException
21
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
38
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 class Rows(object):
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
41 """
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
42 row-based data
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
43 """
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
44
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
45 array = OrderedDict
19
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
46
21
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
47 def __init__(self, columns, *rows):
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
48 """
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
49 columns -- column labels
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
50 """
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
51 self.column_names = columns
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
52 self.rows = []
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
53
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
54 for row in rows:
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
55 self += row
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
56
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
57 def __iadd__(self, row):
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
58 """add a labeled row"""
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
59 if len(row) != len(self.columns_names):
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
60 raise ColumnNumberException(len(row), len(self.columns_names))
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
61 self.rows.append(self.array(zip(self.columns_names, row)))
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
62
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
63 def __len__(self):
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
64 return len(self.rows)
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
65
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
66 def __getitem__(self, item):
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
67 return self.rows[item]
22
61ef3985ec5b stub columns; do we need it
Jeff Hammel <k0scist@gmail.com>
parents: 21
diff changeset
68
61ef3985ec5b stub columns; do we need it
Jeff Hammel <k0scist@gmail.com>
parents: 21
diff changeset
69
61ef3985ec5b stub columns; do we need it
Jeff Hammel <k0scist@gmail.com>
parents: 21
diff changeset
70 class Columns(object):
61ef3985ec5b stub columns; do we need it
Jeff Hammel <k0scist@gmail.com>
parents: 21
diff changeset
71 """
61ef3985ec5b stub columns; do we need it
Jeff Hammel <k0scist@gmail.com>
parents: 21
diff changeset
72 column-oriented data
61ef3985ec5b stub columns; do we need it
Jeff Hammel <k0scist@gmail.com>
parents: 21
diff changeset
73 """
61ef3985ec5b stub columns; do we need it
Jeff Hammel <k0scist@gmail.com>
parents: 21
diff changeset
74
61ef3985ec5b stub columns; do we need it
Jeff Hammel <k0scist@gmail.com>
parents: 21
diff changeset
75 def __init__(self, *columns):
61ef3985ec5b stub columns; do we need it
Jeff Hammel <k0scist@gmail.com>
parents: 21
diff changeset
76 self.columns = OrderedDict() # this should be ordered
23
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
77 for name, values in columns:
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
78 self += (name, values)
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
79
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
80 def __iadd__(self, item):
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
81 column_name, values = item
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
82 assert column_name not in self.columns
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
83 return self