import pandas as pd import joblib import gradio as gr # --- MODEL VE VERİ YÜKLEME --- # pkl modelini yükle try: pipe = joblib.load('car_price_model.pkl') print("Model 'car_price_model.pkl' başarıyla yüklendi.") except FileNotFoundError: print("HATA: 'car_price_model.pkl' dosyası bulunamadı. Lütfen dosyanın doğru yolda olduğundan emin olun.") pipe = None # Model yüklenemezse None olarak ayarla except Exception as e: print(f"Model yüklenirken bir hata oluştu: {e}") pipe = None # Veri yükle try: df = pd.read_excel('cars.xls') print("Veri 'cars.xls' başarıyla yüklendi.") # Benzersiz değerleri ve NaN olmayanları alıp sıralamak, Gradio dropdown'ları için daha iyi make_options = sorted(df['Make'].dropna().unique().tolist()) cylinder_options = sorted(df['Cylinder'].dropna().unique().tolist()) doors_options = sorted(df['Doors'].dropna().unique().tolist()) except FileNotFoundError: print("HATA: 'cars.xls' dosyası bulunamadı. Lütfen dosyanın doğru yolda olduğundan emin olun.") # Örnek DataFrame veya boş DataFrame oluşturarak uygulamanın çökmesini engelle df = pd.DataFrame({ 'Make': [], 'Model': [], 'Trim': [], 'Type': [], 'Cylinder': [], 'Doors': [] }) make_options = [] cylinder_options = [] doors_options = [] except Exception as e: print(f"Veri yüklenirken bir hata oluştu: {e}") df = pd.DataFrame({ 'Make': [], 'Model': [], 'Trim': [], 'Type': [], 'Cylinder': [], 'Doors': [] }) make_options = [] cylinder_options = [] doors_options = [] def predict_price(make, model, trim, mileage, car_type, cylinder, liter, doors, cruise, sound, leather): if pipe is None: return "

HATA: Model yüklenemedi, tahmin yapılamıyor.

" try: # Kullanıcıdan alınan verileri DataFrame'e dönüştür input_data = pd.DataFrame({ 'Make': [make], 'Model': [model], 'Trim': [trim], 'Mileage': [mileage], 'Type': [car_type], 'Cylinder': [cylinder], 'Liter': [liter], 'Doors': [doors], 'Cruise': [cruise], 'Sound': [sound], 'Leather': [leather] }) prediction = pipe.predict(input_data)[0] # Fiyatı daha belirgin ve vurgulu hale getiren stil return f"
${int(prediction):,}
" except Exception as e: return f"

Tahmin sırasında bir hata oluştu: {e}

