# -*- coding: utf-8 -*-
"""
Functions for saving and loading PLS data objects
"""
import h5py
import numpy as np
from .structures import PLSResults
[docs]def save_results(fname, results):
"""
Saves PLS `results` to hdf5 file `fname`
If `fname` does not end with '.hdf5' it will be appended
Parameters
----------
fname : str
Filepath to where hdf5 file should be created and `results` stored
results : :obj:`pyls.structures.PLSResults`
PLSResults object to be saved
Returns
-------
fname : str
Filepath to created file
"""
def _recursive_save(h5file, obj, group='/results'):
"""
Recursively saves `obj` to `h5file` in `group`
Parameters
----------
h5file : :obj:`h5py.File`
obj : dict
group : str, optional
Group in `h5file` in which to create datasets
"""
grp = h5file.create_group(group)
for key, item in obj.items():
if isinstance(item, dict):
_recursive_save(h5file, item, group=group + '/' + key)
elif isinstance(item, np.ndarray):
grp.create_dataset(key, item.shape, item.dtype)[...] = item
else:
if item is not None:
grp.attrs[key] = item
else:
grp.attrs[key] = 'None'
if not isinstance(fname, str):
fname = str(fname)
if not fname.endswith('.hdf5'):
fname += '.hdf5'
with h5py.File(fname, 'w') as h5:
_recursive_save(h5, results, group='/results')
return fname
[docs]def load_results(fname):
"""
Load PLS results stored in `fname`, generated by `pyls.save_results()`
Parameters
----------
fname : str
Filepath to HDF5 file containing PLS results
Returns
-------
results : :obj:`pyls.structures.PLSResults`
Loaded PLS results
"""
def _recursive_load(h5file, group='/results'):
"""
Recursively loads data from `h5file`
Parameters
----------
h5file : :obj:`h5py.File`
group : str, optional
Group in `h5file` from which to load datasets
Returns
-------
results : dict
Dictionary containing loaded data
"""
results = dict()
for key, item in h5file[group].items():
if isinstance(item, h5py.Dataset):
results[key] = item[()]
elif isinstance(item, h5py.Group):
results[key] = _recursive_load(h5file, group=group + '/' + key)
for key, value in h5file[group].attrs.items():
if isinstance(value, str) and value == 'None':
value = None
results[key] = value
return results
if not isinstance(fname, str):
fname = str(fname)
if not fname.endswith('.hdf5'):
fname += '.hdf5'
if not h5py.is_hdf5(fname):
raise TypeError('Provided file {} is not valid HDF5 format.'
.format(fname))
with h5py.File(fname, 'r') as h5file:
return PLSResults(**_recursive_load(h5file, '/results'))