Toggle Light / Dark / Auto color theme
Toggle table of contents sidebar
Source code for sdhdf.tables
from __future__ import annotations
[docs]
__author__ = [ "Danny Price" , "Alec Thomson" , "Lawrence Toomey" ]
# Ignore astropy warnings
import warnings
import h5py
import pandas as pd
warnings . filterwarnings ( "ignore" , category = Warning , append = True )
[docs]
class SDHDFTable :
def __init__ ( self , sdhdf_dataset : h5py . Dataset , version ):
"""Read an SDHDF table
Args:
sdhdf_dataset (h5py.Dataset): SDHDF table dataset
"""
[docs]
self . attrs = dict ( sdhdf_dataset . attrs )
if float ( version ) < 4.0 :
compound_attr = False
elif "frequency" in sdhdf_dataset . name :
compound_attr = True
else :
compound_attr = False
if compound_attr :
self . table = self . _decode_compound_attr ( sdhdf_dataset )
elif "_data" in sdhdf_dataset . name :
self . table = pd . DataFrame (( self . attrs . keys (), self . attrs . values ()))
else :
self . table = self . _decode_df ( pd . DataFrame ( sdhdf_dataset [:]))
[docs]
def __repr__ ( self ):
return self . table . __repr__ ()
[docs]
def __str__ ( self ):
return self . table . __str__ ()
[docs]
def _repr_html_ ( self ):
return self . table . _repr_html_ ()
[docs]
def __getitem__ ( self , key ):
return self . table . __getitem__ ( key )
[docs]
def __setitem__ ( self , key , value ):
return self . table . __setitem__ ( key , value )
[docs]
def __len__ ( self ):
return self . table . __len__ ()
[docs]
def __iter__ ( self ):
return self . table . __iter__ ()
[docs]
def __contains__ ( self , key ):
return self . table . __contains__ ( key )
@staticmethod
[docs]
def _decode_df ( df : pd . DataFrame ) -> pd . DataFrame :
"""Decode a pandas dataframe to a string"""
str_df = df . select_dtypes ([ object ])
str_df = str_df . stack () . str . decode ( "utf-8" ) . unstack () # noqa: PD010, PD013
for col in str_df :
df [ col ] = str_df [ col ]
return df
@staticmethod
[docs]
def _decode_compound_attr ( dset_obj ):
"""Decode compound attributes"""
keys = dset_obj . attrs . keys ()
key_list = []
val_list = []
for key in keys :
attr = dset_obj . attrs [ key ]
if len ( dset_obj [:]) == 1 and "frequency" not in dset_obj . name :
if key in ( "SDHDF_CLASS" , "SDHDF_DESCRIPTION" ):
value = attr [ 0 ][ 2 ] . decode ()
elif key in dset_obj . dtype . fields :
value = dset_obj [ key ][ 0 ]
else :
value = attr [ 0 ][ 2 ] . decode ()
elif len ( dset_obj [:] . dtype ) == 0 :
if key not in dset_obj [:]:
if key in ( "DIMENSION_LABELS" , "REFERENCE_LIST" , "DIMENSION_LIST" ):
value = attr
elif key == "CLASS" :
value = attr . decode ()
else :
value = attr [ 0 ][ 2 ] . decode ()
elif key in dset_obj . dtype . fields :
value = dset_obj [ key ][ 0 ]
else :
value = attr [ 0 ][ 2 ] . decode ()
key_list . append ( key )
val_list . append ( value )
return pd . DataFrame ([ val_list ], columns = [ key_list ])