#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Thu Aug 31 22:41:02 2017

@author: ojacques
"""
import numpy as np
import matplotlib.pyplot as plt
import numpy.linalg as la
Data=np.array([[2.5, 2.4],
      [0.5, 0.7],
      [2.2, 2.9],
      [1.9, 2.2],
      [3.1, 3.0],
      [2.3, 2.7],
      [2.0, 1.6],
      [1.1, 1.0],
      [1.5, 1.6],
      [1.1, 0.9]],dtype=float)
(r,c) = np.shape(Data)
u=np.mean(Data,axis=0) #media de cada coluna
#DataAdjust=np.zeros((r,c),dtype=float)
DataAdjust=Data-u #Data - medias

K=np.cov(DataAdjust.T) # o python vê um vetor de variáveis
                       #matematicamente.
                       # [-X1-],
                       # [-X2-],
                       #  .
                       # [-Xp-]  cada Xi = [xi1,xi2, ..,xin],
                       # n observações. Cada Xi uma variável (campo)
#calculo de autovalores e autovetores de K
[D,V]=la.eigh(K) #,eigvals_only=True) #autovalores e autovetores da matriz de covariância de Xm
D_=np.diag(D)
K@V
V@D



i=np.argsort(D)[::-1]  # Obtém índices para ordenação decrescente dos
                       # autovalores
D=D[i]
O=V[:,i]

print('\nAutovalores ordenados por ordem decrescente\n')
print(D)
print('\nAutovetores ortogonais de cada autovalor associado\n')
print(O)
input('<ENTER>')

#eixos para plotagem
eixoMax=np.array([u-10*V[:,0],u+10*V[:,0]])
eixoMin=np.array([u-10*V[:,1],u+10*V[:,1]])

#Para um vetor de variáveis aleatórias X', queremos encontrar um
#novo vetor Y'=O'X'
#Mas Y' é um vetor Y na notação de BD
#Aplicando o transposto em todo Y'=O'X' temos Y''=X''O'', ou seja Y=XO em BD

FinalData=Data@O    #multiplicacao matricial Data * O, ou np.dot(Data,O) ou Data.dot(O)
FinalDataAdjust=DataAdjust@O

plt.subplot(2,2,1)
plt.title('Dados Brutos',size=8)
plt.plot(Data[:,0],Data[:,1],'k.')
plt.axis([-1,4,-1,4])
plt.plot(eixoMax[:,0],eixoMax[:,1]);
plt.plot(eixoMin[:,0],eixoMin[:,1]);
plt.grid(True)

eixoMax=np.array([-10*V[:,0],10*V[:,0]])
eixoMin=np.array([-10*V[:,1],10*V[:,1]])

plt.subplot(2,2,2)
plt.title('Dados ajustados (media zero)',size=8)
plt.plot(DataAdjust[:,0],DataAdjust[:,1],'k.')
plt.axis([-2,2,-2,2])
plt.plot(eixoMax[:,0],eixoMax[:,1]);
plt.plot(eixoMin[:,0],eixoMin[:,1]);
plt.grid(True)


udat=np.mean(FinalData,axis=0);
xdat=np.array([ [-1, udat[1] ],[5, udat[1] ] ]);
ydat=np.array([ [ udat[1], -1 ],[ udat[1], 4 ] ]);
plt.suptitle("Principal Components Analysis - PCA")
plt.subplot(2,2,3)
plt.title("DadosRotacionados=Dados.Autovetores",size=8)
plt.plot(FinalData[:,0],FinalData[:,1],'k.')
plt.plot(ydat[:,0],ydat[:,1])
plt.plot(xdat[:,0],xdat[:,1])
plt.axis([-1,4,-1,4])
plt.grid(True)


eixoMax=np.array([[-2,0],
                  [ 2,0]])
eixoMin=np.array([[0,-2],
                  [0, 2]])
plt.subplot(2,2,4)
plt.title('Media zero rotacionados pelo maior eixo (vermelho)',size=8)
plt.plot(FinalDataAdjust[:,0],FinalDataAdjust[:,1],'k.')
plt.plot(eixoMin[:,0],eixoMin[:,1]);
plt.plot(eixoMax[:,0],eixoMax[:,1]);

plt.axis([-2,2,-2,2])

plt.grid(True)
plt.show()


#ABERTURA DE ARQUIVOS
arquivo=open('numeros.txt',"w")
for linha in range(1,101):
    arquivo.write("%d\n" %linha)
arquivo.close

#PACOTE PICKLE

import pickle
f=open('teste.pck','w')
pickle.dump(12.3,f)     #salva um float
pickle.dump([1,2,3],f)  #salva uma lista
f.close()


