from defs import features as ft
from defs import paths as pt
import numpy as np
import sklearn
from scipy.stats import pearsonr
import dataclasses

# do vypostu korelacniho koeficientu vstupuji nulove vektory, timto je zabraneno zobrazovani upozorneni
import warnings
warnings.filterwarnings("ignore")

path = 'data/'
names = pt.listdir('data/_wavs')

# vypocete korelacnich koeficientu je proveden na referencni nahravce
for n, name in enumerate(names):
    if name == 'PHQ':
        matrix = np.array(())
        fts = ft.FeatsData()
        fts.load_feats(path+pt.feat(name))
        fts_dict = dataclasses.asdict(fts)
        for i, par in enumerate(fts_dict):
            if par == 'rms':
                matrix = fts_dict[par]
                nms = par

            # pyin obsahuje NaN hodnoty, ktere jsou nahrazeny nulou
            elif par == 'pyin':
                out = np.nan_to_num(fts_dict[par])
                matrix = np.vstack((matrix, out))
                nms = np.vstack((nms, par))

            # mfcc je datove pole bez jmen, jmena jsou vytvorena iteraci
            elif par == 'mfcc':
                matrix = np.vstack((matrix, fts_dict[par]))
                for a, _ in enumerate(fts_dict[par]):
                    nms = np.vstack((nms, par+str(a+1)))

            else:
                matrix = np.vstack((matrix, fts_dict[par]))
                nms = np.vstack((nms, par))

        matrix = matrix.T

# dvojita iterace postupuje tak aby se kombinoval kazdy parametr s kazdym ale ne sam se sebou a pouze jednou
for n in range(len(matrix.T)):
    for i in range(n, len(matrix.T)):
        if n == i:
            continue
        else:
            # parametry jsou pred vypoctem korelacniho koeficientu skalovany
            obs = np.vstack((matrix[:, n], matrix[:, i]))
            min_max_scaler = sklearn.preprocessing.MinMaxScaler(feature_range=(-1, 1))
            features_scaled = min_max_scaler.fit_transform(obs.T)

            c, _ = pearsonr(features_scaled[:, 0], features_scaled[:, 1])

            # korelacni koeficient vyssi nez 0.5 znaci stredne silnou a vysokou miru korelace
            # korelujici parametry jsou redundantni
            if abs(c) > 0.5:
                print('Korelacni koeficient pro ' + str(nms[n]) + ' a ' + str(nms[i]) + ' je:', c)
