IIS_2023_1/savenkov_alexander_lab_3/app.py

84 lines
3.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

from flask import Flask, render_template, request, jsonify
import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
app = Flask(__name__)
# Загрузите данные из файлов
games_data = pd.read_csv("games.csv")
open_critic_data = pd.read_csv("open_critic.csv")
# Объедините данные
merged_data = games_data.merge(open_critic_data, left_on="id", right_on="game_id", how="inner")
# Создайте целевую переменную (успешность игры)
merged_data["Success"] = merged_data["rating"].apply(lambda x: 1 if x > 70 else 0)
# Преобразуйте столбец "release_date" в формат Unix-времени с корректной обработкой временных зон
merged_data["release_date"] = pd.to_datetime(merged_data["release_date"], utc=True).astype('int64') // 10**9
# Преобразуйте жанры в бинарные признаки (one-hot encoding)
genres_encoded = merged_data['genres'].str.get_dummies(sep=',')
merged_data = pd.concat([merged_data, genres_encoded], axis=1)
merged_data.drop('genres', axis=1, inplace=True)
# Определите признаки и целевую переменную
features = ["price", "release_date"] + list(genres_encoded.columns)
X = merged_data[features]
y = merged_data["Success"]
# Разделите данные на обучающий и тестовый наборы
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.01, random_state=42)
# Создайте и обучите модель дерева решений
model = DecisionTreeClassifier()
model.fit(X_train, y_train)
# Оцените модель на тестовом наборе данных
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
# Получите важности признаков
feature_importances = model.feature_importances_
@app.route("/", methods=["GET", "POST"])
def index():
if request.method == "POST":
# Получите данные из запроса
price = float(request.form["price"])
release_date = pd.to_datetime(request.form["release_date"], utc=True)
# Получите бинарные признаки жанров на основе введенных данных
genres_input = request.form["genres"]
genres_encoded_input = pd.DataFrame(genres_input.split(','), columns=["genre"])
genres_encoded_input = genres_encoded_input['genre'].str.get_dummies()
# Создайте пустой DataFrame с теми же признаками, что и X_train
input_data = pd.DataFrame(columns=X_train.columns)
# Заполните введенные данные
input_data["price"] = [price]
# Преобразуйте дату релиза в Unix-время
release_date_unix = release_date.timestamp()
input_data["release_date"] = [release_date_unix]
# Заполните one-hot закодированные жанры
for genre in genres_encoded_input.columns:
input_data[genre] = genres_encoded_input[genre].values
# Выполните классификацию игры
prediction = model.predict(input_data)[0]
# Определите результат
result = "Успешная" if prediction == 1 else "Неуспешная"
return render_template("index.html", accuracy=accuracy, success_count=sum(y_test), failure_count=len(y_test) - sum(y_test), feature_importances=feature_importances, prediction_result=result)
return render_template("index.html", accuracy=accuracy, success_count=sum(y_test), failure_count=len(y_test) - sum(y_test), feature_importances=feature_importances)
if __name__ == "__main__":
app.run(host="localhost", port=5000)