File size: 1,922 Bytes
a37e534
d8ec381
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
a37e534
 
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
import gradio as gr
import pandas as pd
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# Sample mock data (Morningstar-like)
data = {
    "5Y_Return": [14.0, 7.5, 13.2, 6.0, 15.0, 8.0, 12.0, 6.5, 10.5, 7.2],
    "Volatility": [8.0, 6.5, 7.8, 9.0, 7.0, 6.2, 7.1, 8.5, 6.8, 7.9],
    "Risk_Score": [2, 3, 2, 4, 1, 3, 2, 4, 2, 3],
    "Rating": ["Good", "Bad", "Good", "Bad", "Good", "Bad", "Good", "Bad", "Good", "Bad"]
}

df = pd.DataFrame(data)

# Convert labels to binary (Good = 1, Bad = 0)
df['Label'] = df['Rating'].map({'Good': 1, 'Bad': 0})

# Features and labels
X = df[["5Y_Return", "Volatility", "Risk_Score"]]
y = df["Label"]

# Scale features
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# Train an SVM classifier
model = SVC(kernel="linear", probability=True)
model.fit(X_scaled, y)

# Prediction function for Gradio
def classify_fund(return_5y, volatility, risk_score):
    input_data = [[return_5y, volatility, risk_score]]
    input_scaled = scaler.transform(input_data)
    prediction = model.predict(input_scaled)[0]
    confidence = model.predict_proba(input_scaled)[0][prediction]
    result = "Good Investment" if prediction == 1 else "Bad Investment"
    return f"{result} (Confidence: {confidence:.2f})"

# Gradio UI
with gr.Blocks() as demo:
    gr.Markdown("## 🧠 SVM Classifier: Is this a Good Mutual Fund?")
    with gr.Row():
        return_input = gr.Number(label="5-Year Return (%)", value=10.0)
        vol_input = gr.Number(label="Volatility (%)", value=7.0)
        risk_input = gr.Number(label="Risk Score (1=Low, 5=High)", value=3)
    output = gr.Textbox(label="Prediction")

    classify_btn = gr.Button("Classify Fund")
    classify_btn.click(fn=classify_fund, inputs=[return_input, vol_input, risk_input], outputs=output)

# Launch app
if __name__ == "__main__":
    demo.launch()