sah.normalize
Description
This module contains functions to normalize data and other variables.
Index
height() |
Normalize a spectra by height |
area() |
Normalize a spectra by the area under the datasets |
unit_str() |
Normalize a unit string from user input |
1""" 2# Description 3 4This module contains functions to normalize data and other variables. 5 6 7# Index 8 9| | | 10| --- | --- | 11| `height()` | Normalize a `spectra` by height | 12| `area()` | Normalize a `spectra` by the area under the datasets | 13| `unit_str()` | Normalize a `unit` string from user input | 14 15--- 16""" 17 18 19import aton.alias as alias 20from .classes import * 21from .fit import * 22 23 24def height( 25 spectra:Spectra, 26 range:list=None, 27 axis:str='x', 28 df_index:int=0, 29 ) -> Spectra: 30 """Normalize a set of `spectra` by height. 31 32 By default it normalises the spectra over the entire range. 33 This can be modified by setting a specific range, 34 as in `range = [x_min, x_max]` with `axis = 'x'`. 35 It can also normalise over manual y-positions, 36 for example for peaks with different baselines. 37 This can be done by settingch `axis='y'`, and 38 `range = [[y_min_1, y_max_1], ..., [y_min_N, y_max_N]]`. 39 40 Heights are normalised with respect to the 41 reference dataframe `df_index`, the first one by default. 42 """ 43 sdata = deepcopy(spectra) 44 if axis.lower() in alias.spatial['y']: 45 return _height_y(sdata, range, df_index) 46 df0 = sdata.dfs[df_index] 47 if range: 48 if not isinstance(range, list): 49 raise ValueError("range must be a list") 50 if len(range) != 2: 51 raise ValueError(f"With axis='x', range must be [xmin, xmax]. Yours was:\n{range}") 52 range.sort() 53 xmin = range[0] 54 xmax = range[1] 55 else: 56 xmin = min(df0[df0.columns[0]]) 57 xmax = max(df0[df0.columns[0]]) 58 df0 = df0[(df0[df0.columns[0]] >= xmin) & (df0[df0.columns[0]] <= xmax)] 59 ymax_on_range = df0[df0.columns[1]].max() 60 normalized_dataframes = [] 61 for df in sdata.dfs: 62 df_range = df[(df[df.columns[0]] >= xmin) & (df[df.columns[0]] <= xmax)] 63 i_ymax_on_range = df_range[df_range.columns[1]].max() 64 df[df.columns[1]] = df[df.columns[1]] * ymax_on_range / i_ymax_on_range 65 normalized_dataframes.append(df) 66 sdata.dfs = normalized_dataframes 67 return sdata 68 69 70def _height_y( 71 sdata:Spectra, 72 range:list, 73 df_index:int=0, 74 ) -> Spectra: 75 """Private function to handle normalisation in the y-axis""" 76 if not range: 77 raise ValueError(f"A range must be specified to normalise the Y axis, as in range=[[y_min_1,y_max_1],...,[y_min_N,y_max_N]]\nYours was:\n{range}") 78 if not len(range) == len(sdata.dfs): 79 raise ValueError("len(range) must match len(Spectra.dfs) for axis='y'") 80 ymax = [] 81 ymin = [] 82 for values in range: 83 if not isinstance(values, list): 84 raise ValueError(f"The range for axis='y' must be a list of lists,\nas in range=[[y_min_1,y_max_1],...,[y_min_N,y_max_N]].\nYours was:\n{range}") 85 if len(values) != 2: 86 raise ValueError(f"2 values needed to normalise the y-axis, ymin and ymax,\nas in range=[[y_min_1,y_max_1],...,[y_min_N,y_max_N]].\nYours was:\n{range}") 87 values.sort() 88 i_ymin = values[0] 89 i_ymax = values[1] 90 ymin.append(i_ymin) 91 ymax.append(i_ymax) 92 reference_height = ymax[df_index] - ymin[df_index] 93 normalized_dataframes = [] 94 for i, df in enumerate(sdata.dfs): 95 height = ymax[i] - ymin[i] 96 df[df.columns[1]] = df[df.columns[1]] * reference_height / height 97 normalized_dataframes.append(df) 98 sdata.dfs = normalized_dataframes 99 return sdata 100 101 102def area( 103 spectra:Spectra, 104 range:list=None, 105 df_index:int=0 106 ) -> Spectra: 107 """Normalize `spectra` by the area under the datasets.""" 108 sdata = deepcopy(spectra) 109 df0 = sdata.dfs[df_index] 110 if range: 111 if len(range) != 2: 112 raise ValueError(f"The range must be a list of 2 elements, as in [xmin, xmax]. Yours was:\n{range}") 113 range.sort() 114 xmin = range[0] 115 xmax = range[1] 116 else: 117 xmin = min(df0[df0.columns[0]]) 118 xmax = max(df0[df0.columns[0]]) 119 df0 = df0[(df0[df0.columns[0]] >= xmin) & (df0[df0.columns[0]] <= xmax)] 120 area_df0, _ = area_under_peak(sdata, peak=[xmin,xmax], df_index=df_index, min_as_baseline=True) 121 normalized_dataframes = [] 122 for df_i, df in enumerate(sdata.dfs): 123 area_df, _ = area_under_peak(sdata, peak=[xmin,xmax], df_index=df_i, min_as_baseline=True) 124 scaling_factor = area_df0 / area_df 125 df[df.columns[1]] = df[df.columns[1]] * scaling_factor 126 normalized_dataframes.append(df) 127 sdata.dfs = normalized_dataframes 128 return sdata 129 130 131def unit_str(unit:str): 132 """Normalize `unit` string from user input.""" 133 for key, value in alias.units.items(): 134 if unit in value: 135 return key 136 print(f"WARNING: Unknown unit '{unit}'") 137 return unit
def
height( spectra: sah.classes.Spectra, range: list = None, axis: str = 'x', df_index: int = 0) -> sah.classes.Spectra:
25def height( 26 spectra:Spectra, 27 range:list=None, 28 axis:str='x', 29 df_index:int=0, 30 ) -> Spectra: 31 """Normalize a set of `spectra` by height. 32 33 By default it normalises the spectra over the entire range. 34 This can be modified by setting a specific range, 35 as in `range = [x_min, x_max]` with `axis = 'x'`. 36 It can also normalise over manual y-positions, 37 for example for peaks with different baselines. 38 This can be done by settingch `axis='y'`, and 39 `range = [[y_min_1, y_max_1], ..., [y_min_N, y_max_N]]`. 40 41 Heights are normalised with respect to the 42 reference dataframe `df_index`, the first one by default. 43 """ 44 sdata = deepcopy(spectra) 45 if axis.lower() in alias.spatial['y']: 46 return _height_y(sdata, range, df_index) 47 df0 = sdata.dfs[df_index] 48 if range: 49 if not isinstance(range, list): 50 raise ValueError("range must be a list") 51 if len(range) != 2: 52 raise ValueError(f"With axis='x', range must be [xmin, xmax]. Yours was:\n{range}") 53 range.sort() 54 xmin = range[0] 55 xmax = range[1] 56 else: 57 xmin = min(df0[df0.columns[0]]) 58 xmax = max(df0[df0.columns[0]]) 59 df0 = df0[(df0[df0.columns[0]] >= xmin) & (df0[df0.columns[0]] <= xmax)] 60 ymax_on_range = df0[df0.columns[1]].max() 61 normalized_dataframes = [] 62 for df in sdata.dfs: 63 df_range = df[(df[df.columns[0]] >= xmin) & (df[df.columns[0]] <= xmax)] 64 i_ymax_on_range = df_range[df_range.columns[1]].max() 65 df[df.columns[1]] = df[df.columns[1]] * ymax_on_range / i_ymax_on_range 66 normalized_dataframes.append(df) 67 sdata.dfs = normalized_dataframes 68 return sdata
Normalize a set of spectra
by height.
By default it normalises the spectra over the entire range.
This can be modified by setting a specific range,
as in range = [x_min, x_max]
with axis = 'x'
.
It can also normalise over manual y-positions,
for example for peaks with different baselines.
This can be done by settingch axis='y'
, and
range = [[y_min_1, y_max_1], ..., [y_min_N, y_max_N]]
.
Heights are normalised with respect to the
reference dataframe df_index
, the first one by default.
def
area( spectra: sah.classes.Spectra, range: list = None, df_index: int = 0) -> sah.classes.Spectra:
103def area( 104 spectra:Spectra, 105 range:list=None, 106 df_index:int=0 107 ) -> Spectra: 108 """Normalize `spectra` by the area under the datasets.""" 109 sdata = deepcopy(spectra) 110 df0 = sdata.dfs[df_index] 111 if range: 112 if len(range) != 2: 113 raise ValueError(f"The range must be a list of 2 elements, as in [xmin, xmax]. Yours was:\n{range}") 114 range.sort() 115 xmin = range[0] 116 xmax = range[1] 117 else: 118 xmin = min(df0[df0.columns[0]]) 119 xmax = max(df0[df0.columns[0]]) 120 df0 = df0[(df0[df0.columns[0]] >= xmin) & (df0[df0.columns[0]] <= xmax)] 121 area_df0, _ = area_under_peak(sdata, peak=[xmin,xmax], df_index=df_index, min_as_baseline=True) 122 normalized_dataframes = [] 123 for df_i, df in enumerate(sdata.dfs): 124 area_df, _ = area_under_peak(sdata, peak=[xmin,xmax], df_index=df_i, min_as_baseline=True) 125 scaling_factor = area_df0 / area_df 126 df[df.columns[1]] = df[df.columns[1]] * scaling_factor 127 normalized_dataframes.append(df) 128 sdata.dfs = normalized_dataframes 129 return sdata
Normalize spectra
by the area under the datasets.
def
unit_str(unit: str):
132def unit_str(unit:str): 133 """Normalize `unit` string from user input.""" 134 for key, value in alias.units.items(): 135 if unit in value: 136 return key 137 print(f"WARNING: Unknown unit '{unit}'") 138 return unit
Normalize unit
string from user input.