| import gradio as gr |
| import pandas as pd |
| import numpy as np |
| import matplotlib.pyplot as plt |
| import seaborn as sns |
| from sklearn.model_selection import train_test_split, cross_val_score, GridSearchCV |
| from sklearn.ensemble import RandomForestRegressor, RandomForestClassifier, GradientBoostingRegressor, GradientBoostingClassifier |
| from sklearn.linear_model import LinearRegression, LogisticRegression |
| from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error, accuracy_score, classification_report, confusion_matrix |
| from sklearn.preprocessing import LabelEncoder, StandardScaler |
| from sklearn.impute import SimpleImputer |
| import json |
| import bcrypt |
| import os |
| from datetime import datetime |
| import joblib |
| import warnings |
| warnings.filterwarnings('ignore') |
|
|
| |
| class AuthSystem: |
| def __init__(self, auth_file="user_auth.json"): |
| self.auth_file = auth_file |
| self.load_auth_data() |
| |
| def load_auth_data(self): |
| """Load authentication data from JSON file""" |
| if os.path.exists(self.auth_file): |
| with open(self.auth_file, 'r') as f: |
| self.auth_data = json.load(f) |
| else: |
| |
| self.auth_data = { |
| "username": "admin", |
| "password_hash": self.hash_password("admin123"), |
| "created_at": datetime.now().isoformat() |
| } |
| self.save_auth_data() |
| |
| def save_auth_data(self): |
| """Save authentication data to JSON file""" |
| with open(self.auth_file, 'w') as f: |
| json.dump(self.auth_data, f, indent=2) |
| |
| def hash_password(self, password): |
| """Hash password using bcrypt""" |
| return bcrypt.hashpw(password.encode(), bcrypt.gensalt()).decode() |
| |
| def verify_password(self, password, hashed): |
| """Verify password against hash""" |
| return bcrypt.checkpw(password.encode(), hashed.encode()) |
| |
| def register(self, username, password): |
| """Register new user (overwrites existing)""" |
| if not username or not password: |
| return False, "Kullanıcı adı ve şifre gereklidir" |
| |
| if len(password) < 6: |
| return False, "Şifre en az 6 karakter olmalıdır" |
| |
| self.auth_data = { |
| "username": username, |
| "password_hash": self.hash_password(password), |
| "created_at": datetime.now().isoformat() |
| } |
| self.save_auth_data() |
| return True, "Kullanıcı başarıyla kaydedildi" |
| |
| def login(self, username, password): |
| """Authenticate user""" |
| if not username or not password: |
| return False, "Kullanıcı adı ve şifre gereklidir" |
| |
| if (self.auth_data.get("username") == username and |
| self.verify_password(password, self.auth_data.get("password_hash"))): |
| return True, "Giriş başarılı" |
| else: |
| return False, "Geçersiz kullanıcı bilgileri" |
|
|
| |
| auth_system = AuthSystem() |
|
|
| def authenticate_user(username, password): |
| """Authentication function for Gradio""" |
| success, message = auth_system.login(username, password) |
| return success, message |
|
|
| def register_user(username, password): |
| """Registration function for Gradio""" |
| success, message = auth_system.register(username, password) |
| return success, message |
|
|
| def analyze_data(file, progress=gr.Progress()): |
| """Enhanced data analysis function with progress tracking""" |
| if file is None: |
| fig, ax = plt.subplots(figsize=(1,1)) |
| fig.patch.set_visible(False) |
| ax.axis('off') |
| plt.close(fig) |
| return "Lütfen bir CSV dosyası yükleyin.", fig, fig, None, None, None, [], None, None, None, None, None |
|
|
| try: |
| progress(0.1, desc="Dosya okunuyor...") |
| |
| |
| file_size = os.path.getsize(file.name) |
| if file_size > 100 * 1024 * 1024: |
| raise Exception("Dosya boyutu 100MB'dan küçük olmalıdır") |
| |
| |
| try: |
| df = pd.read_csv(file.name, encoding='utf-8') |
| except UnicodeDecodeError: |
| df = pd.read_csv(file.name, encoding='latin-1') |
| |
| progress(0.3, desc="Veri analiz ediliyor...") |
| |
| |
| num_rows, num_cols = df.shape |
| column_info = "\n".join([f"- {col} ({df[col].dtype})" for col in df.columns]) |
| |
| |
| missing_values_info = df.isnull().sum() |
| missing_values_report = "Eksik Değerler:\n" + missing_values_info[missing_values_info > 0].to_string() |
| if missing_values_info.sum() == 0: |
| missing_values_report = "Eksik değer bulunamadı." |
| |
| progress(0.5, desc="Sütunlar analiz ediliyor...") |
| |
| |
| column_explanations = generate_column_explanations(df) |
| |
| progress(0.7, desc="Grafikler oluşturuluyor...") |
| |
| |
| correlation_plot_figure = create_correlation_plot(df) |
| |
| |
| feature_importance_fig = create_empty_plot() |
| |
| progress(0.9, desc="İstatistikler hesaplanıyor...") |
| |
| |
| numeric_df = df.select_dtypes(include=[np.number]) |
| basic_stats = "" |
| if not numeric_df.empty: |
| basic_stats = "Temel İstatistikler:\n" + numeric_df.describe().to_string() |
| |
| |
| outlier_info = detect_outliers(df) |
| |
| summary_text = ( |
| f"## ✅ Veri Seti Başarıyla Yüklendi!\n\n" |
| f"- **Satır Sayısı:** {num_rows:,}\n" |
| f"- **Sütun Sayısı:** {num_cols}\n" |
| f"- **Dosya Boyutu:** {file_size / 1024:.2f} KB\n\n" |
| f"### 📋 Sütun Bilgileri:\n```\n{column_info}\n```\n\n" |
| f"### ⚠️ Eksik Değer Raporu:\n```\n{missing_values_report}\n```\n\n" |
| f"### 🔍 Aykırı Değer Tespiti:\n```\n{outlier_info}\n```\n\n" |
| f"### 📊 Temel İstatistikler (Sayısal Sütunlar):\n```\n{basic_stats}\n```\n\n" |
| f"### 👀 İlk 5 Satır:\n```\n{df.head().to_string(max_rows=5, max_cols=10)}\n```" |
| ) |
| |
| progress(1.0, desc="Tamamlandı!") |
| |
| return (summary_text, correlation_plot_figure, feature_importance_fig, column_explanations, |
| "", "", [str(col) for col in df.columns], df, None, None, None, None) |
| |
| except Exception as e: |
| fig, ax = plt.subplots(figsize=(1,1)) |
| fig.patch.set_visible(False) |
| ax.axis('off') |
| plt.close(fig) |
| return f"❌ Dosya işlenirken hata oluştu: {str(e)}", fig, fig, "", "", "", [], None, None, None, None, None |
|
|
| def detect_outliers(df): |
| """Detect outliers using IQR method""" |
| numeric_df = df.select_dtypes(include=[np.number]) |
| outlier_report = [] |
| |
| for col in numeric_df.columns: |
| Q1 = numeric_df[col].quantile(0.25) |
| Q3 = numeric_df[col].quantile(0.75) |
| IQR = Q3 - Q1 |
| lower_bound = Q1 - 1.5 * IQR |
| upper_bound = Q3 + 1.5 * IQR |
| |
| outliers = numeric_df[(numeric_df[col] < lower_bound) | (numeric_df[col] > upper_bound)][col] |
| |
| if len(outliers) > 0: |
| outlier_report.append(f"{col}: {len(outliers)} aykırı değer tespit edildi ({len(outliers)/len(df)*100:.2f}%)") |
| |
| if not outlier_report: |
| return "Aykırı değer tespit edilmedi." |
| |
| return "\n".join(outlier_report) |
|
|
| def generate_column_explanations(df): |
| """Generate automatic explanations for each column""" |
| explanations = [] |
| |
| for col in df.columns: |
| col_data = df[col] |
| dtype = col_data.dtype |
| |
| if pd.api.types.is_numeric_dtype(col_data): |
| |
| unique_count = col_data.nunique() |
| null_count = col_data.isnull().sum() |
| mean_val = col_data.mean() |
| std_val = col_data.std() |
| min_val = col_data.min() |
| max_val = col_data.max() |
| |
| explanation = f"**{col}** (Sayısal):\n" |
| explanation += f"- Benzersiz değerler: {unique_count}\n" |
| explanation += f"- Eksik değerler: {null_count} ({null_count/len(df)*100:.2f}%)\n" |
| explanation += f"- Ortalama: {mean_val:.2f}\n" |
| explanation += f"- Standart sapma: {std_val:.2f}\n" |
| explanation += f"- Min: {min_val:.2f}, Max: {max_val:.2f}\n" |
| |
| if unique_count < 10: |
| explanation += f"- Olası kategorik değerler: {sorted(col_data.unique())}\n" |
| |
| else: |
| |
| unique_count = col_data.nunique() |
| null_count = col_data.isnull().sum() |
| most_common = col_data.value_counts().head(3) |
| |
| explanation = f"**{col}** (Kategorik):\n" |
| explanation += f"- Benzersiz değerler: {unique_count}\n" |
| explanation += f"- Eksik değerler: {null_count} ({null_count/len(df)*100:.2f}%)\n" |
| explanation += f"- En yaygın değerler:\n" |
| for val, count in most_common.items(): |
| explanation += f" * {val}: {count} ({count/len(df)*100:.2f}%)\n" |
| |
| explanations.append(explanation) |
| |
| return "\n\n".join(explanations) |
|
|
| def create_correlation_plot(df): |
| """Create correlation matrix plot""" |
| numeric_df = df.select_dtypes(include=[np.number]) |
| |
| if numeric_df.empty or len(numeric_df.columns) < 2: |
| return create_empty_plot() |
| |
| fig, ax = plt.subplots(figsize=(12, 10)) |
| corr_matrix = numeric_df.corr() |
| sns.heatmap(corr_matrix, annot=True, cmap='coolwarm', fmt=".2f", ax=ax, |
| cbar_kws={'label': 'Korelasyon Katsayısı'}) |
| ax.set_title("Sayısal Sütunların Korelasyon Matrisi", fontsize=16, fontweight='bold') |
| plt.tight_layout() |
| return fig |
|
|
| def create_empty_plot(): |
| """Create empty plot""" |
| fig, ax = plt.subplots(figsize=(1,1)) |
| fig.patch.set_visible(False) |
| ax.axis('off') |
| plt.close(fig) |
| return fig |
|
|
| def run_ml_analysis(df_state, target_column, missing_strategy, scale_features, use_cv, n_cv_folds, progress=gr.Progress()): |
| """Run comprehensive machine learning analysis""" |
| if df_state is None: |
| return "❌ Lütfen önce bir CSV dosyası yükleyin.", "", None, None, None, None |
| |
| if not target_column: |
| return "❌ Lütfen bir hedef değişken seçin.", "", None, None, None, None |
| |
| if target_column not in df_state.columns: |
| return f"❌ Hata: '{target_column}' sütunu veri setinde bulunamadı.", "", None, None, None, None |
| |
| try: |
| progress(0.1, desc="Veri hazırlanıyor...") |
| df = df_state.copy() |
| |
| |
| if df[target_column].isnull().any(): |
| initial_rows = len(df) |
| df.dropna(subset=[target_column], inplace=True) |
| rows_after_drop = len(df) |
| |
| if rows_after_drop == 0: |
| return ("❌ Hata: Hedef değişkendeki eksik değerler nedeniyle tüm satırlar silindi.", |
| "", None, None, None, None) |
| |
| |
| X = df.drop(columns=[target_column]) |
| y = df[target_column] |
| |
| progress(0.2, desc="Kategorik değişkenler işleniyor...") |
| |
| |
| categorical_columns = X.select_dtypes(include=['object']).columns |
| label_encoders = {} |
| for col in categorical_columns: |
| if X[col].isnull().any(): |
| X[col] = X[col].fillna('Missing') |
| le = LabelEncoder() |
| X[col] = le.fit_transform(X[col].astype(str)) |
| label_encoders[col] = le |
| |
| |
| numeric_feature_cols = X.select_dtypes(include=[np.number]).columns |
| if not numeric_feature_cols.empty and X[numeric_feature_cols].isnull().any().any(): |
| if missing_strategy == "Ortalama": |
| imputer = SimpleImputer(strategy='mean') |
| elif missing_strategy == "Medyan": |
| imputer = SimpleImputer(strategy='median') |
| else: |
| imputer = SimpleImputer(strategy='most_frequent') |
| |
| X[numeric_feature_cols] = imputer.fit_transform(X[numeric_feature_cols]) |
| |
| if X.empty or len(y) == 0: |
| return ("❌ Hata: Ön işleme sonrası veri kalmadı.", "", None, None, None, None) |
|
|
| if len(y) < 2: |
| return ("❌ Hata: ML analizi için yeterli örnek yok.", "", None, None, None, None) |
| |
| progress(0.3, desc="Problem tipi belirleniyor...") |
| |
| |
| if y.dtype == 'object' or (pd.api.types.is_numeric_dtype(y) and y.nunique() < 20): |
| problem_type = 'classification' |
| le_y = LabelEncoder() |
| y = le_y.fit_transform(y.astype(str)) |
| else: |
| problem_type = 'regression' |
| |
| |
| if scale_features: |
| progress(0.4, desc="Özellikler ölçeklendiriliyor...") |
| scaler = StandardScaler() |
| X = pd.DataFrame(scaler.fit_transform(X), columns=X.columns) |
| |
| progress(0.5, desc="Veri bölünüyor...") |
| |
| |
| X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) |
| |
| results_text = "" |
| feature_importance_data = None |
| predictions_plot = None |
| confusion_matrix_plot = None |
| cv_results_text = "" |
| |
| if problem_type == 'regression': |
| progress(0.6, desc="Regresyon modelleri eğitiliyor...") |
| |
| |
| lr_model = LinearRegression() |
| lr_model.fit(X_train, y_train) |
| lr_pred = lr_model.predict(X_test) |
| lr_r2 = r2_score(y_test, lr_pred) |
| lr_mae = mean_absolute_error(y_test, lr_pred) |
| lr_rmse = np.sqrt(mean_squared_error(y_test, lr_pred)) |
| |
| |
| rf_model = RandomForestRegressor(n_estimators=100, random_state=42, n_jobs=-1) |
| rf_model.fit(X_train, y_train) |
| rf_pred = rf_model.predict(X_test) |
| rf_r2 = r2_score(y_test, rf_pred) |
| rf_mae = mean_absolute_error(y_test, rf_pred) |
| rf_rmse = np.sqrt(mean_squared_error(y_test, rf_pred)) |
| |
| |
| gb_model = GradientBoostingRegressor(n_estimators=100, random_state=42) |
| gb_model.fit(X_train, y_train) |
| gb_pred = gb_model.predict(X_test) |
| gb_r2 = r2_score(y_test, gb_pred) |
| gb_mae = mean_absolute_error(y_test, gb_pred) |
| gb_rmse = np.sqrt(mean_squared_error(y_test, gb_pred)) |
| |
| progress(0.8, desc="Sonuçlar hazırlanıyor...") |
| |
| |
| feature_importance_data = pd.DataFrame({ |
| 'feature': X.columns, |
| 'importance': rf_model.feature_importances_ |
| }).sort_values('importance', ascending=False) |
| |
| |
| if use_cv: |
| progress(0.85, desc="Cross-validation yapılıyor...") |
| rf_cv_scores = cross_val_score(rf_model, X, y, cv=n_cv_folds, scoring='r2') |
| cv_results_text = f"\n\n🔄 Cross-Validation Sonuçları (Random Forest, {n_cv_folds}-Fold):\n" |
| cv_results_text += f"- Ortalama R² Skoru: {rf_cv_scores.mean():.4f} (±{rf_cv_scores.std():.4f})\n" |
| cv_results_text += f"- Min: {rf_cv_scores.min():.4f}, Max: {rf_cv_scores.max():.4f}" |
| |
| results_text = f"""📊 **Makine Öğrenimi Analiz Sonuçları (Regresyon)** |
| |
| 🔹 **Doğrusal Regresyon:** |
| - R² Skoru: {lr_r2:.4f} |
| - MAE: {lr_mae:.4f} |
| - RMSE: {lr_rmse:.4f} |
| |
| 🔹 **Rastgele Orman:** |
| - R² Skoru: {rf_r2:.4f} |
| - MAE: {rf_mae:.4f} |
| - RMSE: {rf_rmse:.4f} |
| |
| 🔹 **Gradient Boosting:** |
| - R² Skoru: {gb_r2:.4f} |
| - MAE: {gb_mae:.4f} |
| - RMSE: {gb_rmse:.4f} |
| |
| 🏆 **En İyi Model:** {"Gradient Boosting" if gb_r2 == max(lr_r2, rf_r2, gb_r2) else "Rastgele Orman" if rf_r2 == max(lr_r2, rf_r2, gb_r2) else "Doğrusal Regresyon"} |
| |
| 📈 **Özellik Önemi (İlk 10):** |
| {feature_importance_data.head(10).to_string(index=False)} |
| |
| {cv_results_text}""" |
| |
| |
| predictions_plot = plot_predictions(y_test, rf_pred, "Rastgele Orman") |
| |
| |
| best_model = rf_model if rf_r2 >= max(lr_r2, gb_r2) else (gb_model if gb_r2 >= lr_r2 else lr_model) |
| model_path = "saved_model.pkl" |
| joblib.dump(best_model, model_path) |
| |
| else: |
| progress(0.6, desc="Sınıflandırma modelleri eğitiliyor...") |
| |
| |
| lr_model = LogisticRegression(random_state=42, max_iter=1000, n_jobs=-1) |
| lr_model.fit(X_train, y_train) |
| lr_pred = lr_model.predict(X_test) |
| lr_accuracy = accuracy_score(y_test, lr_pred) |
| |
| |
| rf_model = RandomForestClassifier(n_estimators=100, random_state=42, n_jobs=-1) |
| rf_model.fit(X_train, y_train) |
| rf_pred = rf_model.predict(X_test) |
| rf_accuracy = accuracy_score(y_test, rf_pred) |
| |
| |
| gb_model = GradientBoostingClassifier(n_estimators=100, random_state=42) |
| gb_model.fit(X_train, y_train) |
| gb_pred = gb_model.predict(X_test) |
| gb_accuracy = accuracy_score(y_test, gb_pred) |
| |
| progress(0.8, desc="Sonuçlar hazırlanıyor...") |
| |
| |
| feature_importance_data = pd.DataFrame({ |
| 'feature': X.columns, |
| 'importance': rf_model.feature_importances_ |
| }).sort_values('importance', ascending=False) |
| |
| |
| confusion_matrix_plot = plot_confusion_matrix(y_test, rf_pred, le_y.classes_) |
| |
| |
| if use_cv: |
| progress(0.85, desc="Cross-validation yapılıyor...") |
| rf_cv_scores = cross_val_score(rf_model, X, y, cv=n_cv_folds, scoring='accuracy') |
| cv_results_text = f"\n\n🔄 Cross-Validation Sonuçları (Random Forest, {n_cv_folds}-Fold):\n" |
| cv_results_text += f"- Ortalama Doğruluk: {rf_cv_scores.mean():.4f} (±{rf_cv_scores.std():.4f})\n" |
| cv_results_text += f"- Min: {rf_cv_scores.min():.4f}, Max: {rf_cv_scores.max():.4f}" |
| |
| results_text = f"""📊 **Makine Öğrenimi Analiz Sonuçları (Sınıflandırma)** |
| |
| 🔹 **Lojistik Regresyon:** |
| - Doğruluk: {lr_accuracy:.4f} |
| |
| 🔹 **Rastgele Orman:** |
| - Doğruluk: {rf_accuracy:.4f} |
| |
| 🔹 **Gradient Boosting:** |
| - Doğruluk: {gb_accuracy:.4f} |
| |
| 🏆 **En İyi Model:** {"Gradient Boosting" if gb_accuracy == max(lr_accuracy, rf_accuracy, gb_accuracy) else "Rastgele Orman" if rf_accuracy == max(lr_accuracy, rf_accuracy, gb_accuracy) else "Lojistik Regresyon"} |
| |
| 📋 **Sınıflandırma Raporu (Rastgele Orman):** |
| {classification_report(y_test, rf_pred, target_names=le_y.classes_)} |
| |
| 📈 **Özellik Önemi (İlk 10):** |
| {feature_importance_data.head(10).to_string(index=False)} |
| |
| {cv_results_text}""" |
| |
| |
| best_model = rf_model if rf_accuracy >= max(lr_accuracy, gb_accuracy) else (gb_model if gb_accuracy >= lr_accuracy else lr_model) |
| model_path = "saved_model.pkl" |
| joblib.dump(best_model, model_path) |
| |
| |
| model_summary = f"""🔧 **Model Bilgileri:** |
| |
| - Problem Tipi: {problem_type.title()} |
| - Kullanılan Özellikler: {len(X.columns)} |
| - Eğitim Örnekleri: {len(X_train):,} |
| - Test Örnekleri: {len(X_test):,} |
| - Özellik Ölçeklendirme: {'Evet' if scale_features else 'Hayır'} |
| - Eksik Değer Stratejisi: {missing_strategy} |
| - Model Kaydedildi: saved_model.pkl""" |
| |
| |
| feature_importance_fig = plot_feature_importance(feature_importance_data) |
| |
| progress(1.0, desc="Tamamlandı!") |
| |
| return (results_text, model_summary, feature_importance_fig, |
| predictions_plot if problem_type == 'regression' else confusion_matrix_plot, |
| model_path, feature_importance_data) |
| |
| except Exception as e: |
| return f"❌ ML analizi sırasında hata oluştu: {str(e)}", f"❌ Hata: {str(e)}", None, None, None, None |
|
|
| def plot_feature_importance(feature_importance_data): |
| """Plot feature importance""" |
| if feature_importance_data is None or feature_importance_data.empty: |
| return create_empty_plot() |
| |
| fig, ax = plt.subplots(figsize=(10, 8)) |
| top_features = feature_importance_data.head(15) |
| ax.barh(top_features['feature'], top_features['importance'], color='steelblue') |
| ax.set_xlabel('Önem Skoru', fontsize=12) |
| ax.set_ylabel('Özellik', fontsize=12) |
| ax.set_title('En Önemli 15 Özellik', fontsize=14, fontweight='bold') |
| ax.invert_yaxis() |
| plt.tight_layout() |
| return fig |
|
|
| def plot_predictions(y_test, y_pred, model_name): |
| """Plot actual vs predicted values""" |
| fig, ax = plt.subplots(figsize=(10, 8)) |
| ax.scatter(y_test, y_pred, alpha=0.6, edgecolors='k', s=50) |
| |
| |
| min_val = min(y_test.min(), y_pred.min()) |
| max_val = max(y_test.max(), y_pred.max()) |
| ax.plot([min_val, max_val], [min_val, max_val], 'r--', lw=2, label='Mükemmel Tahmin') |
| |
| ax.set_xlabel('Gerçek Değerler', fontsize=12) |
| ax.set_ylabel('Tahmin Edilen Değerler', fontsize=12) |
| ax.set_title(f'Gerçek vs Tahmin Edilen Değerler ({model_name})', fontsize=14, fontweight='bold') |
| ax.legend() |
| ax.grid(True, alpha=0.3) |
| plt.tight_layout() |
| return fig |
|
|
| def plot_confusion_matrix(y_test, y_pred, class_names): |
| """Plot confusion matrix""" |
| cm = confusion_matrix(y_test, y_pred) |
| |
| fig, ax = plt.subplots(figsize=(10, 8)) |
| sns.heatmap(cm, annot=True, fmt='d', cmap='Blues', xticklabels=class_names, |
| yticklabels=class_names, ax=ax, cbar_kws={'label': 'Sayı'}) |
| ax.set_xlabel('Tahmin Edilen Sınıf', fontsize=12) |
| ax.set_ylabel('Gerçek Sınıf', fontsize=12) |
| ax.set_title('Confusion Matrix (Rastgele Orman)', fontsize=14, fontweight='bold') |
| plt.tight_layout() |
| return fig |
|
|
| def download_model_file(model_path): |
| """Return model file for download""" |
| if model_path and os.path.exists(model_path): |
| return model_path |
| return None |
|
|
| def export_results_to_csv(feature_importance_data): |
| """Export feature importance to CSV""" |
| if feature_importance_data is not None: |
| output_path = "feature_importance.csv" |
| feature_importance_data.to_csv(output_path, index=False) |
| return output_path |
| return None |
|
|
| |
| def create_interface(): |
| with gr.Blocks(title="🤖 Gelişmiş Veri Analizi Sistemi", theme=gr.themes.Soft()) as demo: |
| |
| auth_state = gr.State(value=False) |
| |
| |
| df_state = gr.State(value=None) |
| saved_model_path_state = gr.State(value=None) |
| feature_importance_state = gr.State(value=None) |
| |
| |
| with gr.Column(visible=True) as login_page: |
| gr.Markdown( |
| """ |
| # 🔐 Giriş Yap |
| |
| Sisteme erişmek için lütfen giriş yapın. |
| """ |
| ) |
| |
| with gr.Row(): |
| with gr.Column(scale=1): |
| pass |
| with gr.Column(scale=1): |
| login_username = gr.Textbox( |
| label="Kullanıcı Adı", |
| placeholder="Kullanıcı adınızı girin", |
| elem_id="login_username" |
| ) |
| login_password = gr.Textbox( |
| label="Şifre", |
| type="password", |
| placeholder="Şifrenizi girin", |
| elem_id="login_password" |
| ) |
| login_status = gr.Markdown("") |
| |
| with gr.Row(): |
| login_button = gr.Button("🚀 Giriş Yap", variant="primary", size="lg", scale=2) |
| register_page_button = gr.Button("📝 Kayıt Ol", variant="secondary", size="lg", scale=1) |
| |
| gr.Markdown("---") |
| gr.Markdown("**💡 Varsayılan Giriş:** `admin` / `admin123`") |
| with gr.Column(scale=1): |
| pass |
| |
| |
| with gr.Column(visible=False) as register_page: |
| gr.Markdown( |
| """ |
| # ✍️ Yeni Hesap Oluştur |
| |
| Sisteme kayıt olmak için bilgilerinizi girin. |
| """ |
| ) |
| |
| with gr.Row(): |
| with gr.Column(scale=1): |
| pass |
| with gr.Column(scale=1): |
| register_username = gr.Textbox( |
| label="Kullanıcı Adı", |
| placeholder="Yeni kullanıcı adı seçin" |
| ) |
| register_password = gr.Textbox( |
| label="Şifre", |
| type="password", |
| placeholder="Şifre (min 6 karakter)" |
| ) |
| register_confirm_password = gr.Textbox( |
| label="Şifre Tekrar", |
| type="password", |
| placeholder="Şifreyi tekrar girin" |
| ) |
| register_status = gr.Markdown("") |
| |
| with gr.Row(): |
| register_button = gr.Button("✅ Kayıt Ol", variant="primary", size="lg", scale=2) |
| back_to_login_button = gr.Button("◀️ Geri Dön", variant="secondary", size="lg", scale=1) |
| with gr.Column(scale=1): |
| pass |
| |
| |
| with gr.Column(visible=False) as analysis_page: |
| gr.Markdown("# 📊 Veri Analizi Sistemi") |
| |
| with gr.Row(): |
| with gr.Column(scale=1): |
| gr.Markdown("### 📂 Veri Seti Yükleme") |
| file_input = gr.File(label="CSV Dosyası Yükle (Max 100MB)", file_types=[".csv"]) |
| run_button = gr.Button("🚀 Analizi Başlat", variant="primary", size="lg") |
| |
| gr.Markdown("---") |
| gr.Markdown("### 🤖 Makine Öğrenimi Ayarları") |
| |
| target_column_dropdown = gr.Dropdown( |
| label="🎯 Hedef Değişkeni Seç", |
| choices=[], |
| interactive=True, |
| info="Tahmin edilecek sütunu seçin" |
| ) |
| |
| with gr.Accordion("⚙️ Gelişmiş Ayarlar", open=False): |
| missing_strategy = gr.Radio( |
| label="Eksik Değer Stratejisi", |
| choices=["Ortalama", "Medyan", "Mod"], |
| value="Ortalama", |
| info="Eksik değerleri nasıl doldurmak istersiniz?" |
| ) |
| |
| scale_features = gr.Checkbox( |
| label="Özellik Ölçeklendirme (StandardScaler)", |
| value=True, |
| info="Özellikleri normalize et" |
| ) |
| |
| use_cv = gr.Checkbox( |
| label="Cross-Validation Kullan", |
| value=True, |
| info="Model performansını daha iyi değerlendirmek için" |
| ) |
| |
| n_cv_folds = gr.Slider( |
| label="CV Fold Sayısı", |
| minimum=3, |
| maximum=10, |
| value=5, |
| step=1, |
| info="Cross-validation için fold sayısı" |
| ) |
| |
| run_ml_button = gr.Button("🎯 ML Analizi Çalıştır", variant="secondary", size="lg") |
| |
| gr.Markdown("---") |
| gr.Markdown("### 💾 İndirme Seçenekleri") |
| download_model_button = gr.Button("📦 Modeli İndir (.pkl)", size="sm") |
| model_download_file = gr.File(label="Model Dosyası", visible=False) |
| |
| download_feature_importance_button = gr.Button("📊 Özellik Önemini İndir (.csv)", size="sm") |
| feature_importance_download_file = gr.File(label="Özellik Önemi CSV", visible=False) |
| |
| with gr.Column(scale=2): |
| gr.Markdown("### 📈 Analiz Sonuçları") |
| |
| with gr.Tabs(): |
| with gr.TabItem("📋 Veri Seti Genel Bakış"): |
| output_text = gr.Markdown(label="Analiz Sonuçları") |
| |
| with gr.TabItem("🔍 Sütun Açıklamaları"): |
| column_explanations_output = gr.Textbox( |
| label="Sütun Detaylı Açıklamaları", |
| lines=20, |
| interactive=False, |
| show_copy_button=True |
| ) |
| |
| with gr.TabItem("🌡️ Korelasyon Matrisi"): |
| correlation_plot_output = gr.Plot(label="Sayısal Sütunların Korelasyon Matrisi") |
| |
| with gr.TabItem("🎯 ML Sonuçları"): |
| ml_results_output = gr.Textbox( |
| label="Makine Öğrenimi Modeli Sonuçları", |
| lines=25, |
| interactive=False, |
| show_copy_button=True |
| ) |
| ml_model_summary = gr.Textbox( |
| label="Model Özeti", |
| lines=10, |
| interactive=False, |
| show_copy_button=True |
| ) |
| |
| with gr.TabItem("📊 Özellik Önemi"): |
| feature_importance_plot = gr.Plot(label="En Önemli Özellikler") |
| |
| with gr.TabItem("📈 Tahmin Grafiği"): |
| predictions_plot = gr.Plot(label="Gerçek vs Tahmin / Confusion Matrix") |
| |
| |
| def show_register_page(): |
| return gr.update(visible=False), gr.update(visible=True), gr.update(visible=False) |
| |
| def show_login_page(): |
| return gr.update(visible=True), gr.update(visible=False), gr.update(visible=False) |
| |
| def show_analysis_page(): |
| return gr.update(visible=False), gr.update(visible=False), gr.update(visible=True) |
| |
| |
| def handle_login(username, password): |
| success, message = authenticate_user(username, password) |
| if success: |
| return ( |
| True, |
| f"✅ {message}", |
| gr.update(visible=False), |
| gr.update(visible=False), |
| gr.update(visible=True) |
| ) |
| else: |
| return ( |
| False, |
| f"❌ {message}", |
| gr.update(visible=True), |
| gr.update(visible=False), |
| gr.update(visible=False) |
| ) |
| |
| def handle_register(username, password, confirm_password): |
| if password != confirm_password: |
| return ( |
| False, |
| "❌ Şifreler eşleşmiyor!", |
| gr.update(visible=False), |
| gr.update(visible=True), |
| gr.update(visible=False) |
| ) |
| |
| success, message = register_user(username, password) |
| if success: |
| return ( |
| True, |
| f"✅ {message} Giriş sayfasına yönlendiriliyorsunuz...", |
| gr.update(visible=True), |
| gr.update(visible=False), |
| gr.update(visible=False) |
| ) |
| else: |
| return ( |
| False, |
| f"❌ {message}", |
| gr.update(visible=False), |
| gr.update(visible=True), |
| gr.update(visible=False) |
| ) |
| |
| |
| register_page_button.click( |
| show_register_page, |
| outputs=[login_page, register_page, analysis_page] |
| ) |
| |
| back_to_login_button.click( |
| show_login_page, |
| outputs=[login_page, register_page, analysis_page] |
| ) |
| |
| |
| login_button.click( |
| handle_login, |
| inputs=[login_username, login_password], |
| outputs=[auth_state, login_status, login_page, register_page, analysis_page] |
| ) |
| |
| register_button.click( |
| handle_register, |
| inputs=[register_username, register_password, register_confirm_password], |
| outputs=[auth_state, register_status, login_page, register_page, analysis_page] |
| ) |
| |
| |
| def update_dropdown_choices(df_state): |
| """Update dropdown choices when new data is loaded""" |
| if df_state is not None: |
| valid_columns = [str(col) for col in df_state.columns if str(col).strip()] |
| return gr.update(choices=valid_columns, value=None) |
| return gr.update(choices=[], value=None) |
| |
| |
| run_button.click( |
| analyze_data, |
| inputs=file_input, |
| outputs=[ |
| output_text, |
| correlation_plot_output, |
| feature_importance_plot, |
| column_explanations_output, |
| ml_results_output, |
| ml_model_summary, |
| target_column_dropdown, |
| df_state, |
| saved_model_path_state, |
| predictions_plot, |
| model_download_file, |
| feature_importance_download_file |
| ] |
| ) |
| |
| |
| df_state.change( |
| update_dropdown_choices, |
| inputs=df_state, |
| outputs=target_column_dropdown |
| ) |
| |
| |
| run_ml_button.click( |
| run_ml_analysis, |
| inputs=[ |
| df_state, |
| target_column_dropdown, |
| missing_strategy, |
| scale_features, |
| use_cv, |
| n_cv_folds |
| ], |
| outputs=[ |
| ml_results_output, |
| ml_model_summary, |
| feature_importance_plot, |
| predictions_plot, |
| saved_model_path_state, |
| feature_importance_state |
| ] |
| ) |
| |
| |
| download_model_button.click( |
| download_model_file, |
| inputs=saved_model_path_state, |
| outputs=model_download_file |
| ) |
| |
| |
| download_feature_importance_button.click( |
| export_results_to_csv, |
| inputs=feature_importance_state, |
| outputs=feature_importance_download_file |
| ) |
| |
| return demo |
|
|
| if __name__ == "__main__": |
| demo = create_interface() |
| demo.launch( |
| share=False, |
| server_name="0.0.0.0", |
| |
| show_error=True, |
| quiet=False |
| ) |