File size: 2,899 Bytes
8b26a6e 51ca212 8b26a6e b91edb9 51ca212 b91edb9 8b26a6e 51ca212 8b26a6e d7940b9 b91edb9 d7940b9 8b26a6e b91edb9 8b26a6e b91edb9 8b26a6e b91edb9 51ca212 b91edb9 51ca212 8b26a6e b91edb9 51ca212 b91edb9 8b26a6e 51ca212 8b26a6e 51ca212 8b26a6e 51ca212 8b26a6e 51ca212 8b26a6e 51ca212 8b26a6e b91edb9 51ca212 b91edb9 8b26a6e 51ca212 b91edb9 51ca212 | 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 | import streamlit as st
import pandas as pd
import joblib
import plotly.express as px
# -------------------------------
# 1️⃣ Dosyaları yükle
# -------------------------------
DATA_PATH = "spotify_clustered.csv"
MODEL_PATH = "kmeans_music_model.pkl"
SCALER_PATH = "scaler_music.pkl"
@st.cache_data
def load_data():
df = pd.read_csv(DATA_PATH)
unnecessary_cols = ['Unnamed: 0', 'track_id', 'album_name', 'explicit']
df_display = df.drop(columns=[c for c in unnecessary_cols if c in df.columns])
return df, df_display
@st.cache_data
def load_model_scaler():
model = joblib.load(MODEL_PATH)
scaler = joblib.load(SCALER_PATH)
return model, scaler
df, df_display = load_data()
model, scaler = load_model_scaler()
# -------------------------------
# 2️⃣ Sayfa ayarları
# -------------------------------
st.set_page_config(page_title="Spotify Clusters", layout="wide")
st.title("🎵 Spotify Music Clustering / Spotify Müzik Kümeleme")
st.markdown("---")
# -------------------------------
# 3️⃣ Veri önizleme
# -------------------------------
st.subheader("📄 Dataset Preview / Veri Önizleme")
st.dataframe(df_display.head(10), use_container_width=True)
# -------------------------------
# 4️⃣ Titremesiz grafik – Plotly
# -------------------------------
st.subheader("🎯 Feature Analysis / Özellik Analizi")
fig = px.scatter(
df,
x='danceability',
y='energy',
color='cluster',
labels={'danceability': 'Danceability / Dans Edilebilirlik',
'energy': 'Energy / Enerji',
'cluster': 'Cluster / Küme'},
opacity=0.6
)
st.plotly_chart(fig, use_container_width=True)
# -------------------------------
# 5️⃣ Prediction Section / Tahmin
# -------------------------------
st.divider()
st.subheader("🤖 Predict New Song Cluster / Yeni Şarkı Tahmini")
c1, c2, c3 = st.columns(3)
with c1:
pop = st.slider("Popularity", 0, 100, 50)
dur = st.slider("Duration (ms)", 0, 600000, 200000)
dance = st.slider("Danceability", 0.0, 1.0, 0.5)
with c2:
energy = st.slider("Energy", 0.0, 1.0, 0.5)
loud = st.slider("Loudness", -60.0, 0.0, -10.0)
tempo = st.slider("Tempo", 0.0, 250.0, 120.0)
with c3:
speech = st.slider("Speechiness", 0.0, 1.0, 0.1)
if st.button("Predict Cluster"):
new_data = [[pop, dur, dance, energy, loud, tempo, speech]]
new_data_scaled = scaler.transform(new_data)
res = model.predict(new_data_scaled)[0]
st.success(f"Predicted Cluster: {res}")
st.write(df[df['cluster']==res][['track_name','artists']].head(5))
# -------------------------------
# 6️⃣ Cluster means
# -------------------------------
st.divider()
st.subheader("Cluster Characteristics / Küme Ortalamaları")
numeric_only = df.select_dtypes(include=['float64','int64'])
means = numeric_only.groupby(df['cluster']).mean()
st.dataframe(means, use_container_width=True) |