annotate numerics/convert.py @ 85:411420ddaa46

wip
author Jeff Hammel <k0scist@gmail.com>
date Sun, 01 Mar 2015 16:59:08 -0800
parents 202ab51601b4
children 19a5c2fb52bb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27
f865bc916593 stub for type inference
Jeff Hammel <k0scist@gmail.com>
parents: 6
diff changeset
1 #!/usr/bin/env python
f865bc916593 stub for type inference
Jeff Hammel <k0scist@gmail.com>
parents: 6
diff changeset
2
f865bc916593 stub for type inference
Jeff Hammel <k0scist@gmail.com>
parents: 6
diff changeset
3 """
f865bc916593 stub for type inference
Jeff Hammel <k0scist@gmail.com>
parents: 6
diff changeset
4 convert between types
f865bc916593 stub for type inference
Jeff Hammel <k0scist@gmail.com>
parents: 6
diff changeset
5 """
f865bc916593 stub for type inference
Jeff Hammel <k0scist@gmail.com>
parents: 6
diff changeset
6
55
ecaf1d4b1c2c this should work now; it doesnt, but it should
Jeff Hammel <k0scist@gmail.com>
parents: 52
diff changeset
7 # imports
31
a655306ee78d stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 27
diff changeset
8 import argparse
55
ecaf1d4b1c2c this should work now; it doesnt, but it should
Jeff Hammel <k0scist@gmail.com>
parents: 52
diff changeset
9 import csv
27
f865bc916593 stub for type inference
Jeff Hammel <k0scist@gmail.com>
parents: 6
diff changeset
10 import sys
52
37838ae694d2 import a thing
Jeff Hammel <k0scist@gmail.com>
parents: 47
diff changeset
11 from .data import transpose
47
6d34c02f7c9c inherit from the right thing
Jeff Hammel <k0scist@gmail.com>
parents: 46
diff changeset
12 from .read import read_csv, CSVParser
27
f865bc916593 stub for type inference
Jeff Hammel <k0scist@gmail.com>
parents: 6
diff changeset
13
81
Jeff Hammel <k0scist@gmail.com>
parents: 60
diff changeset
14 __all__ = ['cast',
Jeff Hammel <k0scist@gmail.com>
parents: 60
diff changeset
15 'float_or_orig',
Jeff Hammel <k0scist@gmail.com>
parents: 60
diff changeset
16 'main']
33
f35b646eefa9 moar stubbin
Jeff Hammel <k0scist@gmail.com>
parents: 32
diff changeset
17
45
ef915968d104 put this in the parser so that i can use this in convert
Jeff Hammel <k0scist@gmail.com>
parents: 34
diff changeset
18 default_cast = (int, float, str)
6
Jeff Hammel <k0scist@gmail.com>
parents: 5
diff changeset
19
5
d5447d401c44 serializaion; pandas probably does this
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
20 def cast(to_type, *values):
81
Jeff Hammel <k0scist@gmail.com>
parents: 60
diff changeset
21 """
Jeff Hammel <k0scist@gmail.com>
parents: 60
diff changeset
22 gently cast a thing to a thing;
Jeff Hammel <k0scist@gmail.com>
parents: 60
diff changeset
23 if you can't, return the original value
Jeff Hammel <k0scist@gmail.com>
parents: 60
diff changeset
24 """
Jeff Hammel <k0scist@gmail.com>
parents: 60
diff changeset
25
33
f35b646eefa9 moar stubbin
Jeff Hammel <k0scist@gmail.com>
parents: 32
diff changeset
26
5
d5447d401c44 serializaion; pandas probably does this
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
27 retval = []
d5447d401c44 serializaion; pandas probably does this
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
28 for value in values:
d5447d401c44 serializaion; pandas probably does this
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
29 try:
d5447d401c44 serializaion; pandas probably does this
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
30 retval.append(to_type(value))
d5447d401c44 serializaion; pandas probably does this
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
31 except ValueError:
d5447d401c44 serializaion; pandas probably does this
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
32 retval.append(value)
d5447d401c44 serializaion; pandas probably does this
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
33 return retval
d5447d401c44 serializaion; pandas probably does this
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
34
81
Jeff Hammel <k0scist@gmail.com>
parents: 60
diff changeset
35 def cast_or_discard(to_type, *values):
Jeff Hammel <k0scist@gmail.com>
parents: 60
diff changeset
36 """
Jeff Hammel <k0scist@gmail.com>
parents: 60
diff changeset
37 cast to `to_type` if possible;
Jeff Hammel <k0scist@gmail.com>
parents: 60
diff changeset
38 otherwise just throw away
Jeff Hammel <k0scist@gmail.com>
parents: 60
diff changeset
39 """
Jeff Hammel <k0scist@gmail.com>
parents: 60
diff changeset
40 raise NotImplementedError('TODO') # -> record TODO items
33
f35b646eefa9 moar stubbin
Jeff Hammel <k0scist@gmail.com>
parents: 32
diff changeset
41
5
d5447d401c44 serializaion; pandas probably does this
Jeff Hammel <k0scist@gmail.com>
parents:
diff changeset
42 def float_or_orig(*values):
81
Jeff Hammel <k0scist@gmail.com>
parents: 60
diff changeset
43 return cast(float, *values)
33
f35b646eefa9 moar stubbin
Jeff Hammel <k0scist@gmail.com>
parents: 32
diff changeset
44
f35b646eefa9 moar stubbin
Jeff Hammel <k0scist@gmail.com>
parents: 32
diff changeset
45
34
Jeff Hammel <k0scist@gmail.com>
parents: 33
diff changeset
46 def column_type(values, types=default_cast):
Jeff Hammel <k0scist@gmail.com>
parents: 33
diff changeset
47 """determine the type of a column"""
55
ecaf1d4b1c2c this should work now; it doesnt, but it should
Jeff Hammel <k0scist@gmail.com>
parents: 52
diff changeset
48 for t in types:
ecaf1d4b1c2c this should work now; it doesnt, but it should
Jeff Hammel <k0scist@gmail.com>
parents: 52
diff changeset
49 for value in values:
ecaf1d4b1c2c this should work now; it doesnt, but it should
Jeff Hammel <k0scist@gmail.com>
parents: 52
diff changeset
50 try:
ecaf1d4b1c2c this should work now; it doesnt, but it should
Jeff Hammel <k0scist@gmail.com>
parents: 52
diff changeset
51 t(value)
56
06e487f90e05 this now works
Jeff Hammel <k0scist@gmail.com>
parents: 55
diff changeset
52 except ValueError, TypeError:
55
ecaf1d4b1c2c this should work now; it doesnt, but it should
Jeff Hammel <k0scist@gmail.com>
parents: 52
diff changeset
53 break
ecaf1d4b1c2c this should work now; it doesnt, but it should
Jeff Hammel <k0scist@gmail.com>
parents: 52
diff changeset
54 else:
ecaf1d4b1c2c this should work now; it doesnt, but it should
Jeff Hammel <k0scist@gmail.com>
parents: 52
diff changeset
55 return t
ecaf1d4b1c2c this should work now; it doesnt, but it should
Jeff Hammel <k0scist@gmail.com>
parents: 52
diff changeset
56
34
Jeff Hammel <k0scist@gmail.com>
parents: 33
diff changeset
57 raise NotImplementedError('TODO') # -> record TODO items
Jeff Hammel <k0scist@gmail.com>
parents: 33
diff changeset
58
59
3781174542bb note to self
Jeff Hammel <k0scist@gmail.com>
parents: 58
diff changeset
59 def cast_columns(columns, types=default_cast):
33
f35b646eefa9 moar stubbin
Jeff Hammel <k0scist@gmail.com>
parents: 32
diff changeset
60 """
f35b646eefa9 moar stubbin
Jeff Hammel <k0scist@gmail.com>
parents: 32
diff changeset
61 cast a column of data
f35b646eefa9 moar stubbin
Jeff Hammel <k0scist@gmail.com>
parents: 32
diff changeset
62 """
59
3781174542bb note to self
Jeff Hammel <k0scist@gmail.com>
parents: 58
diff changeset
63 column_types = [column_type(column) for column in columns]
60
e3c3ee7b5ccf stubbing manipulate data
Jeff Hammel <k0scist@gmail.com>
parents: 59
diff changeset
64 return [[column_type(row) for row in column]
e3c3ee7b5ccf stubbing manipulate data
Jeff Hammel <k0scist@gmail.com>
parents: 59
diff changeset
65 for column_type, column in zip(column_types, columns)]
27
f865bc916593 stub for type inference
Jeff Hammel <k0scist@gmail.com>
parents: 6
diff changeset
66
59
3781174542bb note to self
Jeff Hammel <k0scist@gmail.com>
parents: 58
diff changeset
67
27
f865bc916593 stub for type inference
Jeff Hammel <k0scist@gmail.com>
parents: 6
diff changeset
68 def main(args=sys.argv[1:]):
f865bc916593 stub for type inference
Jeff Hammel <k0scist@gmail.com>
parents: 6
diff changeset
69 """CLI"""
f865bc916593 stub for type inference
Jeff Hammel <k0scist@gmail.com>
parents: 6
diff changeset
70
31
a655306ee78d stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 27
diff changeset
71 # parse command line
47
6d34c02f7c9c inherit from the right thing
Jeff Hammel <k0scist@gmail.com>
parents: 46
diff changeset
72 parser = CSVParser(description="interpolate types from file")
31
a655306ee78d stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 27
diff changeset
73 options = parser.parse_args(args)
a655306ee78d stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 27
diff changeset
74
32
Jeff Hammel <k0scist@gmail.com>
parents: 31
diff changeset
75 # read CSV file
46
93850093eafd stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 45
diff changeset
76 data = parser.read()
93850093eafd stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 45
diff changeset
77
55
ecaf1d4b1c2c this should work now; it doesnt, but it should
Jeff Hammel <k0scist@gmail.com>
parents: 52
diff changeset
78 # transpose
ecaf1d4b1c2c this should work now; it doesnt, but it should
Jeff Hammel <k0scist@gmail.com>
parents: 52
diff changeset
79 columns = transpose(data)
ecaf1d4b1c2c this should work now; it doesnt, but it should
Jeff Hammel <k0scist@gmail.com>
parents: 52
diff changeset
80
ecaf1d4b1c2c this should work now; it doesnt, but it should
Jeff Hammel <k0scist@gmail.com>
parents: 52
diff changeset
81 # get types
ecaf1d4b1c2c this should work now; it doesnt, but it should
Jeff Hammel <k0scist@gmail.com>
parents: 52
diff changeset
82 types = [column_type(column) for column in columns]
46
93850093eafd stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 45
diff changeset
83
93850093eafd stubbing
Jeff Hammel <k0scist@gmail.com>
parents: 45
diff changeset
84 # print type information
55
ecaf1d4b1c2c this should work now; it doesnt, but it should
Jeff Hammel <k0scist@gmail.com>
parents: 52
diff changeset
85 writer = csv.writer(sys.stdout)
56
06e487f90e05 this now works
Jeff Hammel <k0scist@gmail.com>
parents: 55
diff changeset
86 writer.writerow([t.__name__ for t in types])
55
ecaf1d4b1c2c this should work now; it doesnt, but it should
Jeff Hammel <k0scist@gmail.com>
parents: 52
diff changeset
87
32
Jeff Hammel <k0scist@gmail.com>
parents: 31
diff changeset
88
27
f865bc916593 stub for type inference
Jeff Hammel <k0scist@gmail.com>
parents: 6
diff changeset
89 if __name__ == '__main__':
f865bc916593 stub for type inference
Jeff Hammel <k0scist@gmail.com>
parents: 6
diff changeset
90 main()