Ahmetr's picture
Update app.py
498c23d verified
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.")