annotate numerics/data.py @ 48:36e47061187f

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