aracfiyattahmin / app.py
omerfsahan's picture
Update app.py
12ba1cc verified
Raw
History Blame Contribute Delete
13.9 kB
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()