Source code for sup3r.writers.h5
"""Output handling
TODO: Remove redundant code re. Cachers
"""
import logging
import numpy as np
import pandas as pd
from .base import OutputHandler
logger = logging.getLogger(__name__)
[docs]
class OutputHandlerH5(OutputHandler):
"""Class to handle writing output to H5 file"""
@classmethod
def _write_output(
cls,
data,
features,
lat_lon,
times,
out_file,
meta_data=None,
invert_uv=False,
nn_fill=False,
max_workers=None,
gids=None,
):
"""Write forward pass output to H5 file
Parameters
----------
data : ndarray
(spatial_1, spatial_2, temporal, features)
High resolution forward pass output
features : list
List of feature names corresponding to the last dimension of data
lat_lon : ndarray
Array of high res lat/lon for output data.
(spatial_1, spatial_2, 2)
Last dimension has ordering (lat, lon)
times : pd.Datetimeindex
List of times for high res output data
out_file : string
Output file path
meta_data : dict | None
Dictionary of meta data from model
invert_uv : bool
Whether to convert u and v wind components to windspeed and
direction
nn_fill : bool
Whether to fill data outside of limits with nearest
neighbour or cap to limits
max_workers : int | None
Max workers to use for inverse transform.
gids : list
List of coordinate indices used to label each lat lon pair and to
help with spatial chunk data collection
"""
msg = (
f'Output data shape ({data.shape}) and lat_lon shape '
f'({lat_lon.shape}) conflict.'
)
assert data.shape[:2] == lat_lon.shape[:-1], msg
msg = (
f'Output data shape ({data.shape}) and times shape '
f'({len(times)}) conflict.'
)
assert data.shape[-2] == len(times), msg
data, features = cls._transform_output(
data.copy(),
features,
lat_lon,
max_workers=max_workers,
invert_uv=invert_uv,
nn_fill=nn_fill,
)
gids = (
gids
if gids is not None
else np.arange(np.prod(lat_lon.shape[:-1]))
)
meta = pd.DataFrame({
'gid': gids.flatten(),
'latitude': lat_lon[..., 0].flatten(),
'longitude': lat_lon[..., 1].flatten(),
})
data_list = []
for i, _ in enumerate(features):
flat_data = data[..., i].reshape((-1, len(times)))
flat_data = np.transpose(flat_data, (1, 0))
data_list.append(flat_data)
cls.write_data(out_file, features, times, data_list, meta, meta_data)