annotate numerics/data.py @ 150:8a1fe454c98a

STUB
author Jeff Hammel <k0scist@gmail.com>
date Mon, 13 Apr 2015 10:17:47 -0700
parents e7e49b46832b
children
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
51
e7e49b46832b make this function semi-meaningful
Jeff Hammel <k0scist@gmail.com>
parents: 50
diff changeset
9 __all__ = ['ColumnNumberException',
e7e49b46832b make this function semi-meaningful
Jeff Hammel <k0scist@gmail.com>
parents: 50
diff changeset
10 'ColumnLengthException',
e7e49b46832b make this function semi-meaningful
Jeff Hammel <k0scist@gmail.com>
parents: 50
diff changeset
11 'transpose',
e7e49b46832b make this function semi-meaningful
Jeff Hammel <k0scist@gmail.com>
parents: 50
diff changeset
12 'Rows',
e7e49b46832b make this function semi-meaningful
Jeff Hammel <k0scist@gmail.com>
parents: 50
diff changeset
13 'Columns']
21
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
14
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 class ColumnNumberException(Exception):
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
17 """
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
18 wrong number of columns: {given} given; {expected} expected
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
19 """
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
20 def __init__(self, given, expected):
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
21 self.given = given
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
22 self.expected = expected
23
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
23 Exception.__init__(self.__doc__.format(**self.__dict__).strip())
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
24
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
25
48
36e47061187f stub a transposition function
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
26 def transpose(array):
36e47061187f stub a transposition function
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
27 """makes rows into columns or vice versa"""
36e47061187f stub a transposition function
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
28
36e47061187f stub a transposition function
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
29 if not array:
36e47061187f stub a transposition function
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
30 return array # nothing to do
36e47061187f stub a transposition function
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
31
51
e7e49b46832b make this function semi-meaningful
Jeff Hammel <k0scist@gmail.com>
parents: 50
diff changeset
32 n_cols = set([len(row) for row in array])
e7e49b46832b make this function semi-meaningful
Jeff Hammel <k0scist@gmail.com>
parents: 50
diff changeset
33 if len(n_cols) != 1:
e7e49b46832b make this function semi-meaningful
Jeff Hammel <k0scist@gmail.com>
parents: 50
diff changeset
34 raise Exception("Differing number of columns found: {}".format(', '.join(sorted(n_cols))))
e7e49b46832b make this function semi-meaningful
Jeff Hammel <k0scist@gmail.com>
parents: 50
diff changeset
35
50
e39643d18d82 note to self
Jeff Hammel <k0scist@gmail.com>
parents: 49
diff changeset
36 return zip(*array)
51
e7e49b46832b make this function semi-meaningful
Jeff Hammel <k0scist@gmail.com>
parents: 50
diff changeset
37
48
36e47061187f stub a transposition function
Jeff Hammel <k0scist@gmail.com>
parents: 23
diff changeset
38
23
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
39 class ColumnLengthException(ColumnNumberException):
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
40 """
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
41 wrong length of column: {given} given; {expected} expected
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
42 """
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
43 # XXX should share ABC, not inherit from ColumnNumberException
21
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
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
46 class Rows(object):
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 row-based data
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
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
51 array = OrderedDict
19
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
52
21
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
53 def __init__(self, columns, *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 columns -- column labels
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 self.column_names = columns
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
58 self.rows = []
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
59
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
60 for row in rows:
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
61 self += 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 __iadd__(self, row):
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
64 """add a labeled row"""
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
65 if len(row) != len(self.columns_names):
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
66 raise ColumnNumberException(len(row), len(self.columns_names))
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
67 self.rows.append(self.array(zip(self.columns_names, row)))
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
68
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
69 def __len__(self):
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
70 return len(self.rows)
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
71
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
72 def __getitem__(self, item):
fef3f407113f spec rows
Jeff Hammel <k0scist@gmail.com>
parents: 19
diff changeset
73 return self.rows[item]
22
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
61ef3985ec5b stub columns; do we need it
Jeff Hammel <k0scist@gmail.com>
parents: 21
diff changeset
76 class Columns(object):
61ef3985ec5b stub columns; do we need it
Jeff Hammel <k0scist@gmail.com>
parents: 21
diff changeset
77 """
61ef3985ec5b stub columns; do we need it
Jeff Hammel <k0scist@gmail.com>
parents: 21
diff changeset
78 column-oriented data
61ef3985ec5b stub columns; do we need it
Jeff Hammel <k0scist@gmail.com>
parents: 21
diff changeset
79 """
61ef3985ec5b stub columns; do we need it
Jeff Hammel <k0scist@gmail.com>
parents: 21
diff changeset
80
61ef3985ec5b stub columns; do we need it
Jeff Hammel <k0scist@gmail.com>
parents: 21
diff changeset
81 def __init__(self, *columns):
61ef3985ec5b stub columns; do we need it
Jeff Hammel <k0scist@gmail.com>
parents: 21
diff changeset
82 self.columns = OrderedDict() # this should be ordered
23
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
83 for name, values in columns:
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
84 self += (name, values)
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
85
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
86 def __iadd__(self, item):
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
87 column_name, values = item
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
88 assert column_name not in self.columns
87615a38190c more stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 22
diff changeset
89 return self