#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pickle
from sklearn.metrics import accuracy_score, precision_score, recall_score
from sklearn.metrics import confusion_matrix, classification_report
from sklearn.utils import shuffle
from sklearn import tree
from sklearn import svm
from sklearn.neighbors import KNeighborsClassifier
from sklearn import cross_validation
#import matplotlib.pyplot as plt

from sklearn.tree import DecisionTreeClassifier
from sklearn.naive_bayes import GaussianNB 
from sklearn.dummy import DummyClassifier

from sklearn import linear_model
import numpy as np


from sklearn.cross_validation import train_test_split

[n,PearsonNumpy, PearsonScipy, Kendall, Spearman, PearsonNumpy, DiccPearsonScipy, DiccKendallScipy, DiccSpearmanScipy, DataSismos, key2vector]= pickle.load( open( "correlaciones_jazminHernan-jazminMeses-volumen.p", "rb" ) )

Grupos = {
    'sacudir_orig-magnitud_orig-velocidadpromedio' : ["sacudir_orig","magnitud_orig","velocidadpromedio"],
    'sacudir_orig-magnitud_orig' : ["terremoto","chile"],
    'temblor_orig-sacudir_orig-magnitud_orig-velocidadpromedio' : ["temblor_orig","sacudir_orig","magnitud_orig","velocidadpromedio"],
    'temblor_orig-sacudir_orig-magnitud_orig': ["temblor_orig","sacudir_orig","magnitud_orig"],
    "sacudir_orig":["sacudir_orig"],
    "sacudir_orig-velocidadpromedio":["sacudir_orig","velocidadpromedio"],
    "terremoto_orig-sacudir_orig-magnitud_orig-velocidadpromedio":["terremoto_orig","sacudir_orig","magnitud_orig","velocidadpromedio"],
    "terremoto_orig-sacudir_orig-magnitud_orig":['terremoto_orig","sacudir_orig","magnitud_orig'],
    "terremoto_orig-temblor_orig-sacudir_orig-magnitud_orig-velocidadpromedio":["terremoto_orig","temblor_orig","sacudir_orig","magnitud_orig","velocidadpromedio"]
    }


# A Continuación se va a buscar la mejor via de clasificacion, para eso lo que se hace es
# ir probando con los grupos de terminos como atributo, primero solo el mas importante, luego los
# dos mas importantes y asi

