Spaces:
Sleeping
Sleeping
Upload 3 files
Browse files- Trendyol_Products60_Sayfa.xlsx +0 -0
- app.py +113 -0
- requirements.txt +4 -0
Trendyol_Products60_Sayfa.xlsx
ADDED
Binary file (144 kB). View file
|
|
app.py
ADDED
@@ -0,0 +1,113 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import streamlit as st
|
2 |
+
import pandas as pd
|
3 |
+
from sklearn.preprocessing import MinMaxScaler
|
4 |
+
from sklearn.metrics.pairwise import cosine_similarity
|
5 |
+
|
6 |
+
# Başlık
|
7 |
+
st.title("Laptop Öneri Sistemi")
|
8 |
+
|
9 |
+
# Excel dosyasını yükleme
|
10 |
+
uploaded_file = 'C:/Users/AHMET K/Desktop/Proje_Trendyol/Trendyol_Products60_Sayfa.xlsx'
|
11 |
+
|
12 |
+
if uploaded_file:
|
13 |
+
# Excel dosyasını okuma
|
14 |
+
df = pd.read_excel(uploaded_file)
|
15 |
+
|
16 |
+
# Sütun adlarını temizleme
|
17 |
+
df.columns = df.columns.str.strip()
|
18 |
+
|
19 |
+
# 'Urun Fiyati' sütununu temizleme
|
20 |
+
def clean_price(value):
|
21 |
+
if isinstance(value, str):
|
22 |
+
value = value.replace('+', '').replace(' TL', '').replace('.', '').replace(',', '.').strip()
|
23 |
+
try:
|
24 |
+
return float(value)
|
25 |
+
except ValueError:
|
26 |
+
return 0
|
27 |
+
return value
|
28 |
+
|
29 |
+
df['Urun Fiyati'] = df['Urun Fiyati'].apply(clean_price)
|
30 |
+
|
31 |
+
# Fiyat aralığı seçimi
|
32 |
+
st.sidebar.header("Fiyat Aralığı Seçimi")
|
33 |
+
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()))
|
34 |
+
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()))
|
35 |
+
|
36 |
+
# İşlemci tipi seçimi
|
37 |
+
st.sidebar.header("İşlemci Tipi Seçimi")
|
38 |
+
processor_options = df['İşlemci Tipi'].unique()
|
39 |
+
selected_processor = st.sidebar.selectbox("İşlemci Tipi Seçin", options=processor_options)
|
40 |
+
|
41 |
+
# Seçilen işlemci tipine göre ekran kartı seçeneklerini güncelleme
|
42 |
+
filtered_gpu_options = df[df['İşlemci Tipi'] == selected_processor]['Ekran Kartı'].unique()
|
43 |
+
|
44 |
+
# Ekran kartı seçimi
|
45 |
+
st.sidebar.header("Ekran Kartı Seçimi")
|
46 |
+
selected_gpu = st.sidebar.selectbox("Ekran Kartı Seçin", options=filtered_gpu_options)
|
47 |
+
|
48 |
+
# Kullanıcının belirlediği fiyat aralığında ürünleri filtreleme
|
49 |
+
filtered_df = df[(df['Urun Fiyati'] >= min_price) & (df['Urun Fiyati'] <= max_price) &
|
50 |
+
(df['İşlemci Tipi'] == selected_processor) &
|
51 |
+
(df['Ekran Kartı'] == selected_gpu)]
|
52 |
+
|
53 |
+
# Eğer filtrelenmiş veri boş değilse, benzerlik hesaplayalım
|
54 |
+
if not filtered_df.empty:
|
55 |
+
# Fiyat verilerini normalleştirme
|
56 |
+
scaler = MinMaxScaler()
|
57 |
+
df_scaled = pd.DataFrame(scaler.fit_transform(filtered_df[['Urun Fiyati']]), columns=['Urun Fiyati'])
|
58 |
+
|
59 |
+
# Kullanıcı verisini normalleştirme (ortalama fiyatı olarak)
|
60 |
+
user_price = (min_price + max_price) / 2
|
61 |
+
user_data_scaled = scaler.transform([[user_price]])
|
62 |
+
|
63 |
+
# Cosine benzerliğini hesaplama
|
64 |
+
similarities = cosine_similarity(df_scaled, user_data_scaled)
|
65 |
+
|
66 |
+
# Benzerlik skorunu DataFrame'e ekleme ve sıralama
|
67 |
+
filtered_df['Benzerlik'] = similarities.flatten()
|
68 |
+
similar_laptops = filtered_df.sort_values(by='Benzerlik', ascending=False).head(10) # En benzer 10 laptopu göster
|
69 |
+
|
70 |
+
# Yüksek fiyatlı ve düşük PUAN'lı ürünleri bulma
|
71 |
+
high_price_laptops = similar_laptops.nlargest(5, 'Urun Fiyati')
|
72 |
+
|
73 |
+
# Eşsiz Ram ve SSD kombinasyonlarını elde etme
|
74 |
+
min_puan_laptops = high_price_laptops.groupby(['Ram (Sistem Belleği)', 'SSD Kapasitesi']).apply(lambda x: x.nsmallest(1, 'PUAN')).reset_index(drop=True)
|
75 |
+
|
76 |
+
# Sonuçları gösterme
|
77 |
+
st.subheader("Önerilen Laptoplar")
|
78 |
+
st.write("Aşağıda belirtilen fiyat aralığında en benzer laptoplar listelenmiştir:")
|
79 |
+
|
80 |
+
# DataFrame için stil uygulama
|
81 |
+
def highlight_rows(row):
|
82 |
+
# Min puan laptopların isimlerini bir listeye al
|
83 |
+
min_puan_names = min_puan_laptops['Urun Ismi'].values
|
84 |
+
|
85 |
+
# Rastgele 3 tane laptop seçme
|
86 |
+
if row['Urun Ismi'] in min_puan_names:
|
87 |
+
return ['background-color: turquoise'] * len(row) # Turkuaz rengi
|
88 |
+
return [''] * len(row)
|
89 |
+
|
90 |
+
# DataFrame'i gösterme
|
91 |
+
# 1. Verileri oluşturma
|
92 |
+
display_df = similar_laptops[['Urun Ismi', 'Urun Fiyati', 'Tahmin Edilen Fiyat', 'Marka',
|
93 |
+
'SSD Kapasitesi', 'Ram (Sistem Belleği)',
|
94 |
+
'PUAN', 'SATICI', 'İşlemci Tipi', 'Ekran Kartı']]
|
95 |
+
|
96 |
+
# 2. Fiyatları iki ondalık haneli olarak yuvarlama
|
97 |
+
display_df['Urun Fiyati'] = display_df['Urun Fiyati'].round(2)
|
98 |
+
display_df['Tahmin Edilen Fiyat'] = display_df['Tahmin Edilen Fiyat'].round(2)
|
99 |
+
|
100 |
+
# 3. Eğer en az 10 laptop varsa stil uygulama
|
101 |
+
if len(similar_laptops) >= 10:
|
102 |
+
styled_df = display_df.style.apply(highlight_rows, axis=1)
|
103 |
+
else:
|
104 |
+
styled_df = display_df.style # Highlighting won't apply if fewer than 10 laptops
|
105 |
+
|
106 |
+
# 4. Sonuçları Streamlit'e gönderme
|
107 |
+
st.dataframe(styled_df)
|
108 |
+
|
109 |
+
else:
|
110 |
+
st.write("Belirtilen fiyat aralığında ürün bulunmamaktadır. Lütfen fiyat aralığını genişletin veya farklı bir arama yapın.")
|
111 |
+
|
112 |
+
else:
|
113 |
+
st.write("Lütfen bir Excel dosyası yükleyin.")
|
requirements.txt
ADDED
@@ -0,0 +1,4 @@
|
|
|
|
|
|
|
|
|
|
|
1 |
+
streamlit
|
2 |
+
pandas
|
3 |
+
scikit-learn
|
4 |
+
openpyxl
|