Limpeza Dataset Spotify via API
Estruturando dados obtidos
O resultado fica bem fiel. Para usar, necessita de:
- Notebook do Colab aberto
- Noções de Python
- Conexão com a interet
- Url da API que deseja usar
Duas blibliotecas são necessárias aqui. Pandas e Numpy.
import pandas as pd
import numpy as np
Aqui eu abri o csv obtido no Kaggle e rankeio de acordo com a popularidade das músicas.
df = pd.read_csv('spotify.csv', index_col=0)
df.sort_values('song_popularity', ascending=False, inplace=True)
df.head(5)
print(df.shape)
df.head(5)
## Doc - https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.info.html
## Verificando Tipo de Dados e Valores Não Nulos
## Inicialmente não possuimos dados nulo
df.info()
## Doc - https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.describe.html?highlight=describe#pandas.DataFrame.describe
## Aqui observamos apenas duas colunas pois os formatos das outras esta como Object e assim ele não consegue calcular as agregações necessárias.
df.describe()
duplicados = df[df.duplicated()]
print(duplicados)
## Exemplo de uso em um cenário onde vc pode ter diversos valores iguais mas a combinação que não pode se repetir é em duas chaves especificas.
print(df[df.duplicated(subset=['song_name','audio_valence'])])
## Doc - https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.drop_duplicates.html
df.drop_duplicates(inplace=True)
print(df.shape)
df.head(5)
def remove_text (df, columns, text):
for col in columns:
df[col] = df[col].str.strip(text)
remove_text(df, ['acousticness', 'danceability'], 'mol/L')
remove_text(df, ['song_duration_ms', 'acousticness'], 'kg')
df.head(5)
## Doc - https://pandas.pydata.org/docs/reference/api/pandas.Series.astype.html?highlight=astype#pandas.Series.astype
def to_type(df, columns, type):
for col in columns:
print(col)
df[col] = df[col].astype(type)
numerical_cols = ['song_duration_ms', 'acousticness', 'danceability',
'energy', 'instrumentalness', 'liveness', 'loudness',
'speechiness', 'tempo', 'audio_valence']
categorical_cols = ['song_popularity', 'key', 'audio_mode', 'time_signature']
to_type(df, numerical_cols, 'float')
to_type(df, categorical_cols, 'category')
df = df.replace(['nao_sei'], np.nan)
to_type(df, numerical_cols, 'float')
to_type(df, categorical_cols, 'category')
df['speechiness'] = df['speechiness'].replace(['0.nao_sei'], np.nan)
to_type(df, numerical_cols, 'float')
to_type(df, categorical_cols, 'category')
df.info()
## Uma forma de validação é verificar a quantidade de elementos em cada uma das categorias.
for col in categorical_cols:
print(f'{col}')
print(df[col].value_counts().sort_values())
df['key'] = df['key'].replace([0.177], np.nan)
df['audio_mode'] = df['audio_mode'].replace(['0.105'], np.nan)
df['time_signature'] = df['time_signature'].replace(['0.7', '2800000000'], np.nan)
A partir de agora, temos um dataset com o minimo de consistencia e sem valores duplicados
df.info()
df.isna().sum()
df[df[numerical_cols]<0].count()
6 - Remoção de Colunas:
Algumas colunas podem ser consideradas desnecessárias para nossa análise, isso porque elas não nos passam informações relevantes a respeito do que queremos descobrir, ou até mesmo porque possuem tantos dados faltantes que mais atrapalham do que ajudam. Nesses casos uma forma rápida e fácil de solucionar esse problema seria excluí-las.
Aqui eliminaremos apenas uma a nivel de experimentação.
## Doc - https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.drop.html
df.drop(['liveness'], axis=1)
df.drop(columns=['liveness'], inplace=True)
7 - Dados faltantes Missing Values:
Em algumas situações, podemos ter muitas informações incompletas no nosso df. Essas informações faltantes podem prejudicar nossa análise e outras etapas que dependem dela e do pré-processamento, portanto, precisamos removê-los ou substituir esses valores por outros. O fluxo a seguir pode auxiliar na decisão e trazer sugestões de como tratar cada caso.
Para dados que não são séries temporais, nossa primeira opção é substitui-los pela média da coluna, entretanto, às vezes, a média pode ter sido afetada pelos valores destoantes da coluna (outliers), então podemos substituir também pela moda ou mediana.
Podemos fazer isso com a função .fillna que preenche todos os campos com dados ausentes. Vamos criar alguns loops como exemplo. O primeiro passa por algumas colunas e substitui os valores faltantes pela moda:
df.isna().sum()
## Doc .fillna - https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.fillna.html
for column in ['acousticness', 'speechiness']:
df[column].fillna(df[column].mode()[0], inplace=True)
for column in ['song_duration_ms', 'danceability', 'energy',
'loudness', 'audio_valence']:
df[column].fillna(df[column].median(), inplace=True)
df.isna().sum()
## Doc - https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.dropna.html?highlight=dropna#pandas.DataFrame.dropna
df.dropna(inplace=True)
df.isna().sum()
df.info()
df.head()