Mercurial > hg > numerics
annotate numerics/data.py @ 172:dc0a620a0368
add another example
author | Jeff Hammel <k0scist@gmail.com> |
---|---|
date | Fri, 03 Jul 2015 11:11:01 -0700 |
parents | e7e49b46832b |
children |
rev | line source |
---|---|
19 | 1 # -*- coding: utf-8 -*- |
2 | |
3 """ | |
4 data models | |
5 """ | |
6 | |
21 | 7 from collections import OrderedDict |
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 | 14 |
15 | |
16 class ColumnNumberException(Exception): | |
17 """ | |
18 wrong number of columns: {given} given; {expected} expected | |
19 """ | |
20 def __init__(self, given, expected): | |
21 self.given = given | |
22 self.expected = expected | |
23 | 23 Exception.__init__(self.__doc__.format(**self.__dict__).strip()) |
24 | |
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 | 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 | 39 class ColumnLengthException(ColumnNumberException): |
40 """ | |
41 wrong length of column: {given} given; {expected} expected | |
42 """ | |
43 # XXX should share ABC, not inherit from ColumnNumberException | |
21 | 44 |
45 | |
46 class Rows(object): | |
47 """ | |
48 row-based data | |
49 """ | |
50 | |
51 array = OrderedDict | |
19 | 52 |
21 | 53 def __init__(self, columns, *rows): |
54 """ | |
55 columns -- column labels | |
56 """ | |
57 self.column_names = columns | |
58 self.rows = [] | |
59 | |
60 for row in rows: | |
61 self += row | |
62 | |
63 def __iadd__(self, row): | |
64 """add a labeled row""" | |
65 if len(row) != len(self.columns_names): | |
66 raise ColumnNumberException(len(row), len(self.columns_names)) | |
67 self.rows.append(self.array(zip(self.columns_names, row))) | |
68 | |
69 def __len__(self): | |
70 return len(self.rows) | |
71 | |
72 def __getitem__(self, item): | |
73 return self.rows[item] | |
22 | 74 |
75 | |
76 class Columns(object): | |
77 """ | |
78 column-oriented data | |
79 """ | |
80 | |
81 def __init__(self, *columns): | |
82 self.columns = OrderedDict() # this should be ordered | |
23 | 83 for name, values in columns: |
84 self += (name, values) | |
85 | |
86 def __iadd__(self, item): | |
87 column_name, values = item | |
88 assert column_name not in self.columns | |
89 return self |