import streamlit as st import pandas as pd from sklearn.preprocessing import MinMaxScaler from sklearn.metrics.pairwise import cosine_similarity # Başlık st.title("Laptop Öneri Sistemi") # Excel dosyasını yükleme uploaded_file = 'numeric_data_with_predictions.xlsx' if uploaded_file: # Excel dosyasını okuma df = pd.read_excel(uploaded_file) # Sütun adlarını temizleme df.columns = df.columns.str.strip() # 'Urun Fiyati' sütununu temizleme def clean_price(value): if isinstance(value, str): value = value.replace('+', '').replace(' TL', '').replace('.', '').replace(',', '.').strip() try: return float(value) except ValueError: return 0 return value df['Urun Fiyati'] = df['Urun Fiyati'].apply(clean_price) # Fiyat aralığı seçimi st.sidebar.header("Fiyat Aralığı Seçimi") min_price = st.sidebar.number_input("Minimum Fiyat", value=float(df['Urun Fiyati'].min()), min_value=0.0, max_value=float(df['Urun Fiyati'].max())) max_price = st.sidebar.number_input("Maksimum Fiyat", value=float(df['Urun Fiyati'].max()), min_value=0.0, max_value=float(df['Urun Fiyati'].max())) # İşlemci tipi seçimi st.sidebar.header("İşlemci Tipi Seçimi") processor_options = df['İşlemci Tipi'].unique() selected_processor = st.sidebar.selectbox("İşlemci Tipi Seçin", options=processor_options) # Seçilen işlemci tipine göre ekran kartı seçeneklerini güncelleme filtered_gpu_options = df[df['İşlemci Tipi'] == selected_processor]['Ekran Kartı'].unique() # Ekran kartı seçimi st.sidebar.header("Ekran Kartı Seçimi") selected_gpu = st.sidebar.selectbox("Ekran Kartı Seçin", options=filtered_gpu_options) # Kullanıcının belirlediği fiyat aralığında ürünleri filtreleme filtered_df = df[(df['Urun Fiyati'] >= min_price) & (df['Urun Fiyati'] <= max_price) & (df['İşlemci Tipi'] == selected_processor) & (df['Ekran Kartı'] == selected_gpu)] # Eğer filtrelenmiş veri boş değilse, benzerlik hesaplayalım if not filtered_df.empty: # Fiyat verilerini normalleştirme scaler = MinMaxScaler() df_scaled = pd.DataFrame(scaler.fit_transform(filtered_df[['Urun Fiyati']]), columns=['Urun Fiyati']) # Kullanıcı verisini normalleştirme (ortalama fiyatı olarak) user_price = (min_price + max_price) / 2 user_data_scaled = scaler.transform([[user_price]]) # Cosine benzerliğini hesaplama similarities = cosine_similarity(df_scaled, user_data_scaled) # Benzerlik skorunu DataFrame'e ekleme ve sıralama filtered_df['Benzerlik'] = similarities.flatten() similar_laptops = filtered_df.sort_values(by='Benzerlik', ascending=False).head(10) # En benzer 10 laptopu göster # Yüksek fiyatlı ve düşük PUAN'lı ürünleri bulma high_price_laptops = similar_laptops.nlargest(5, 'Urun Fiyati') # Eşsiz Ram ve SSD kombinasyonlarını elde etme min_puan_laptops = high_price_laptops.groupby(['Ram (Sistem Belleği)', 'SSD Kapasitesi']).apply(lambda x: x.nsmallest(1, 'PUAN')).reset_index(drop=True) # Sonuçları gösterme st.subheader("Önerilen Laptoplar") st.write("Aşağıda belirtilen fiyat aralığında en benzer laptoplar listelenmiştir:") # DataFrame için stil uygulama def highlight_rows(row): # Min puan laptopların isimlerini bir listeye al min_puan_names = min_puan_laptops['Urun Ismi'].values # Rastgele 3 tane laptop seçme if row['Urun Ismi'] in min_puan_names: return ['background-color: turquoise'] * len(row) # Turkuaz rengi return [''] * len(row) # DataFrame'i gösterme # 1. Verileri oluşturma display_df = similar_laptops[['Urun Ismi', 'Urun Fiyati', 'Tahmin Edilen Fiyat', 'Marka', 'SSD Kapasitesi', 'Ram (Sistem Belleği)', 'PUAN', 'SATICI', 'İşlemci Tipi', 'Ekran Kartı']] # 2. Sayısal sütunları sayıya çevirme for col in ['Urun Fiyati', 'SSD Kapasitesi', 'Ram (Sistem Belleği)', 'PUAN']: display_df[col] = pd.to_numeric(display_df[col], errors='coerce') # 3. Sütunlardaki sayısal değerleri iki ondalık basamağa yuvarlama ve formatlama styled_df = display_df.style.format({ 'Urun Fiyati': "{:.2f}", 'SSD Kapasitesi': "{:.0f}", 'Ram (Sistem Belleği)': "{:.0f}", 'PUAN': "{:.0f}" }) # 4. Eğer en az 10 laptop varsa stil uygulama if len(similar_laptops) >= 10: styled_df = styled_df.apply(highlight_rows, axis=1) # 5. Sonuçları Streamlit'e gönderme st.dataframe(styled_df) else: st.write("Belirtilen fiyat aralığında ürün bulunmamaktadır. Lütfen fiyat aralığını genişletin veya farklı bir arama yapın.") else: st.write("Lütfen bir Excel dosyası yükleyin.")