TIF_NGANJUK_E41212290/backend/app.py

148 lines
5.0 KiB
Python

from flask import Flask, request, jsonify
from flask_cors import CORS
from sklearn.neighbors import KNeighborsClassifier
import pandas as pd
import os
app = Flask(__name__)
CORS(app)
DATASET_FILE = os.path.join(os.path.dirname(__file__), "dataset.xlsx")
# Mapping angka ke kategori jawaban
ANSWER_MAPPING = {
0: "Tidak Mengandung",
1: "Sangat Sedikit Mengandung",
2: "Agak Mengandung",
3: "Cukup Mengandung",
4: "Banyak Mengandung",
5: "Sangat Banyak Mengandung"
}
REVERSE_MAPPING = {v: k for k, v in ANSWER_MAPPING.items()}
# Fungsi untuk membaca dataset
def load_dataset():
if os.path.exists(DATASET_FILE):
try:
data = pd.read_excel(DATASET_FILE)
if data.empty:
data = pd.DataFrame(columns=["Nama Game", "Kekerasan", "Bahasa Kasar", "Tema Seksual", "Darah/Gore", "Elemen Perjudian", "Rating"])
data.to_excel(DATASET_FILE, index=False)
except Exception as e:
print("Error saat membaca dataset:", e)
data = pd.DataFrame(columns=["Nama Game", "Kekerasan", "Bahasa Kasar", "Tema Seksual", "Darah/Gore", "Elemen Perjudian", "Rating"])
data.to_excel(DATASET_FILE, index=False)
else:
data = pd.DataFrame(columns=["Nama Game", "Kekerasan", "Bahasa Kasar", "Tema Seksual", "Darah/Gore", "Elemen Perjudian", "Rating"])
data.to_excel(DATASET_FILE, index=False)
print("Kolom dalam dataset:", data.columns.tolist())
required_columns = ["Nama Game", "Kekerasan", "Bahasa Kasar", "Tema Seksual", "Darah/Gore", "Elemen Perjudian", "Rating"]
for col in required_columns:
if col not in data.columns:
raise ValueError(f"Kolom '{col}' tidak ditemukan dalam dataset!")
X = data.iloc[:, 1:-1].values
y = data.iloc[:, -1].values
return X, y, data
# Fungsi untuk menambahkan data ke dataset
def add_to_dataset(name, features, rating):
data = pd.read_excel(DATASET_FILE)
if name not in data['Nama Game'].values:
new_row = [name] + features + [rating]
data.loc[len(data)] = new_row
data.to_excel(DATASET_FILE, index=False)
# Endpoint untuk mengecek apakah game sudah ada dalam dataset
@app.route('/check_game', methods=['POST'])
def check_game():
try:
data = request.json
game_name = data['game_name']
_, _, dataset = load_dataset()
if game_name in dataset["Nama Game"].values:
rating = dataset.loc[dataset["Nama Game"] == game_name, "Rating"].values[0]
return jsonify({'exists': True, 'rating': rating})
return jsonify({'exists': False})
except Exception as e:
return jsonify({"error": str(e)}), 500
# Endpoint untuk menerima jawaban dan memberikan rating
@app.route('/submit_answers', methods=['POST'])
def submit_answers():
try:
data = request.json
print("=== DATA DITERIMA DARI FRONTEND ===")
print(data)
game_name = data.get('game_name', '').strip()
answers = data.get('answers', [])
if not game_name or not answers:
print("❌ ERROR: Data tidak lengkap")
return jsonify({"error": "Data tidak lengkap"}), 400
print("✔ Nama Game:", game_name)
print("✔ Jawaban:", answers)
# Cek apakah jawaban valid
features = []
for answer in answers:
if answer not in REVERSE_MAPPING:
print(f"❌ ERROR: Jawaban tidak valid -> {answer}")
return jsonify({"error": f"Jawaban tidak valid: {answer}"}), 400
features.append(REVERSE_MAPPING[answer])
print("✔ Features (dikonversi ke angka):", features)
X, y, dataset = load_dataset()
# Jika game sudah ada di dataset, kembalikan rating yang sudah ada
if game_name in dataset["Nama Game"].values:
existing_rating = dataset.loc[dataset["Nama Game"] == game_name, "Rating"].values[0]
print("✔ Game ditemukan dalam dataset. Rating:", existing_rating)
return jsonify({'rating': existing_rating})
# Prediksi rating dengan KNN jika dataset cukup besar
if len(X) > 3:
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X, y)
predicted_rating = knn.predict([features])[0]
else:
total_score = sum(features)
if total_score <= 5:
predicted_rating = "SU"
elif total_score <= 10:
predicted_rating = "3+"
elif total_score <= 15:
predicted_rating = "7+"
elif total_score <= 20:
predicted_rating = "13+"
else:
predicted_rating = "18+"
print("✔ Prediksi Rating:", predicted_rating)
add_to_dataset(game_name, features, predicted_rating)
return jsonify({'rating': predicted_rating})
except Exception as e:
print("❌ ERROR di backend:", str(e))
return jsonify({"error": str(e)}), 500
if __name__ == '__main__':
app.run(debug=True)