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()