" # Dinamik olarak model seçeneklerini güncellemek için fonksiyon def update_models(selected_make): if pd.isna(selected_make) or not selected_make: return gr.Dropdown(choices=[], label="Model", interactive=True, value=None) models = sorted(df[df['Make'] == selected_make]['Model'].dropna().unique().tolist()) return gr.Dropdown(choices=models, label="Model", interactive=True, value=None if not models else models[0]) # Dinamik olarak donanım (trim) seçeneklerini güncellemek için fonksiyon def update_trims(selected_make, selected_model): if pd.isna(selected_make) or not selected_make or pd.isna(selected_model) or not selected_model: return gr.Dropdown(choices=[], label="Donanım (Trim)", interactive=True, value=None) trims = sorted(df[(df['Make'] == selected_make) & (df['Model'] == selected_model)]['Trim'].dropna().unique().tolist()) return gr.Dropdown(choices=trims, label="Donanım (Trim)", interactive=True, value=None if not trims else trims[0]) # Dinamik olarak araç tipi seçeneklerini güncellemek için fonksiyon def update_types(selected_make, selected_model, selected_trim): if pd.isna(selected_make) or not selected_make or \ pd.isna(selected_model) or not selected_model or \ pd.isna(selected_trim) or not selected_trim: return gr.Dropdown(choices=[], label="Araç Tipi", interactive=True, value=None) types = sorted(df[(df['Make'] == selected_make) & (df['Model'] == selected_model) & (df['Trim'] == selected_trim)]['Type'].dropna().unique().tolist()) return gr.Dropdown(choices=types, label="Araç Tipi", interactive=True, value=None if not types else types[0]) # --- GRADIO ARAYÜZÜ --- with gr.Blocks(theme=gr.themes.Monochrome(), css=""" /* Import Google Font - Poppins */ @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap'); @import url('https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.4/css/all.min.css'); body { font-family: 'Poppins', sans-serif; background-color: var(--background-fill-primary); /* Gradio theme background */ color: var(--text-color-body); display: flex; justify-content: center; align-items: center; min-height: 100vh; margin: 0; } .gradio-container { max-width: 1000px; /* Daha kompakt */ width: 95%; /* Genişliği ayarla */ margin: 30px auto; padding: 30px; background-color: var(--background-fill-secondary); /* Kartlar için farklı arka plan */ border-radius: 18px; box-shadow: var(--shadow-xl); transition: all 0.3s ease; } h1 { color: var(--text-color-body); font-size: 2.8em; margin-bottom: 10px; font-weight: 700; text-align: center; letter-spacing: -0.8px; } p { color: var(--text-color-subdued); font-size: 1em; line-height: 1.6; text-align: center; margin-bottom: 30px; } .gr-tab-item { font-weight: 600; font-size: 1.1em; } .gr-group { border-radius: var(--radius-xl); box-shadow: var(--shadow-sm); padding: 25px; margin-bottom: 20px; border: 1px solid var(--border-color-primary); transition: all 0.2s ease-in-out; } .gr-group:hover { transform: translateY(-3px); box-shadow: var(--shadow-md); } .gr-button { background-color: #1a73e8; /* Google Blue benzeri */ color: white; font-weight: 600; border-radius: 12px; font-size: 1.1em; padding: 14px 30px; border: none; box-shadow: 0 4px 15px rgba(26, 115, 232, 0.4); /* Mavi gölge */ transition: all 0.3s ease; cursor: pointer; margin-top: 25px; /* Üstünde boşluk */ width: 100%; /* Tam genişlik */ } .gr-button:hover { background-color: #155bb5; /* Koyu mavi */ box-shadow: 0 6px 20px rgba(26, 115, 232, 0.5); transform: translateY(-2px); } .gr-dropdown, .gr-number, .gr-radio { margin-bottom: 15px; /* Alt boşluk ekle */ } .gr-radio { padding: 5px 0; } .gr-radio label { font-weight: normal; /* Radyo düğmesi metni normal ağırlıkta */ } .output-area { text-align: center; padding: 30px; background-color: var(--color-blue-50); /* Tema mavisine uygun açık renk */ border-radius: var(--radius-xl); border: 2px dashed var(--color-blue-200); margin-top: 30px; min-height: 120px; /* Alanın küçülmemesi için minimum yükseklik */ display: flex; flex-direction: column; justify-content: center; align-items: center; } .output-area p { margin: 0; color: var(--text-color-body); font-size: 1.1em; } @keyframes fadeIn { from { opacity: 0; transform: translateY(10px); } to { opacity: 1; transform: translateY(0); } } .info-section { margin-top: 40px; padding-top: 20px; border-top: 1px solid var(--border-color-secondary); text-align: center; color: var(--text-color-subdued); font-size: 0.9em; } /* Responsive adjustments */ @media (max-width: 768px) { .gradio-container { padding: 20px; margin: 20px auto; } h1 { font-size: 2.2em; } p { font-size: 0.9em; } .gr-tab-item { font-size: 1em; } .gr-group { padding: 15px; margin-bottom: 15px; } .gr-button { padding: 12px 20px; font-size: 1em; } .output-area { padding: 20px; } .output-area div { /* Tahmini fiyat div'i */ font-size: 2em !important; } .info-section { margin-top: 30px; } } @media (max-width: 480px) { h1 { font-size: 1.8em; } .output-area div { font-size: 1.8em !important; } } """) as demo: gr.Markdown( """

**Akıllı Araç Fiyat Tahmin Uygulaması**

