Spaces:
Sleeping
Sleeping
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.") | |