"""
utils.py
====================================
Module to hold methods useful for different kinds of spectra.
"""
import numpy as np
import pandas as pd
[docs]
def get_covariance_matrix(row, band):
columns = row.keys() if isinstance(row, dict) else row.index
if f'{band}_covariance_matrix' in columns:
covariance_matrix = row[f'{band}_covariance_matrix']
return np.nan if covariance_matrix is None else covariance_matrix
elif f'{band}_coefficient_covariances' in columns:
coefficient_covariances = row[f'{band}_coefficient_covariances']
return np.nan if coefficient_covariances is None else coefficient_covariances
elif f'{band}_coefficient_correlations' in columns:
return _correlation_to_covariance_dr3int5(row[f'{band}_coefficient_correlations'],
row[f'{band}_coefficient_errors'],
row[f'{band}_standard_deviation'])
raise ValueError(f'None of the expected columns could be found in the input row. Columns are: {columns}.')
def _correlation_to_covariance_dr3int5(correlation_matrix, formal_errors, standard_deviation):
"""
Compute the covariance matrix from the correlation matrix and the parameter formal errors.
Args:
correlation_matrix (ndarray): Correlation matrix, 2D array.
formal_errors (ndarray): Formal errors of the parameters.
standard_deviation (float): Standard deviation of the LSQ solution.
Returns:
ndarray: The covariance matrix as a numpy array.
"""
if pd.isna(standard_deviation):
return np.nan
diagonal_errors = np.diag(formal_errors) / standard_deviation
return diagonal_errors @ correlation_matrix @ diagonal_errors
def _correlation_to_covariance_dr3int4(correlation_matrix, formal_errors, standard_deviation):
"""
Compute the covariance matrix from the correlation matrix and the parameter formal errors.
Args:
correlation_matrix (ndarray): Correlation matrix.
formal_errors (ndarray): Formal errors of the parameters.
standard_deviation (float): Standard deviation of the LSQ solution.
Returns:
ndarray: The covariance matrix as a numpy array.
"""
diagonal_errors = np.diag(formal_errors) / standard_deviation
correlation_matrix_aux = np.multiply(correlation_matrix, (standard_deviation * standard_deviation))
np.fill_diagonal(correlation_matrix_aux, 1.)
return diagonal_errors @ correlation_matrix_aux @ diagonal_errors
def _correlation_to_covariance_dr3int3(correlation_matrix, formal_errors):
"""
Compute the covariance matrix from the correlation matrix and the parameter formal errors.
Args:
correlation_matrix (ndarray): Correlation matrix.
formal_errors (ndarray): Formal errors of the parameters.
Returns:
ndarray: The covariance matrix as a numpy array.
"""
# Populate the diagonal matrix containing the formal errors.
diagonal_errors = np.diag(formal_errors)
covariance_matrix = diagonal_errors @ correlation_matrix @ diagonal_errors
return covariance_matrix
def _list_to_array(lst):
"""
List to NumPy array.
"""
if lst is None or (isinstance(lst, float) and pd.isna(lst)):
return None
if isinstance(lst, np.ndarray):
return lst
elif isinstance(lst, list):
if not lst:
raise ValueError('List cannot be empty.')
else:
return np.array(lst)
raise ValueError('Wrong input type.')