import pandas
from flask import Flask
from sklearn.metrics import accuracy_score
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier

app = Flask(__name__)


@app.route("/")
def home():
    return "<html>" \
           "<h1>Жукова Алина ПИбд-41</h1>" \
           "<h1>Лабораторная работа №3</h1>" \
           "<table>" \
           "<td>" \
           "<form Action='http://127.0.0.1:5000/k4_1_task_3' Method=get>" \
           "<input type=submit value='Дерево решений'>" \
           "</form>" \
           "</td>" \
           "</table>" \
           "</html>"

# Деревья решений
# 3.2 Решите задачу классификации
# (с помощью дерева решений), в которой по различным характеристикам
# пассажиров требуется найти у выживших пассажиров два наиболее важных
# признака из трех рассматриваемых  (Name, Cabin,Embarked)
# 3.2
#
#
@app.route("/k4_1_task_3", methods=['GET'])
def k4_1_task_3():
    data = pandas.read_csv('Data_chess_games.csv', index_col='id')
    data = data.sample(n=5000, replace=True, random_state=1)

    # отбор нужных столбцов
    corr = data[['rated', 'turns', 'increment_code', 'white_rating', 'black_rating', 'opening_ply',
                 'created_at', 'last_move_at', 'white_id', 'black_id']]

    # Добавление времени игры
    corr['time_game'] = corr['last_move_at'] - corr['created_at']

    def new_code(code):
        return (int(code.split("+")[0]) * 100) + int(code.split("+")[1])
    corr['n_increment_code'] = corr['increment_code'].apply(new_code)

    def strToint(elem):
        it_i = 0
        for ch in elem:
            it_i += ord(ch)
        return 2500 - it_i
    corr['n_white_id'] = corr['white_id'].apply(strToint)
    corr['n_black_id'] = corr['black_id'].apply(strToint)


    corr = corr[['white_rating', 'black_rating', 'n_white_id', 'n_black_id']]

    # определение целевой переменной
    y = data['victory_status']

    X_train, X_test, y_train, y_test = train_test_split(corr, y, test_size=.01, random_state=42)

    # создание и обучение дерева решений
    clf = DecisionTreeClassifier(random_state=241)
    clf.fit(X_train, y_train)
    prediction = clf.predict(X_test)
    accuracy = str(accuracy_score(y_test, prediction))
    # получение и распечатка важностей признаков
    importances = clf.feature_importances_

    data = {}
    ind = 0
    st = []
    for el in importances:
        st.append(el)
        ind += 1

    data["Важность"] = st
    df = pandas.DataFrame(data, index=corr.columns)

    return "<html>" \
           "<h1>Деревья решений</h1>" \
           "<h2>Вариант 10. Задание 3.2</h2>" \
           "<h2>Данные об исходе шахматных партий. Необходимо определить исход партии (поставлен мат, кончилось время, соперник сдался, ничья)</h2>" \
           "<h2>Выбраны признаки: Рейтинг игрока за белых, рейтинг игрока за черных, id игроков</h2>" \
           "<h2>Важность признаков: </h2>" \
           "<div>" + df.to_html() + "</div>" \
           "<h2>Точность предсказания: " + str(accuracy) + "</h2>" \
           "</html>"

if __name__ == "__main__":
    app.run(debug=True)