Spaces:
Paused
Paused
| 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 "<p style='color:red; font-weight:bold;'>HATA: Model yüklenemedi, tahmin yapılamıyor.</p>" | |
| 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"<div style='font-size: 2.8em; font-weight: 700; color: #1a73e8; animation: fadeIn 1s ease-out; margin-top: 20px;'>${int(prediction):,}</div>" | |
| except Exception as e: | |
| return f"<p style='color:red;'>Tahmin sırasında bir hata oluştu: {e}</p>" | |
| # 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( | |
| """ | |
| <div style='text-align: center; padding-bottom: 20px;'> | |
| <h1><i class='fas fa-car-alt'></i> **Akıllı Araç Fiyat Tahmin Uygulaması**</h1> | |
| <p>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.</p> | |
| </div> | |
| """ | |
| ) | |
| # 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("<h3>Marka, Model ve Tip Seçimi</h3>") | |
| # 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("<h3>Motor ve Temel Performans Özellikleri</h3>") | |
| mileage_num | |
| cylinder_dd | |
| liter_num | |
| doors_dd | |
| with gr.TabItem("✨ Ek Özellikler"): | |
| with gr.Group(): | |
| gr.Markdown("<h3>Konfor ve Lüks Seçenekleri</h3>") | |
| 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( | |
| "<p style='color: var(--text-color-subdued);'>Lütfen tüm bilgileri girip 'Fiyatı Hesapla' düğmesine basın.</p>", | |
| 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(""" | |
| <div class='info-section'> | |
| <h3>💡 Kullanım Notları</h3> | |
| <ul> | |
| <li>Lütfen tüm alanları doğru bir şekilde doldurun.</li> | |
| <li>**Marka** seçimi, **Model** seçeneklerini günceller.</li> | |
| <li>**Model** seçimi, **Donanım (Trim)** seçeneklerini günceller.</li> | |
| <li>**Marka, Model ve Donanım** seçimi, **Araç Tipi** seçeneklerini günceller.</li> | |
| <li>'Hız Sabitleme', 'Gelişmiş Ses Sistemi' ve 'Deri Koltuk' için 'True' (Var) veya 'False' (Yok) seçimi yapınız.</li> | |
| </ul> | |
| <hr style='border-top: 1px dashed var(--border-color-secondary); margin: 20px 0;'> | |
| <p>🚗 Bu uygulama makine öğrenimi modeli kullanılarak Dr. Murat Altun tarafından geliştirilmiştir.</p> | |
| <p>Sorularınız veya geri bildirimleriniz için iletişime geçebilirsiniz.</p> | |
| </div> | |
| """) | |
| # --- 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() | |