import config
import numpy as np
from sklearn.preprocessing import MinMaxScaler
from operator import itemgetter


def rank_to_dict(ranks, names):
    ranks = np.abs(ranks)
    minmax = MinMaxScaler()
    ranks = minmax.fit_transform(
        np.array(ranks).reshape(config.FEATURES_AMOUNT, 1)).ravel()
    ranks = map(lambda x: round(x, 2), ranks)
    return dict(zip(names, ranks))


def flip_array(arr):
    return-1 * arr + np.max(arr)


def get_ranks(lasso, rfe, f):
    ranks = dict()
    names = ["x%s" % i for i in range(1, config.FEATURES_AMOUNT+1)]

    ranks[config.LASSO_TITLE] = rank_to_dict(lasso.coef_, names)
    ranks[config.RFE_TITLE] = rank_to_dict(flip_array(rfe.ranking_), names)
    ranks[config.F_REGRESSION_TITLE] = rank_to_dict(f, names)

    return ranks


def calc_mean(ranks):
    mean = {}
    for key, value in ranks.items():
        print(key, value)
        for item in value.items():
            if item[0] not in mean:
                mean[item[0]] = 0
                mean[item[0]] += item[1]
    for key, value in mean.items():
        res = value/len(ranks)
        mean[key] = round(res, 2)
    return sorted(mean.items(), key=itemgetter(1), reverse=True)