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

from sklearn import decomposition
from sklearn import datasets

tabela = pd.read_csv("exemplo_7/iris.data",header=None,sep=',')

tabela

tabela.columns=['sepal_len', 'sepal_wid', 'petal_len', 'petal_wid', 'class']

tabela

tabela.tail()

"""
Explanation: Para este exemplo, vamos usar o dataset Iris, que pode ser obtido aqui:
https://archive.ics.uci.edu/ml/datasets/Iris
End of explanation
"""


X = tabela.ix[:,0:4].values
y = tabela.ix[:,4].values

X

y

nomes = list(set(y))

tabela.columns

colors = ['navy', 'turquoise', 'darkorange']
fig,ax = plt.subplots(2,2)

#n, bins, patches = P.hist(x, 10, normed=1, histtype='bar',
#                            color=['crimson', 'burlywood', 'chartreuse'],
#                            label=['Crimson', 'Burlywood', 'Chartreuse'])

# Coluna 0
dados_sepal_len = [X[y==nomes[0],0], X[y==nomes[1],0], X[y==nomes[2],0]]

n, bins, patches = ax[0,0].hist(dados_sepal_len,color=colors, label=list(set(y)))
ax[0,0].set_title('Sepal Length (cm)')

# Coluna 1
dados_sepal_wid = [X[y==nomes[0],1], X[y==nomes[1],1], X[y==nomes[2],1]]

ax[0,1].hist(dados_sepal_wid,color=colors, label=list(set(y)))
#ax[0,1].legend()
ax[0,1].set_title('Sepal Width (cm)')

# Coluna 2
dados_sepal_wid = [X[y==nomes[0],2], X[y==nomes[1],2], X[y==nomes[2],2]]

ax[1,0].hist(dados_sepal_wid,color=colors, label=list(set(y)))
#ax[1,0].legend()
ax[1,0].set_title('Petal Length (cm)')

# Coluna 3
dados_sepal_wid = [X[y==nomes[0],3], X[y==nomes[1],3], X[y==nomes[2],3]]

ax[1,1].hist(dados_sepal_wid,color=colors, label=list(set(y)))
#ax[1,1].legend()
ax[1,1].set_title('Petal Width (cm)')

fig.legend(patches, list(set(y)))

"""
Explanation: Agora, vamos separar os dados entre as medidas e as espécies.
End of explanation
"""


pca = decomposition.PCA()

print(pca)

"""
Explanation: Agora, vamos calcular a decomposição em componentes principais:
End of explanation
"""


pca.fit(X)

"""
Explanation: pca agora é uma referência para a função que calcula o PCA de X. Para efetivamente calcularmos os componentes principais, fazemos
End of explanation
"""


print(pca.explained_variance_ratio_)

"""
Explanation: Daqui pra frente, o objeto pca será onde nossas informações estão armazenadas. Para, por exemplo, verificarmos quais são os autovalores (variâncias) do nosso conjunto de dados, podemos fazer
End of explanation
"""


Xnew = pca.transform(X)

print(X)

print(Xnew)

"""
Explanation: Podemos ver então que o primeiro componente principal explica 92% dos dados.
Para transformarmos os dados para que fiquem alinhados/projetados nestes componentes principais, usamos
End of explanation
"""


fig,ax = plt.subplots()
plt.cla()
ax.scatter(Xnew[:, 0], Xnew[:, 1], cmap=plt.cm.spectral)
plt.show()

y[0]

list(set(y))

Xnew[y=='Iris-setosa']

fig2, ax2 = plt.subplots()
for color, i, name in zip(colors, [0, 1, 2], list(set(y))):
    ax2.scatter(Xnew[y == name, 0], Xnew[y == name, 1], color=color, label=names)
ax2.legend(loc='best', shadow=False, scatterpoints=1)
ax2.set_title('PCA of IRIS dataset')

colors

from mpl_toolkits.mplot3d import Axes3D

fig3d = plt.figure(3)
ax = Axes3D(fig3d)
for color, i, name in zip(colors, [0, 1, 2], list(set(y))):
    ax.scatter(Xnew[y == name, 0], Xnew[y == name, 1], Xnew[y==name, 2], color=color, label=names)
ax.legend(loc='best', shadow=False, scatterpoints=1)
plt.show()

"""
Explanation: Agora, queremos visualizar estes dados. Precisamos então selecionar quantos componentes queremos representar. Se quisermos mostrar dois componentes, fazemos
End of explanation
"""


