IIS_2023_1/savenkov_alexander_lab_5/app.py

70 lines
2.7 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, 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)