Aracınızın bilgilerini girerek piyasa değerini anında öğrenin. Doğru ve hızlı sonuçlar için tüm alanları eksiksiz doldurunuz.

""" ) # Bileşenleri tanımla make_dd = gr.Dropdown(choices=make_options, label="Marka", interactive=True) model_dd = gr.Dropdown(choices=[], label="Model", interactive=True) trim_dd = gr.Dropdown(choices=[], label="Donanım (Trim)", interactive=True) type_dd = gr.Dropdown(choices=[], label="Araç Tipi", interactive=True) mileage_num = gr.Number(label="Kilometre", minimum=200, maximum=600000, step=1000, value=50000, info="Aracın toplam kat ettiği mesafe.") cylinder_dd = gr.Dropdown(choices=cylinder_options, label="Silindir", interactive=True) liter_num = gr.Number(label="Motor Hacmi (Litre)", minimum=0.8, maximum=8.0, step=0.1, value=2.0, info="Motorun litre cinsinden hacmi.") doors_dd = gr.Dropdown(choices=doors_options, label="Kapı Sayısı", interactive=True) cruise_rb = gr.Radio(choices=[True, False], label="Hız Sabitleme", value=True, info="Araçta hız sabitleme özelliği var mı?") sound_rb = gr.Radio(choices=[True, False], label="Gelişmiş Ses Sistemi", value=True, info="Yüksek kaliteli ses sistemi mevcut mu?") leather_rb = gr.Radio(choices=[True, False], label="Deri Koltuk", value=False, info="Koltuklar deri kaplama mı?") with gr.Tabs(): with gr.TabItem("🚗 Araç Bilgileri"): with gr.Group(): gr.Markdown("

Marka, Model ve Tip Seçimi

") # Bileşenleri burada doğrudan kullanıyoruz, render() çağırmıyoruz make_dd model_dd trim_dd type_dd with gr.TabItem("⚙️ Performans"): with gr.Group(): gr.Markdown("

Motor ve Temel Performans Özellikleri

") mileage_num cylinder_dd liter_num doors_dd with gr.TabItem("✨ Ek Özellikler"): with gr.Group(): gr.Markdown("

Konfor ve Lüks Seçenekleri

") cruise_rb sound_rb leather_rb # Output area and button are outside the tabs for clear visibility predict_button = gr.Button("💰 Fiyatı Hesapla", size="lg", variant="primary") output_text = gr.Markdown( "

Lütfen tüm bilgileri girip 'Fiyatı Hesapla' düğmesine basın.

", elem_classes="output-area" ) # --- Dinamik Dropdown Güncellemeleri --- # Bu kısım tüm bileşenler tanımlandıktan sonra ve bir kez çağrılıyor. make_dd.change(fn=update_models, inputs=make_dd, outputs=model_dd) make_dd.change(fn=lambda: (gr.Dropdown(choices=[], value=None), gr.Dropdown(choices=[], value=None)), outputs=[trim_dd, type_dd]) model_dd.change(fn=update_trims, inputs=[make_dd, model_dd], outputs=trim_dd) model_dd.change(fn=lambda: gr.Dropdown(choices=[], value=None), outputs=type_dd) trim_dd.change(fn=update_types, inputs=[make_dd, model_dd, trim_dd], outputs=type_dd) # --- Buton Tıklama Olayı --- predict_button.click( fn=predict_price, inputs=[make_dd, model_dd, trim_dd, mileage_num, type_dd, cylinder_dd, liter_num, doors_dd, cruise_rb, sound_rb, leather_rb], outputs=output_text ) gr.Markdown("""

💡 Kullanım Notları


🚗 Bu uygulama makine öğrenimi modeli kullanılarak Dr. Murat Altun tarafından geliştirilmiştir.

Sorularınız veya geri bildirimleriniz için iletişime geçebilirsiniz.

""") # --- UYGULAMA BAŞLAT --- if __name__ == '__main__': if pipe is None or df.empty: print("Model veya veri yüklenemediği için Gradio arayüzü başlatılamıyor.") print("Lütfen 'car_price_model.pkl' ve 'cars.xls' dosyalarının varlığını ve doğruluğunu kontrol edin.") else: demo.launch()