# -*- coding: utf-8 -*-
"""
Created on Thu Mar  7 19:37:49 2024

@author: aleja
"""

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

#DPCA
datos=[]

datos = pd.read_csv('d00_te.csv')
shape = datos.shape
n=len(datos.axes[0])
m=len(datos.axes[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()

Xn_1 = np.roll(Xn, 1, axis=1)#desplazamientos de los elementos de la matriz
Xn_1[:, 0] = Xn[:, 0]

Xn_2 = np.roll(Xn_1, 1, axis=1)
Xn_2[:, 0] = Xn_1[:, 0]


Xn_3 = np.roll(Xn_2, 1, axis=1)
Xn_3[:, 0] = Xn_2[:, 0]


XD = np.concatenate((Xn,Xn_1, Xn_2, Xn_3), axis=1)
#print(np.shape(XD))


r=1/(n-1)*np.dot(np.transpose(XD), XD) 
v,s, vt=np.linalg.svd(r)
t=np.dot(XD,v)

variabilidad=90
variabilidadc=0
a=0

traza=sum(s)

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


#print('hace ',a,'iteraciones') 

p=v[:,:a]              #matriz de tamaño xa
sa=np.diag(s[:a])

ta=np.dot(XD, p)
#print(np.shape(ta))    #960xa

#detectar fallos


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

    T2=np.append(T2,multi)
#print(T2)

Tumbral=np.percentile(T2,99)
#print(Tumbral)


#calcular la estadistica Q
Q=[]

for i in range(960):
    R=XD[i,:]-np.dot(np.dot(XD[i,:],p),np.transpose(p))
    Rt=np.transpose(R) #para que de la forma adecuada
    Qi=np.dot(Rt,R)
    Q=np.append(Q,Qi)
    
#print(np.shape(Q))
#print(Q)

Qumbral=np.percentile(Q,99)

#hacer graficas

ejex=np.arange(n)

plt.title('DPCA 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()


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


###guardar datos en un fichero

np.savez("fich_datos_DPCA",p=p,sa=sa,Qumbral=Qumbral,Tumbral=Tumbral,valor_medio=valor_medio,desviacion_estandar=desviacion_estandar)






