import pandas as pd from flask import Flask, render_template, request from sklearn.neural_network import MLPRegressor from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler app = Flask(__name__) # Загрузка данных из файлов games_df = pd.read_csv('games.csv') open_critic_df = pd.read_csv('open_critic.csv') # Объединение данных по столбцам id и game_id merged_df = pd.merge(games_df, open_critic_df, left_on='id', right_on='game_id') # Проверка и удаление строк с NaN значениями в X и y merged_df = merged_df.dropna(subset=['genres', 'price', 'release_date', 'rating']) # Выбор нужных столбцов для обучения X = merged_df[['genres', 'price', 'release_date']] y = merged_df['rating'] # Преобразование категориальных признаков в числовые X = pd.get_dummies(X, columns=['genres']) # Преобразование даты релиза в числовой формат (в этом примере используется год релиза) X['release_year'] = pd.to_datetime(X['release_date']).dt.year X = X.drop(['release_date'], axis=1) # Разделение данных на обучающий и тестовый набор X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # Стандартизация данных scaler = StandardScaler() X_train_scaled = scaler.fit_transform(X_train) X_test_scaled = scaler.transform(X_test) # Инициализация и обучение MLPRegressor mlp_regressor = MLPRegressor(hidden_layer_sizes=(100,), max_iter=500, random_state=42) mlp_regressor.fit(X_train_scaled, y_train) # Получение точности на тестовых данных accuracy = mlp_regressor.score(X_test_scaled, y_test) * 100 # Получение стандартного отклонения на тестовых данных std_deviation = y_test.std() # Маршрут для отображения HTML-страницы @app.route('/') def index(): return render_template('index.html', accuracy=accuracy, std_deviation=std_deviation) # Маршрут для предсказания рейтинга на основе входных данных @app.route('/predict', methods=['POST']) def predict(): data = request.form.to_dict() # Преобразование входных данных в формат, подходящий для модели input_data = pd.DataFrame(data, index=[0]) input_data['price'] = int(input_data['price']) input_data['release_year'] = pd.to_datetime(input_data['releaseDate']).dt.year input_data = pd.get_dummies(input_data, columns=['genres']) # Удаление releaseDate, так как она больше не нужна после преобразования input_data = input_data.drop(['releaseDate'], axis=1) # Добавление отсутствующих дамми-переменных missing_cols = set(X.columns) - set(input_data.columns) for col in missing_cols: input_data[col] = 0 # Упорядочивание столбцов в нужном порядке input_data = input_data[X.columns] input_data_scaled = scaler.transform(input_data) # Предсказание рейтинга prediction = mlp_regressor.predict(input_data_scaled) return render_template('index.html', prediction_result=f'Predicted Rating: {prediction[0]:.2f}') if __name__ == '__main__': app.run(debug=True, port=5000)