PandasDataframeHandler   A
last analyzed

Complexity

Total Complexity 3

Size/Duplication

Total Lines 11
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
dl 0
loc 11
rs 10
c 0
b 0
f 0
wmc 3

2 Methods

Rating   Name   Duplication   Size   Complexity  
A restore() 0 4 1
A flatten() 0 5 2
1
#!/usr/bin/env python
2
# coding=utf-8
3
from __future__ import division, print_function, unicode_literals
4
import jsonpickle as json
5
from jsonpickle.handlers import BaseHandler
6
import json as _json
7
8
from sacred import optional as opt
9
10
__all__ = ('flatten', 'restore')
11
12
13
# class DatetimeHandler(BaseHandler):
14
#     def restore(self, obj):
15
#        return datetime.datetime.strptime(obj['date'], "%Y-%m-%dT%H:%M:%S.%f")
16
#
17
#     def flatten(self, obj, data):
18
#         data['date'] = obj.isoformat()
19
#         return data
20
#
21
# DatetimeHandler.handles(datetime.datetime)
22
23
if opt.has_numpy:
24
    np = opt.np
25
26
    class NumpyArrayHandler(BaseHandler):
27
        def flatten(self, obj, data):
28
            data['values'] = obj.tolist()
29
            data['dtype'] = str(obj.dtype)
30
            return data
31
32
        def restore(self, obj):
33
            return opt.np.array(obj["values"], dtype=obj["dtype"])
34
35
    class NumpyGenericHandler(BaseHandler):
36
        def flatten(self, obj, data):
37
            return np.asscalar(obj)
38
39
        def restore(self, obj):
40
            return obj
41
42
    NumpyArrayHandler.handles(np.ndarray)
43
    for t in [np.bool_, np.int_, np.float_, np.intc, np.intp, np.int8,
44
              np.int16, np.int32, np.int64, np.uint8, np.uint16, np.uint32,
45
              np.uint64, np.float16, np.float32, np.float64]:
46
        NumpyGenericHandler.handles(t)
47
48
49
if opt.has_pandas:
50
    import pandas as pd
51
52
    class PandasDataframeHandler(BaseHandler):
53
        def flatten(self, obj, data):
54
            # TODO: this is slow
55
            data['values'] = json.loads(obj.to_json())
56
            data['dtypes'] = {k: str(v) for k, v in dict(obj.dtypes).items()}
57
            return data
58
59
        def restore(self, obj):
60
            # TODO: get rid of unnecessary json.dumps
61
            return pd.read_json(json.dumps(obj['values']),
62
                                dtype=obj['dtypes'])
63
64
    PandasDataframeHandler.handles(pd.DataFrame)
65
66
json.set_encoder_options('simplejson', sort_keys=True, indent=4)
67
json.set_encoder_options('demjson', compactly=False)
68
69
70
def flatten(obj):
71
    return _json.loads(json.encode(obj, keys=True))
72
73
74
def restore(flat):
75
    return json.decode(_json.dumps(flat), keys=True)
76