import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
%matplotlib inline


from IPython.display import Image

"""
Explanation: Cual es la mejor estrategia para adivinar?
Por Miguel Escalona
End of explanation
"""


Image('data/guess_who_board.jpg', width=700)

"""
Explanation: ¡Adivina Quién es!
El juego de adivina quién es, consiste en adivinar el personaje que tu oponente ha seleccionado antes de que él/ella adivine el tuyo.
La dinámica del juego es:
* Cada jugador elige un personaje al azar 
* Por turnos, cada jugador realiza preguntas de sí o no, e intenta adivinar el personaje del oponente.
* Las preguntas válidas están basadas en la apariencia de los personajes y deberían ser fáciles de responder.
* Ejemplo de pregunta válida: ¿Tiene el cabello negro?
* Ejemplo de pregunta no válida: ¿Luce como un ex-presidiario?
A continuación, cargamos el tablero con los personajes.
End of explanation
"""


df = pd.read_csv('data/guess_who.csv', index_col='observacion')
df.head()

"""
Explanation: Cargando los datos
Para la carga de datos usaremos la función read_csv de pandas. Pandas cuenta con un amplio listado de funciones para la carga de datos. Mas informacion en la documentación de la API.
End of explanation
"""


#Separamos los tipos de variables
categorical_var = 'color de cabello'
binary_vars = list(set(df.keys()) - set([categorical_var, 'NOMBRE']))

# Para las variables booleanas calculamos la suma
df[binary_vars].sum()

# Para las variables categoricas, observamos la frecuencia de cada categoría
df[categorical_var].value_counts()

labels = df['NOMBRE']
del df['NOMBRE'] 
df.head()

labels

"""
Explanation: ¿Cuántos personajes tenemos con cada caracteristica?
End of explanation
"""


from sklearn.feature_extraction import DictVectorizer
vectorizer = DictVectorizer(sparse=False)
ab=vectorizer.fit_transform(df.to_dict('records'))
dft = pd.DataFrame(ab, columns=vectorizer.get_feature_names())
dft.head()

"""
Explanation: Codificación de variables categóricas
End of explanation
"""


from sklearn.tree import DecisionTreeClassifier

classifier = DecisionTreeClassifier(criterion='entropy', splitter='random', random_state=42)
classifier.fit(dft, labels)

"""
Explanation: Entrenando un arbol de decisión
End of explanation
"""


classifier.feature_importances_

feat = pd.DataFrame(index=dft.keys(), data=classifier.feature_importances_, columns=['score'])
feat = feat.sort_values(by='score', ascending=False)

feat.plot(kind='bar',rot=85,figsize=(10,4),)

"""
Explanation: Obtención de los pesos de cada feature
End of explanation
"""


from sklearn.tree import export_graphviz
dotfile = open('guess_who_tree.dot', 'w')
export_graphviz(
    classifier, 
    out_file = dotfile, 
    filled=True, 
    feature_names = dft.columns, 
    class_names=list(labels), 
    rotate=True, 
    max_depth=1, 
    rounded=True,
)
dotfile.close()

!dot -Tpng guess_who_tree.dot -o guess_who_tree.png 

Image('guess_who_tree.png', width=1000)

"""
Explanation: Bonus: Visualizando el arbol, requiere graphviz
conda install graphviz
End of explanation
"""


