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