File size: 1,994 Bytes
0d592cb
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
from fastapi import FastAPI
from pydantic import BaseModel
import joblib
import pandas as pd

# Load model
model = joblib.load("speed_hit_model.pkl")

# Label decoding
label_reverse = {0: "Player attacks twice and counters twice", 
                 1: "Enemy attacks twice and counters twice", 
                 2: "Both attack once"}

# Define API input structure
class BattleStats(BaseModel):
    player_speed: int
    player_weight: int
    player_attack_accuracy: float
    player_hit_accuracy: float
    player_avoidance: float
    enemy_speed: int
    enemy_weight: int
    enemy_attack_accuracy: float
    enemy_hit_accuracy: float
    enemy_avoidance: float

# Initialize FastAPI app
app = FastAPI()

@app.post("/predict")
def predict(stats: BattleStats):
    # Compute derived features
    player_base_speed = stats.player_speed - stats.player_weight
    enemy_base_speed = stats.enemy_speed - stats.enemy_weight
    player_hit_chance = stats.player_attack_accuracy * stats.player_hit_accuracy * (1 - stats.enemy_avoidance)
    enemy_hit_chance = stats.enemy_attack_accuracy * stats.enemy_hit_accuracy * (1 - stats.player_avoidance)

    # Create DataFrame
    features = pd.DataFrame([{
        "Player Speed": stats.player_speed,
        "Player Weight": stats.player_weight,
        "Player Base Speed": player_base_speed,
        "Player Attack Accuracy": stats.player_attack_accuracy,
        "Player Hit Accuracy": stats.player_hit_accuracy,
        "Player Avoidance": stats.player_avoidance,
        "Player Hit Chance": player_hit_chance,

        "Enemy Speed": stats.enemy_speed,
        "Enemy Weight": stats.enemy_weight,
        "Enemy Base Speed": enemy_base_speed,
        "Enemy Attack Accuracy": stats.enemy_attack_accuracy,
        "Enemy Hit Accuracy": stats.enemy_hit_accuracy,
        "Enemy Avoidance": stats.enemy_avoidance,
        "Enemy Hit Chance": enemy_hit_chance
    }])

    pred = model.predict(features)[0]
    return {"outcome": label_reverse[pred]}