Rutson commited on
Commit
5082269
·
verified ·
1 Parent(s): 1e8ae02

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +33 -38
app.py CHANGED
@@ -3,58 +3,53 @@ import pandas as pd
3
  from sklearn.preprocessing import StandardScaler
4
  from sklearn.neighbors import NearestNeighbors
5
 
6
- # Configuração da página
7
  st.set_page_config(page_title="DNA Sonoro", page_icon="🎵")
 
 
8
 
9
- st.title("🎵 DNA Sonoro: Recomendação por Vibe")
10
- st.markdown("Chega de recomendações por marketing. Digite uma música e vamos achar o 'esqueleto' acústico dela.")
11
-
12
- # Base de Dados Exemplo (DNA das Músicas)
13
- # Em um projeto maior, carregaríamos um CSV com 100k músicas aqui.
14
  @st.cache_data
15
- def load_data():
16
- data = {
17
- 'name': ['My Dear', 'Love Shot', 'Dynamite', 'Blue Hour', 'Growl', 'Seven', 'Ditto', 'Perfect Night'],
18
- 'artist': ['Chen', 'EXO', 'BTS', 'TXT', 'EXO', 'Jungkook', 'NewJeans', 'LE SSERAFIM'],
19
- # DNA: [Danceability, Energy, Acousticness, Valence]
20
- 'danceability': [0.4, 0.8, 0.7, 0.6, 0.7, 0.7, 0.6, 0.6],
21
- 'energy': [0.3, 0.9, 0.8, 0.7, 0.8, 0.8, 0.5, 0.7],
22
- 'acousticness': [0.8, 0.1, 0.0, 0.1, 0.1, 0.1, 0.7, 0.2],
23
- 'valence': [0.3, 0.7, 0.9, 0.6, 0.7, 0.8, 0.4, 0.5]
24
- }
25
- return pd.DataFrame(data)
 
 
26
 
27
- df = load_data()
28
 
29
- # Preparação dos dados para a IA
30
  features = ['danceability', 'energy', 'acousticness', 'valence']
31
  scaler = StandardScaler()
32
  df_scaled = scaler.fit_transform(df[features])
33
 
34
- # Treinando o modelo de vizinhos mais próximos
35
- model = NearestNeighbors(n_neighbors=3, metric='euclidean')
36
  model.fit(df_scaled)
37
 
38
- # Interface de Busca
39
- target_song = st.text_input("Qual música você tem na cabeça agora?", placeholder="Ex: My Dear - Chen")
40
 
41
- if target_song:
42
- # Busca simples pelo nome
43
- match = df[df['name'].str.contains(target_song.split(' - ')[0], case=False, na=False)]
44
 
45
- if not match.empty:
46
- idx = match.index[0]
47
- st.write(f"🧬 **DNA Identificado:** {df.iloc[idx]['name']} ({df.iloc[idx]['artist']})")
48
 
49
- # Encontrando similares
50
- distances, indices = model.kneighbors([df_scaled[idx]])
51
 
52
- st.subheader("Sugestões com DNA próximo:")
53
  for i in indices[0]:
54
- if i != idx:
55
- st.write(f"✨ **{df.iloc[i]['name']}** {df.iloc[i]['artist']}")
56
- st.caption(f"Vibe similar em {(1 - distances[0][1])*100:.1f}%")
57
  else:
58
- st.error("Ainda não tenho essa música no meu banco de dados. Tente uma das sugestões acima!")
59
-
60
- st.info("💡 Este é o motor inicial. No próximo passo, vamos conectar uma base de dados com 1 milhão de músicas.")
 
3
  from sklearn.preprocessing import StandardScaler
4
  from sklearn.neighbors import NearestNeighbors
5
 
6
+ # Configuração visual
7
  st.set_page_config(page_title="DNA Sonoro", page_icon="🎵")
8
+ st.title("🎵 DNA Sonoro: Modo Infinito")
9
+ st.markdown("Buscando a vibe real da música em uma base com mais de 30 mil faixas.")
10
 
11
+ # Baixando a base de dados gigante automaticamente
 
 
 
 
12
  @st.cache_data
13
+ def carregar_dados():
14
+ # Link direto para um CSV público com dados acústicos
15
+ url = "https://raw.githubusercontent.com/rfordatascience/tidytuesday/master/data/2020/2020-01-21/spotify_songs.csv"
16
+ df = pd.read_csv(url)
17
+
18
+ # Limpando duplicatas e arrumando os nomes para o nosso app
19
+ df = df.drop_duplicates(subset=['track_name', 'track_artist'])
20
+ df = df.rename(columns={'track_name': 'Musica', 'track_artist': 'Artista'})
21
+ df = df.dropna(subset=['Musica', 'Artista', 'danceability', 'energy', 'acousticness', 'valence'])
22
+
23
+ # Organiza os números da lista para a matemática não se perder
24
+ df = df.reset_index(drop=True)
25
+ return df
26
 
27
+ df = carregar_dados()
28
 
29
+ # O cérebro que entende a vibe
30
  features = ['danceability', 'energy', 'acousticness', 'valence']
31
  scaler = StandardScaler()
32
  df_scaled = scaler.fit_transform(df[features])
33
 
34
+ # Preparando a IA para achar os 5 vizinhos mais próximos
35
+ model = NearestNeighbors(n_neighbors=6, metric='euclidean')
36
  model.fit(df_scaled)
37
 
38
+ query = st.text_input("Qual música você quer analisar?", placeholder="Ex: Blinding Lights, Dynamite...")
 
39
 
40
+ if query:
41
+ resultado = df[df['Musica'].str.contains(query, case=False, na=False)]
 
42
 
43
+ if not resultado.empty:
44
+ idx = resultado.index[0] # Pega a primeira versão da música que achar
45
+ st.success(f"🧬 DNA Identificado: {df.iloc[idx]['Musica']} - {df.iloc[idx]['Artista']}")
46
 
47
+ # Faz a IA buscar quem tem os números parecidos
48
+ distancias, indices = model.kneighbors([df_scaled[idx]])
49
 
50
+ st.subheader("Você pode curtir essas aqui (Mesmo DNA):")
51
  for i in indices[0]:
52
+ if i != idx: # Pra não recomendar a mesma música que você digitou
53
+ st.write(f"✨ **{df.iloc[i]['Musica']}** ({df.iloc[i]['Artista']})")
 
54
  else:
55
+ st.error("Não achei essa na base. Tenta uma palavra do nome ou outro hit para testar.")