IIS_2023_1/savenkov_alexander_lab_5/app.py

70 lines
2.7 KiB
Python
Raw Normal View History

2023-10-24 19:01:33 +04:00
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)