# -*- coding: utf-8 -*-
"""
Created on Mon May  6 19:43:46 2024

@author: aleja
"""

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.decomposition import SparsePCA
import joblib

datos=[]
#1 abrir archivo.csv
 

datos = pd.read_csv('d00_te.csv')
shape = datos.shape
n=len(datos.axes[0])
m=len(datos.axes[1])


#2 normalizar a media conocida y varianza 1
    
valor_medio = datos.mean(axis=0)
variable_centralizada = datos - valor_medio

desviacion_estandar = datos.std(axis=0)

X = variable_centralizada / desviacion_estandar
Xn=X.to_numpy()
n_components=31

model_spca=SparsePCA(n_components=31, alpha=0.1) #cambiar el alpha  a 0.1
model_spca.fit(Xn)

t_spca = model_spca.transform(Xn)
var_t=np.cov(t_spca.T)

P_spca=model_spca.components_.T

Xn_spca = model_spca.inverse_transform(t_spca)


r=1/(n-1)*np.dot(np.transpose(Xn), Xn) 
v,s, vt=np.linalg.svd(r)
a=0
variabilidad=90
variabilidadc=0
traza=sum(s)

while (variabilidadc < variabilidad and a <len(s)):
    variabilidadc = variabilidadc+(s[a]/traza)*100
    a=a+1
p=v[:,:a]   


T2=[]
for i in range (n):
    
    multi=(np.dot(np.dot(t_spca[i,:],np.linalg.inv(var_t)), np.transpose(t_spca[i,:])))

    T2=np.append(T2,multi)


Tumbral=np.percentile(T2,99)

residuo=Xn_spca-Xn

var_res=np.cov(residuo.T)

Q=[]
for i in range (n):
    
    multi1=(np.dot(np.dot(residuo[i,:],np.linalg.inv(var_res)), np.transpose(residuo[i,:])))

    Q=np.append(Q,multi1)




Qumbral=np.percentile(Q,99)

ejex=np.arange(n)
plt.title('SPCA T2')
plt.xlabel('t')
plt.ylabel('T^2')
plt.scatter(ejex, T2, c ="green")
plt.axhline(y=Tumbral, color="r", label="Percentil 99")
plt.show()

ejex=np.arange(n)
plt.title('SPCA T2')
plt.xlabel('t')
plt.ylabel('Q')
plt.scatter(ejex, Q, c ="blue")
plt.axhline(y=Qumbral, color="r", label="Percentil 99")
plt.show()





# ejex=np.arange(n)

# plt.title('Xn and t_spca')
# plt.xlabel('t')
# plt.ylabel('Xn y t_spca')
# plt.scatter(ejex, Xn[:, 0], c ="green")
# plt.scatter(ejex, t_spca[:,0], color="r")
# plt.show()



#np.savez("fich_datos_SPCA",Qumbral=Qumbral,Tumbral=Tumbral,
 #        valor_medio=valor_medio,desviacion_estandar=desviacion_estandar)
 
 
joblib.dump({
    'Qumbral': Qumbral,
    'Tumbral': Tumbral,
    'valor_medio': valor_medio,
    'desviacion_estandar': desviacion_estandar,
    'var_t':var_t,
    'p':p,
    'var_res':var_res,
    'model_spca': model_spca
}, 'fich_datos_SPCA.pkl')

