File size: 5,213 Bytes
58f634e
 
 
 
 
 
 
 
 
daadaa0
58f634e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1206605
498c23d
1206605
 
 
88b06a9
 
498c23d
 
 
88b06a9
58f634e
1206605
58f634e
9538efb
58f634e
1206605
58f634e
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
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.")