R = []
Attr = []
y = [str(x) for x in key2vector['magnitud_real']]
y_enteros = [int(float(x)) for x in y]
cont = 0
for g in Grupos:
    R.append([])
    Attr.append(g)
    atts = ",".join(Attr)
    print '--------------------------------------------------------------------------------'
    print 'Probando Atributos: ',Attr
    
    Z = []
    for a in Attr:
        Z.append(key2vector[a])
    X = [list(x) for x in zip(*Z)]

    for k in range(2,9):       
        
        #####"knn con k=",k,"clases reales"
        #knn = KNeighborsClassifier(n_neighbors=k)
        #knn.fit(X,y)
        #y_pred = knn.predict(X)
        #acc = accuracy_score(y,y_pred)
        #print "knn con k=",k,"clases reales:",acc
        #R[cont].append(tuple([acc,"knn ("+atts+") con k="+str(k)+"clases reales"]))
        
        
        ##### knn con k=",k,"clases enteras"
        knn = KNeighborsClassifier(n_neighbors=k)
        knn.fit(X,y_enteros)
        y_pred = knn.predict(X)
        acc = accuracy_score(y_enteros,y_pred)
        print "knn con k=",k,"clases enteras:",acc
        R[cont].append(tuple([acc,"knn ("+atts+") con k="+str(k)+"clases enteras",str(k)+"-nn "+atts]))

        
        #####"cross_validation de knn con k=",k,"clases reales"
        #knn = KNeighborsClassifier(n_neighbors=k)
        #cv_arr = cross_validation.cross_val_score(knn,X,y,cv=10)
        #valor = sum(cv_arr)/len(cv_arr)
        #print  "knn - cross_validation con k=",k,"clases reales:",valor
        #R[cont].append(tuple([valor,"knn ("+atts+")- cross_validation con k="+str(k)+"clases reales"]))
        
        
        ##### cross_validation de knn con k=",k,"clases enteras:
        knn = KNeighborsClassifier(n_neighbors=k)
        cv_arr = cross_validation.cross_val_score(knn,X,y_enteros,cv=10)
        valor = sum(cv_arr)/len(cv_arr)
        print "knn  - cross_validation con k=",k,"clases enteras:",valor
        R[cont].append(tuple([valor,"knn ("+atts+")- cross_validation con k="+str(k)+"clases enteras",str(k)+"-nn "+atts]))
    
    
   
    ##########################################
    ###             SVM
    # http://scikit-learn.org/stable/modules/svm.html
    ## SVC -ovo- real
    
    #clf = svm.SVC(decision_function_shape='ovo')
    #scores = cross_validation.cross_val_score(clf, X, y, cv=10)
    #valor = sum(scores)/len(scores)
    #print "svm.SVC(ovo)  - cross_validation clases reales:",valor
    #R[cont].append(tuple([valor,"svm.SVC - ovo -("+atts+")- cross_validation clases reales"]))
    
    
    ##  SVC -ovr- real
    #clf = svm.SVC(decision_function_shape='ovr')
    #scores = cross_validation.cross_val_score(clf, X, y, cv=10)
    #valor = sum(scores)/len(scores)
    #print "svm.SVC(ovr)  - cross_validation clases reales:",valor
    #R[cont].append(tuple([valor,"svm.SVC - ovr -("+atts+")- cross_validation clases reales"]))
    
    
    ## SVC -ovo- entero
    clf = svm.SVC(decision_function_shape='ovo')
    scores = cross_validation.cross_val_score(clf, X, y_enteros, cv=10)
    valor = sum(scores)/len(scores)
    print "svm.SVC(ovo)  - cross_validation clases entero:",valor
    R[cont].append(tuple([valor,"svm.SVC - ovo -("+atts+")- cross_validation clases entero","svm "+atts]))
    
    
    ##  SVC -ovr - entero
    clf = svm.SVC(decision_function_shape='ovr')
    scores = cross_validation.cross_val_score(clf, X, y_enteros, cv=10)
    valor = sum(scores)/len(scores)
    print "svm.SVC(ovr)  - cross_validation clases entero:",valor
    R[cont].append(tuple([valor,"svm.SVC - ovr -("+atts+")- cross_validation clases entero","svm "+atts]))
    
    ## LinearSVC - real
    #clf = svm.LinearSVC()
    #scores = cross_validation.cross_val_score(clf, X, y, cv=10)
    #valor = sum(scores)/len(scores)
    #print "LinearSVC  - cross_validation clases reales:",valor
    #R[cont].append(tuple([valor,"svm.LinearSVC ("+atts+")- cross_validation clases reales"]))
    
    
    # LinearSVC -entero
    clf = svm.LinearSVC()
    scores = cross_validation.cross_val_score(clf, X, y_enteros, cv=10)
    valor = sum(scores)/len(scores)
    print "LinearSVC  - cross_validation clases enteros:",valor
    R[cont].append(tuple([valor,"svm.LinearSVC ("+atts+")- cross_validation clases enteros","linearSCV "+atts]))
    
    
    
    #---- BaseLine contant rales
    #-- 
    #strategy = "uniform"
    #clf = DummyClassifier(strategy=strategy)
    #scores = cross_validation.cross_val_score(clf, X, y, cv=10)
    #valor = sum(scores)/len(scores)
    #print "DummyClassifier(uniform) - cross_validation clases reales:",valor
    #R[cont].append(tuple([valor,"DummyClassifier(uniform) - ("+atts+")- cross_validation clases reales"]))
    
    #-
    #strategy = "most_frequent"
    #clf = DummyClassifier(strategy=strategy)
    #scores = cross_validation.cross_val_score(clf, X, y, cv=10)
    #valor = sum(scores)/len(scores)
    #print "DummyClassifier(most_frequent) - cross_validation clases reales:",valor
    #R[cont].append(tuple([valor,"DummyClassifier(most_frequent) - ("+atts+")- cross_validation clases reales"]))
    
    #-
    #strategy = "stratified"
    #clf = DummyClassifier(strategy=strategy)
    #scores = cross_validation.cross_val_score(clf, X, y, cv=10)
    #valor = sum(scores)/len(scores)
    #print "DummyClassifier(stratified) - cross_validation clases reales:",valor
    #R[cont].append(tuple([valor,"DummyClassifier(stratified) - ("+atts+")- cross_validation clases reales"]))
    
     #-- enteros
    strategy = "uniform"
    clf = DummyClassifier(strategy=strategy)
    scores = cross_validation.cross_val_score(clf, X, y_enteros, cv=10)
    valor = sum(scores)/len(scores)
    print "DummyClassifier(uniform) - cross_validation clases enteros:",valor
    R[cont].append(tuple([valor,"DummyClassifier(uniform) - ("+atts+")- cross_validation clases enteros","BaseLine(uniform) "+atts]))
    
    #-
    strategy = "most_frequent"
    clf = DummyClassifier(strategy=strategy)
    scores = cross_validation.cross_val_score(clf, X, y_enteros, cv=10)
    valor = sum(scores)/len(scores)
    print "DummyClassifier(most_frequent) - cross_validation clases enteros:",valor
    R[cont].append(tuple([valor,"DummyClassifier(most_frequent) - ("+atts+")- cross_validation clases enteros","BaseLine(most_frequent) "+atts]))
    
    #-
    strategy = "stratified"
    clf = DummyClassifier(strategy=strategy)
    scores = cross_validation.cross_val_score(clf, X, y_enteros, cv=10)
    valor = sum(scores)/len(scores)
    print "DummyClassifier(stratified) - cross_validation clases enteros:",valor
    R[cont].append(tuple([valor,"DummyClassifier(stratified) - ("+atts+")- cross_validation clases enteros","BaseLine(stratified) "+atts]))
    
    
    ##############################################
    ##  Decision Tree
    #
    # reales
    #clf = DecisionTreeClassifier(random_state=0)
    #scores = cross_validation.cross_val_score(clf, X, y, cv=10)
    #valor = sum(scores)/len(scores)
    #print "DecisionTreeClassifier - cross_validation clases reales:",valor
    #R[cont].append(tuple([valor,"DecisionTreeClassifier - ("+atts+")- cross_validation clases reales"]))
    
    # enteros
    clf = DecisionTreeClassifier(random_state=0)
    scores = cross_validation.cross_val_score(clf, X, y_enteros, cv=10)
    valor = sum(scores)/len(scores)
    print "DecisionTreeClassifier - cross_validation clases enteros:",valor
    R[cont].append(tuple([valor,"DecisionTreeClassifier - ("+atts+")- cross_validation clases enteros","DecisionTreeClassifier "+atts]))
    
    
    #################################################
    ####    Naive Bayes
    clf = GaussianNB()
    
    #scores = cross_validation.cross_val_score(clf, X, y, cv=10)
    #valor = sum(scores)/len(scores)
    #print "GaussianNB - cross_validation clases reales:",valor
    #R[cont].append(tuple([valor,"GaussianNB - ("+atts+")- cross_validation clases reales"]))
    
    # enteros
    clf = GaussianNB()
    scores = cross_validation.cross_val_score(clf, X, y_enteros, cv=10)
    valor = sum(scores)/len(scores)
    print "GaussianNB - cross_validation clases enteros:",valor
    R[cont].append(tuple([valor,"GaussianNB - ("+atts+")- cross_validation clases enteros","NaiveBayes "+atts]))
    
    
    #################################################
    ####   Regresion Lineal
    regr = linear_model.LinearRegression()
    y_reales = [float(x) for x in y]
    X_train, X_test, y_train, y_test = train_test_split(X,y_reales, test_size=0.20)
    regr.fit(X_train, y_train)
    media = np.mean((regr.predict(X_test) - y_test) ** 2)
    print("Mean squared error: %.2f"
      % media)
    varianza = regr.score(X_test, y_test)
    R[cont].append(tuple([media,"Regresion Lineal -Mean:"+str(media)+"  varianza:"+str(varianza)+"    ("+atts+")"]))#,"NaiveBayes "+atts]))
    
    
    
    
    cont+=1





