from flask import Flask, request, jsonify, render_template import pandas as pd from sklearn.preprocessing import LabelEncoder from sklearn.model_selection import train_test_split from sklearn.preprocessing import PolynomialFeatures from sklearn.linear_model import LinearRegression from datetime import datetime # Создание экземпляра Flask app = Flask(__name__) # Загрузка данных из файлов games_data = pd.read_csv("games.csv") open_critic_data = pd.read_csv("open_critic.csv") # Объединение данных по столбцам id и game_id data = games_data.merge(open_critic_data, left_on="id", right_on="game_id", how="inner") # Преобразование даты в количество дней data['release_date'] = (pd.to_datetime(data['release_date']) - pd.to_datetime(data['release_date']).min()).dt.days # Удаление строк с отсутствующими значениями (NaN) в столбце "rating" data = data.dropna(subset=["rating"]) # Подготовка данных label_encoder = LabelEncoder() data["genres"] = label_encoder.fit_transform(data["genres"]) X = data[["genres", "price", "release_date"]] y = data["rating"] # Разделение данных на обучающий и тестовый наборы X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # Создание полиномиальных признаков poly = PolynomialFeatures(degree=2) X_train_poly = poly.fit_transform(X_train) X_test_poly = poly.transform(X_test) # Обучение модели регрессии regressor = LinearRegression() regressor.fit(X_train_poly, y_train) # Найти минимальную дату min_release_date = min(pd.to_datetime(games_data['release_date'])).replace(tzinfo=None) # Маршрут для отображения HTML-формы @app.route('/', methods=['GET']) def index(): return render_template('predict.html') # Маршрут для предсказания рейтинга @app.route('/predict', methods=['POST']) def predict(): data = request.form genre = label_encoder.transform([data["genres"]])[0] price = float(data["price"]) # Преобразуйте release_date в объект datetime release_date = datetime.strptime(data["release_date"], "%Y-%m-%dT%H:%M:%S.%fZ") # Вычитайте минимальную дату и преобразуйте в количество дней release_date = (release_date - min_release_date).days input_data = poly.transform([[genre, price, release_date]]) rating = regressor.predict(input_data)[0] return f"Предсказанный рейтинг игры: {rating:.2f}" if __name__ == '__main__': app.run(port=5000)