import os import pandas as pd import streamlit as st from sklearn.compose import ColumnTransformer from sklearn.linear_model import LinearRegression from sklearn.metrics import mean_squared_error, r2_score from sklearn.model_selection import train_test_split from sklearn.pipeline import Pipeline from sklearn.preprocessing import OneHotEncoder, StandardScaler # ------------------------------------------------- # SAYFA AYARLARI # ------------------------------------------------- st.set_page_config( page_title="Araç Fiyat Tahmin Sistemi", page_icon="🚗", layout="centered" ) # ------------------------------------------------- # DOSYA YOLU # app.py: /app/src/app.py # cars.xlsx: /app/cars.xlsx # ------------------------------------------------- BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) DATA_PATH = os.path.join(BASE_DIR, "cars.xlsx") # ------------------------------------------------- # VERİYİ YÜKLE # ------------------------------------------------- @st.cache_data def load_data(): data = pd.read_excel(DATA_PATH) required_columns = [ "Price", "Make", "Model", "Trim", "Mileage", "Type", "Cylinder", "Liter", "Doors", "Cruise", "Sound", "Leather" ] missing_columns = [ column for column in required_columns if column not in data.columns ] if missing_columns: raise ValueError( f"cars.xlsx içinde şu sütunlar eksik: {', '.join(missing_columns)}" ) data = data.dropna() return data # ------------------------------------------------- # MODELİ EĞİT # ------------------------------------------------- @st.cache_resource def train_model(data): x = data.drop("Price", axis=1) y = data["Price"] x_train, x_test, y_train, y_test = train_test_split( x, y, test_size=0.20, random_state=42 ) preprocessor = ColumnTransformer( transformers=[ ( "numeric", StandardScaler(), ["Mileage", "Cylinder", "Liter", "Doors"] ), ( "categorical", OneHotEncoder(handle_unknown="ignore"), ["Make", "Model", "Trim", "Type"] ) ], remainder="passthrough" ) pipeline = Pipeline( steps=[ ("preprocessor", preprocessor), ("regressor", LinearRegression()) ] ) pipeline.fit(x_train, y_train) predictions = pipeline.predict(x_test) rmse = mean_squared_error(y_test, predictions) ** 0.5 r2 = r2_score(y_test, predictions) return pipeline, rmse, r2 # ------------------------------------------------- # FİYAT TAHMİNİ # ------------------------------------------------- def predict_price( make, car_model, trim, mileage, car_type, cylinder, liter, doors, cruise, sound, leather ): input_data = pd.DataFrame([{ "Make": make, "Model": car_model, "Trim": trim, "Mileage": mileage, "Type": car_type, "Cylinder": cylinder, "Liter": liter, "Doors": doors, "Cruise": cruise, "Sound": sound, "Leather": leather }]) price = pipeline.predict(input_data)[0] return float(price) # ------------------------------------------------- # VERİ VE MODELİ BAŞLAT # ------------------------------------------------- try: df = load_data() pipeline, rmse, r2 = train_model(df) except FileNotFoundError: st.error("cars.xlsx dosyası ana klasörde bulunamadı.") st.info("Dosya yapısı şu şekilde olmalı: ana klasörde cars.xlsx, src içinde app.py.") st.stop() except Exception as error: st.error(f"Uygulama başlatılırken hata oluştu: {error}") st.stop() # ------------------------------------------------- # TASARIM # ------------------------------------------------- st.markdown(""" """, unsafe_allow_html=True) st.markdown( "