84 lines
3.9 KiB
Python
84 lines
3.9 KiB
Python
|
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)
|