Source code for pyls.io

# -*- 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'))