├── spotydash ├── __init__.py ├── tests │ ├── __init__.py │ ├── conftest.py │ └── test_dag_validation.py ├── resources │ └── data │ │ ├── ids.pickle │ │ ├── kmeans_model.pkl │ │ ├── playlists.pickle │ │ ├── audio_features.pickle │ │ ├── current_songs.pickle │ │ ├── transformed_artists_data.csv │ │ └── transformed_songs_data.csv ├── dags │ ├── common_args.py │ ├── etfl_artists_dag.py │ └── etl_songs_dag.py ├── constants.py ├── alembic │ ├── script.py.mako │ └── env.py ├── schemas.py ├── validate_schemas.py ├── load.py ├── helpers.py ├── etfl_artists_data.py ├── plot.py ├── models.py ├── extract.py ├── clustering.py ├── cfg.py ├── alembic.ini ├── etl_songs_data.py └── transform.py ├── docs └── screen_superset.png ├── docker ├── entrypoints │ ├── start_mlflow_ui.sh │ ├── start_mlflow_server.sh │ ├── start_airflow_webserver.sh │ └── start_superset.sh ├── Dockerfile ├── pg-init-scripts │ └── create-multiple-postgresql-databases.sh ├── control_docker.sh └── docker-compose.yaml ├── .gitignore ├── superset ├── superset_config.py ├── datasources │ └── datasources.yaml └── dashboards │ └── dashboard.json ├── pyproject.toml ├── .pre-commit-config.yaml ├── sample_dot_env └── README.md /spotydash/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /spotydash/tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /docs/screen_superset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aoelvp94/Spotydash/HEAD/docs/screen_superset.png -------------------------------------------------------------------------------- /spotydash/resources/data/ids.pickle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aoelvp94/Spotydash/HEAD/spotydash/resources/data/ids.pickle -------------------------------------------------------------------------------- /spotydash/resources/data/kmeans_model.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aoelvp94/Spotydash/HEAD/spotydash/resources/data/kmeans_model.pkl -------------------------------------------------------------------------------- /spotydash/resources/data/playlists.pickle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aoelvp94/Spotydash/HEAD/spotydash/resources/data/playlists.pickle -------------------------------------------------------------------------------- /spotydash/resources/data/audio_features.pickle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aoelvp94/Spotydash/HEAD/spotydash/resources/data/audio_features.pickle -------------------------------------------------------------------------------- /spotydash/resources/data/current_songs.pickle: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/aoelvp94/Spotydash/HEAD/spotydash/resources/data/current_songs.pickle -------------------------------------------------------------------------------- /spotydash/tests/conftest.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | from airflow.models import DagBag 3 | 4 | from spotydash.constants import DAGS_DIR 5 | 6 | 7 | @pytest.fixture(scope="session") 8 | def dagbag(): 9 | return DagBag(dag_folder=DAGS_DIR) 10 | -------------------------------------------------------------------------------- /docker/entrypoints/start_mlflow_ui.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -o errexit 4 | set -o nounset 5 | set -o pipefail 6 | 7 | 8 | poetry run mlflow ui \ 9 | --backend-store-uri "$DB_URI" \ 10 | --host "$MLFLOW_UI_HOST" \ 11 | --port "$MLFLOW_UI_PORT" \ 12 | --default-artifact-root "$MLFLOW_ARTIFACT_ROOT" 13 | -------------------------------------------------------------------------------- /docker/entrypoints/start_mlflow_server.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -o errexit 4 | set -o nounset 5 | set -o pipefail 6 | 7 | 8 | poetry run mlflow server \ 9 | --backend-store-uri "$DB_URI" \ 10 | --host "$MLFLOW_SERVER_HOST" \ 11 | --port "$MLFLOW_SERVER_PORT" \ 12 | --default-artifact-root "$MLFLOW_ARTIFACT_ROOT" 13 | -------------------------------------------------------------------------------- /spotydash/dags/common_args.py: -------------------------------------------------------------------------------- 1 | from datetime import timedelta 2 | 3 | default_args = { 4 | "owner": "MuttData", 5 | "depends_on_past": False, 6 | "email": ["airflow@example.com"], 7 | "email_on_failure": False, 8 | "email_on_retry": False, 9 | "retries": 3, 10 | "retry_delay": timedelta(minutes=5), 11 | } 12 | -------------------------------------------------------------------------------- /docker/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM python:3.8.5 2 | 3 | # Setup pipx and poetry 4 | RUN pip install pipx 5 | RUN pipx install poetry 6 | ENV PATH="/root/.local/pipx/venvs/poetry/bin/:$PATH" 7 | 8 | COPY pyproject.toml /spotydash/pyproject.toml 9 | COPY poetry.lock /spotydash/poetry.lock 10 | WORKDIR /spotydash 11 | RUN poetry install --no-root 12 | COPY . /spotydash 13 | RUN poetry install --no-interaction 14 | -------------------------------------------------------------------------------- /spotydash/constants.py: -------------------------------------------------------------------------------- 1 | from spotydash.cfg import _p 2 | 3 | MAPPER_PG_IS_LOCAL = { 4 | "yes": "true", 5 | "no": "false", 6 | } 7 | 8 | POPULARITY_DEFAULT_VALUE = 50 9 | 10 | RESOURCES_PATH = _p / "resources" 11 | DATA_DIR = RESOURCES_PATH / "data" 12 | DAGS_DIR = _p / "dags" 13 | USERNAME_ID = 11100099447 14 | LIMIT_PLAYLISTS = 10 15 | 16 | CLUSTERING_SCATTERPLOT_FILENAME = "scatter_clustering_plot.png" 17 | ESTIMATOR_ARTIFACT = "kmeans_model.pkl" 18 | -------------------------------------------------------------------------------- /docker/entrypoints/start_airflow_webserver.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Script that allows the users and connections creations for Airflow service. 3 | 4 | poetry run airflow db init 5 | if [ "$AIRFLOW_CREATE_USER_CONN" = true ]; then 6 | # Create User 7 | echo "Creating airflow user..." 8 | poetry run airflow users create -r "$AIRFLOW_ROLE" -u "$AIRFLOW_USER" -p "$AIRFLOW_PASSWORD" -f "$AIRFLOW_FIRST" -l "$AIRFLOW_LAST" -e "$AIRFLOW_EMAIL" 9 | fi 10 | poetry run airflow webserver 11 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .env 2 | 3 | # Byte-compiled / optimized / DLL files 4 | __pycache__/ 5 | 6 | *.py[cod] 7 | *$py.class 8 | *.pyc 9 | *.ipynb_checkpoints/ 10 | 11 | # C extensions 12 | *.so 13 | *.pyc 14 | .cache 15 | 16 | logs/ 17 | __pycache__/ 18 | /resources 19 | dist/ 20 | 21 | # Distribution / packaging 22 | .Python 23 | build/ 24 | develop-eggs/ 25 | .pytest_cache/ 26 | dist/ 27 | downloads/ 28 | eggs/ 29 | .eggs/ 30 | lib/ 31 | lib64/ 32 | parts/ 33 | sdist/ 34 | var/ 35 | wheels/ 36 | *.egg-info/ 37 | .installed.cfg 38 | *.egg 39 | .vscode/ 40 | -------------------------------------------------------------------------------- /spotydash/alembic/script.py.mako: -------------------------------------------------------------------------------- 1 | """${message} 2 | 3 | Revision ID: ${up_revision} 4 | Revises: ${down_revision | comma,n} 5 | Create Date: ${create_date} 6 | 7 | """ 8 | from alembic import op 9 | import sqlalchemy as sa 10 | ${imports if imports else ""} 11 | 12 | # revision identifiers, used by Alembic. 13 | revision = ${repr(up_revision)} 14 | down_revision = ${repr(down_revision)} 15 | branch_labels = ${repr(branch_labels)} 16 | depends_on = ${repr(depends_on)} 17 | 18 | 19 | def upgrade(): 20 | ${upgrades if upgrades else "pass"} 21 | 22 | 23 | def downgrade(): 24 | ${downgrades if downgrades else "pass"} 25 | -------------------------------------------------------------------------------- /docker/pg-init-scripts/create-multiple-postgresql-databases.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | set -e 4 | set -u 5 | 6 | function create_database() { 7 | local database=$1 8 | echo "Creating database '$database'" 9 | psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<- EOSQL 10 | CREATE DATABASE $database; 11 | GRANT ALL PRIVILEGES ON DATABASE $database TO $POSTGRES_USER; 12 | EOSQL 13 | } 14 | 15 | if [ -n "$POSTGRES_MULTIPLE_DATABASES" ]; then 16 | echo "Multiple database creation requested: $POSTGRES_MULTIPLE_DATABASES" 17 | for db in $(echo "$POSTGRES_MULTIPLE_DATABASES" | tr ',' ' '); do 18 | create_database "$db" 19 | done 20 | fi 21 | -------------------------------------------------------------------------------- /spotydash/schemas.py: -------------------------------------------------------------------------------- 1 | SONG_COLUMNS = [ 2 | "id", 3 | "name", 4 | "artist", 5 | "energy", 6 | "liveness", 7 | "tempo", 8 | "speechiness", 9 | "acousticness", 10 | "instrumentalness", 11 | "time_signature", 12 | "danceability", 13 | "key", 14 | "duration_ms", 15 | "loudness", 16 | "valence", 17 | "mode", 18 | "uri", 19 | ] 20 | 21 | ARTIST_COLUMNS = ["id", "name", "followers", "popularity", "genre", "url", "label"] 22 | 23 | 24 | SCHEMAS = { 25 | "Song": { 26 | "SCHEMA": SONG_COLUMNS, 27 | "KEY_COLS": ["id"], 28 | }, 29 | "Artist": { 30 | "SCHEMA": ARTIST_COLUMNS, 31 | "KEY_COLS": ["id"], 32 | }, 33 | } 34 | -------------------------------------------------------------------------------- /spotydash/validate_schemas.py: -------------------------------------------------------------------------------- 1 | """ Data validations using Pandera """ 2 | 3 | import pandera as pa 4 | from pandera import Check, Column, DataFrameSchema 5 | 6 | null_schema_artists_data = DataFrameSchema( 7 | { 8 | "id": Column(pa.Object, Check(lambda x: len(x) > 0), nullable=False), 9 | "name": Column(pa.Object, Check(lambda x: len(x) > 0), nullable=False), 10 | "followers": Column(pa.Int, Check(lambda x: x >= 0), nullable=False), 11 | "popularity": Column(pa.Int, Check(lambda x: x >= 0), nullable=False), 12 | "genre": Column(pa.Object, Check(lambda x: len(x) > 0), nullable=False), 13 | "url": Column(pa.Object, Check(lambda x: len(x) > 0), nullable=False), 14 | } 15 | ) 16 | -------------------------------------------------------------------------------- /spotydash/load.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | import pandas as pd 4 | from pangres import upsert 5 | from sqlalchemy import create_engine 6 | 7 | from spotydash.cfg import DB_CONNSTR 8 | from spotydash.schemas import SCHEMAS 9 | 10 | 11 | def load(df: pd.DataFrame, table: str): 12 | """Insert data to certain table using pangres (PostgreSQL). 13 | 14 | Parameters 15 | ---------- 16 | df : pd.DataFrame 17 | Df to be inserted. 18 | 19 | """ 20 | logging.info(f"Uploading {df.shape[0]} to pg") 21 | engine = create_engine(DB_CONNSTR) 22 | 23 | logging.info("DF to be loaded") 24 | logging.info(df) 25 | df.set_index(SCHEMAS[table]["KEY_COLS"], inplace=True) 26 | upsert(engine=engine, df=df, table_name=table, if_row_exists="update") 27 | -------------------------------------------------------------------------------- /superset/superset_config.py: -------------------------------------------------------------------------------- 1 | """Superset config.""" 2 | import os 3 | 4 | DOCKER_PROJECT_NAME = os.getenv("COMPOSE_PROJECT_NAME") 5 | REDIS_PORT = os.getenv("SUPERSET_REDIS_PORT") 6 | REDIS_HOST = f"{DOCKER_PROJECT_NAME}_redis_1" 7 | 8 | CACHE_CONFIG = { 9 | "CACHE_TYPE": "redis", 10 | "CACHE_DEFAULT_TIMEOUT": 300, 11 | "CACHE_REDIS_HOST": REDIS_HOST, 12 | "CACHE_REDIS_PORT": REDIS_PORT, 13 | "CACHE_REDIS_DB": 1, 14 | "CACHE_REDIS_URL": f"redis://{REDIS_HOST}:{REDIS_PORT}/1", 15 | } 16 | 17 | POSTGRES_USER = os.getenv("POSTGRES_USER") 18 | POSTGRES_PASSWORD = os.getenv("POSTGRES_PASSWORD") 19 | POSTGRES_PORT = os.getenv("POSTGRES_PORT") 20 | SUPERSET_POSTGRES_DB = os.getenv("SUPERSET_POSTGRES_DB") 21 | SQLALCHEMY_DATABASE_URI = f"postgresql+psycopg2://{POSTGRES_USER}:{POSTGRES_PASSWORD}@{DOCKER_PROJECT_NAME}_postgres-db_1:5432/{SUPERSET_POSTGRES_DB}" # noqa: E501 22 | SQLALCHEMY_TRACK_MODIFICATIONS = True 23 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "spotydash" 3 | version = "0.1.0" 4 | description = "" 5 | authors = ["Mutt Data"] 6 | packages = [{include = "spotydash"}] 7 | 8 | [tool.poetry.dependencies] 9 | python = "^3.8" 10 | spotipy = "^2.16.1" 11 | python-decouple = "^3.3" 12 | alembic = "1.4.1" 13 | psycopg2-binary = "^2.8.6" 14 | pandas = "1.1.5" 15 | apache-airflow = "^2.0.1" 16 | ipykernel = "^5.4.3" 17 | muttlib = {version = "^1.0.1", extras = ["postgres"]} 18 | pangres = "^2.2.3" 19 | mlflow = "^1.17.0" 20 | pandera = "^0.6.4" 21 | scikit-learn = "^0.24.2" 22 | 23 | [tool.isort] 24 | multi_line_output = 3 25 | line_length = 88 26 | include_trailing_comma = true 27 | 28 | [tool.poetry.dev-dependencies] 29 | pdbpp = "^0.10.2" 30 | pylint = "^2.6.0" 31 | pre-commit = "^2.7.1" 32 | black = "^20.8b1" 33 | flake8 = "^3.8.4" 34 | isort = "^5.6.4" 35 | pre-commit-hooks = "^3.3.0" 36 | pytest = "^6.1.1" 37 | shellcheck-py = "^0.7.1.1" 38 | 39 | 40 | [build-system] 41 | requires = ["poetry-core>=1.0.0"] 42 | build-backend = "poetry.masonry.api" 43 | -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | --- 2 | repos: 3 | - repo: local 4 | hooks: 5 | - id: black 6 | name: black 7 | entry: poetry run black 8 | language: python 9 | types: [python] 10 | args: [--skip-string-normalization] 11 | exclude: (docs|spotydash/alembic/) 12 | 13 | - id: flake8 14 | name: flake8 15 | entry: poetry run flake8 16 | language: python 17 | types: [python] 18 | args: [--max-line-length=88] 19 | exclude: (docs|spotydash/alembic/) 20 | 21 | #- id: pylint 22 | # name: pylint 23 | # entry: poetry run pylint 24 | # language: python 25 | # types: [python] 26 | # exclude: (docs|spotydash/alembic/) 27 | 28 | - id: isort 29 | name: isort 30 | entry: poetry run isort 31 | language: python 32 | types: [python] 33 | 34 | - id: shellcheck 35 | name: shellcheck 36 | entry: poetry run shellcheck 37 | language: system 38 | types: [shell] 39 | ... 40 | -------------------------------------------------------------------------------- /spotydash/helpers.py: -------------------------------------------------------------------------------- 1 | """ 2 | Project dependant helper code used in multiple files. 3 | """ 4 | 5 | 6 | import logging 7 | import pickle 8 | 9 | from spotydash.cfg import sp 10 | from spotydash.constants import DATA_DIR, LIMIT_PLAYLISTS, USERNAME_ID 11 | 12 | 13 | def get_user_playlist(avoid_api=True): 14 | """From a given user, get his playlists. 15 | 16 | Parameters 17 | ---------- 18 | avoid_api : bool 19 | Flag to avoid call to Spotify API. 20 | 21 | Returns 22 | ------- 23 | playlists_list : list(str) 24 | List that contains ids playlists for a given user. 25 | 26 | """ 27 | if avoid_api: 28 | logging.info("avoid_api = True, reading data from local storage..") 29 | with open(DATA_DIR / "playlists.pickle", "rb") as handle: 30 | playlists_list = pickle.load(handle) 31 | else: 32 | logging.info("avoid_api = False, reading data from Spotify API..") 33 | playlists = sp.user_playlists(USERNAME_ID) 34 | playlists_list = [] 35 | for playlist in playlists["items"]: 36 | playlists_list.append(playlist["id"]) 37 | return playlists_list[:LIMIT_PLAYLISTS] 38 | -------------------------------------------------------------------------------- /spotydash/etfl_artists_data.py: -------------------------------------------------------------------------------- 1 | import logging 2 | from datetime import datetime, timedelta 3 | 4 | import mlflow 5 | 6 | from spotydash.cfg import MLFLOW_TRACKING_URI 7 | from spotydash.clustering import fit_clustering 8 | from spotydash.extract import extract_current_songs 9 | from spotydash.load import load 10 | from spotydash.transform import transform_artist_data 11 | 12 | 13 | def run_etfl_artists_data(execution_date: datetime): 14 | """Run Extract-Transform-Fit-Load process. 15 | 16 | Parameters 17 | ---------- 18 | execution_date : Datetime Object 19 | Execution date / Date to query. 20 | 21 | """ 22 | # Extract 23 | extracted_df = extract_current_songs(execution_date) 24 | 25 | # Transform 26 | transformed_df = transform_artist_data(extracted_df) 27 | 28 | # Fit 29 | mlflow.set_tracking_uri(MLFLOW_TRACKING_URI) 30 | mlflow.set_experiment("kmeans_clustering") 31 | with mlflow.start_run(run_name=f"kmeans_{execution_date}"): 32 | results_df = fit_clustering(transformed_df) 33 | 34 | # Load 35 | load(results_df, "Artist") 36 | logging.info("Done") 37 | 38 | 39 | if __name__ == "__main__": 40 | date = datetime.today() - timedelta(days=1) 41 | run_etfl_artists_data(date) 42 | -------------------------------------------------------------------------------- /spotydash/plot.py: -------------------------------------------------------------------------------- 1 | from typing import Iterable 2 | 3 | import matplotlib.pyplot as plt 4 | import pandas as pd 5 | 6 | from spotydash.constants import CLUSTERING_SCATTERPLOT_FILENAME, DATA_DIR 7 | 8 | 9 | def generate_scatter_plot(df: pd.DataFrame, centers: Iterable): 10 | """Generate scatter plot using clustering results. 11 | 12 | Parameters 13 | ---------- 14 | df : pd.DataFrame 15 | Dataframe to be plotted. 16 | centers : Array 17 | Array that contains centers for each cluster. 18 | 19 | """ 20 | # Getting the values and plotting it 21 | f1 = df["followers"].values 22 | f2 = df["popularity"].values 23 | colores = ["red", "green", "blue", "cyan"] # 'yellow', 'brown'] 24 | asignar = [] 25 | for row in list(df["label"]): 26 | asignar.append(colores[row]) 27 | 28 | plt.scatter(f1, f2, c=asignar, s=70) 29 | plt.scatter(centers[:, 0], centers[:, 1], marker="*", c=colores, s=500) 30 | 31 | for i in range(df.shape[0]): 32 | plt.text( 33 | x=df.followers[i], 34 | y=df.popularity[i], 35 | s=df.name[i], 36 | fontdict=dict(color='red', size=10), 37 | ) 38 | plt.savefig( 39 | DATA_DIR / CLUSTERING_SCATTERPLOT_FILENAME, dpi=300, bbox_inches="tight" 40 | ) 41 | -------------------------------------------------------------------------------- /sample_dot_env: -------------------------------------------------------------------------------- 1 | CLIENT_ID=insert_your_client_id 2 | CLIENT_SECRET=insert_your_client_secret 3 | TOKEN=insert_your_token 4 | SPOTIPY_REDIRECT_URI=https://google.com 5 | DB_CONNSTR=postgresql+psycopg2://spoty:spoty@spotydash_postgres-db_1:5432/spotipy 6 | POSTGRES_DIALECT=postgresql 7 | POSTGRES_DRIVER=psycopg2 8 | POSTGRES_HOST=postgres-db 9 | POSTGRES_PORT=6666 10 | POSTGRES_USER=spoty 11 | POSTGRES_PASSWORD=spoty 12 | POSTGRES_DB=spotipy 13 | POSTGRES_DB_TYPE=postgres 14 | POSTGRES_HOST_AIRFLOW=airflowdb 15 | POSTGRES_USER_AIRFLOW=airflow_user 16 | POSTGRES_PASSWORD_AIRFLOW=airflow_pwd 17 | AIRFLOW_POSTGRES_DB=airflow 18 | AIRFLOW_PORT=2021 19 | AIRFLOW_LOG_FOLDER=/etc/airflow/logs 20 | AIRFLOW_DAG_FOLDER=/etc/airflow/dags 21 | AIRFLOW_USER=admin 22 | AIRFLOW_PASSWORD=admin 23 | AIRFLOW_ROLE=Admin 24 | AIRFLOW_FIRST=airflow 25 | AIRFLOW_LAST=airflow 26 | AIRFLOW_EMAIL=airflow@muttdata.ai 27 | AIRFLOW_CREATE_USER_CONN=true 28 | IP_SUBNET=189.240.0.0 29 | MLFLOW_POSTGRES_DB=mlflowdb 30 | MLFLOW_ARTIFACT_ROOT=/spotydash/resources/data/tmp 31 | MLFLOW_TRACKING_USER=mlflow 32 | MLFLOW_TRACKING_PASSWORD=mlflow 33 | MLFLOW_SERVER_HOST=mlflow-server 34 | MLFLOW_UI_HOST=mlflow-ui 35 | MLFLOW_UI_PORT=88 36 | MLFLOW_SERVER_PORT=6000 37 | SUPERSET_POSTGRES_DB=superset_db 38 | SUPERSET_EMAIL=superset@muttdata.ai 39 | SUPERSET_PORT=7088 40 | SUPERSET_CREATE_USER=true 41 | SUPERSET_USER=superset 42 | SUPERSET_PASSWORD=superset 43 | SUPERSET_FIRSTNAME=superset 44 | SUPERSET_LASTNAME=superset 45 | SUPERSET_REDIS_PORT=6379 46 | SUPERSET_IMPORT_DASHBOARD_DATASOURCES=false 47 | SUPERSET_DASHBOARDS_PATH=/superset/dashboards 48 | SUPERSET_DATASOURCES_PATH=/superset/datasources 49 | COMPOSE_PROJECT_NAME=spotydash 50 | FLASK_APP=superset 51 | -------------------------------------------------------------------------------- /docker/entrypoints/start_superset.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | # Script that allows the user and connection creation for Superset service. Also it would allow us to import dashboards/datasources. 3 | if [ "$SUPERSET_CREATE_USER" = true ]; then 4 | echo "Creating superset user..." 5 | superset-init --username "$SUPERSET_USER" --password "$SUPERSET_PASSWORD" --firstname "$SUPERSET_FIRSTNAME" --lastname "$SUPERSET_LASTNAME" --email "$SUPERSET_EMAIL" 6 | superset set_database_uri -d "$POSTGRES_DB" -u postgresql+psycopg2://"$POSTGRES_USER":"$POSTGRES_PASSWORD"@"$COMPOSE_PROJECT_NAME"_"$POSTGRES_HOST"_1:5432/"$POSTGRES_DB" 7 | fi 8 | 9 | if [ "$SUPERSET_IMPORT_DASHBOARD_DATASOURCES" = true ]; then 10 | DASHBOARDS_FILE="$SUPERSET_DASHBOARDS_PATH/dashboard.json" 11 | DATASOURCES_FILE="$SUPERSET_DATASOURCES_PATH/datasources.yaml" 12 | 13 | echo 'Checking if datasources file exists..' 14 | if [ -f "$DATASOURCES_FILE" ]; then 15 | echo "Importing datasources in '$DATASOURCES_FILE'.." 16 | superset import_datasources -p "$DATASOURCES_FILE" 17 | echo "All the datasources in Superset were imported." 18 | else 19 | echo "You don't have the datasources file, please export the datasources defined in Superset service." 20 | fi 21 | 22 | echo 'Checking if dashboards file exists..' 23 | if [ -f "$DASHBOARDS_FILE" ]; then 24 | echo "Importing dashboards in '$DASHBOARDS_FILE'.." 25 | superset import_dashboards -p "$DASHBOARDS_FILE" 26 | echo "All the dashboards in Superset were imported." 27 | else 28 | echo "You don't have the dashboards file, please export the dashboards defined in Superset service." 29 | fi 30 | fi 31 | 32 | gunicorn --bind 0.0.0.0:"$SUPERSET_PORT" -w 10 --timeout 120 "superset.app:create_app()" 33 | -------------------------------------------------------------------------------- /spotydash/dags/etfl_artists_dag.py: -------------------------------------------------------------------------------- 1 | """ETFL for artists data""" 2 | 3 | import logging 4 | from datetime import timedelta 5 | 6 | import mlflow 7 | import pandas as pd 8 | from airflow.decorators import dag, task 9 | from airflow.operators.python import get_current_context 10 | from airflow.utils.dates import days_ago 11 | 12 | from spotydash.cfg import MLFLOW_TRACKING_URI 13 | from spotydash.clustering import fit_clustering 14 | from spotydash.dags.common_args import default_args 15 | from spotydash.extract import extract_current_songs 16 | from spotydash.load import load 17 | from spotydash.transform import transform_artist_data 18 | 19 | 20 | @dag( 21 | "artists_ETFL", 22 | default_args=default_args, 23 | schedule_interval=timedelta(days=1), 24 | start_date=days_ago(2), 25 | tags=["ETFL"], 26 | ) 27 | def taskflow_api_etl(): 28 | @task 29 | def extract_task(): 30 | context = get_current_context() 31 | return extract_current_songs(context["execution_date"]) 32 | 33 | @task 34 | def transform_task(json_df): 35 | logging.info(json_df) 36 | return transform_artist_data(json_df).to_json() 37 | 38 | @task 39 | def fit_task(json_df): 40 | context = get_current_context() 41 | mlflow.set_tracking_uri(MLFLOW_TRACKING_URI) 42 | mlflow.set_experiment("kmeans_clustering") 43 | with mlflow.start_run(run_name=f"kmeans_{context['execution_date']}"): 44 | return fit_clustering(pd.read_json(json_df)).to_json() 45 | 46 | @task 47 | def load_task(json_df): 48 | logging.info(json_df) 49 | load(pd.read_json(json_df), "Artist") 50 | 51 | result = extract_task() 52 | clean_df = transform_task(result) 53 | results = fit_task(clean_df) 54 | load_task(results) 55 | 56 | 57 | taskflow_api_etl_dag = taskflow_api_etl() 58 | -------------------------------------------------------------------------------- /spotydash/models.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | from sqlalchemy import ARRAY, BigInteger, Column, Float, MetaData, String, create_engine 4 | from sqlalchemy.ext.declarative import declarative_base 5 | 6 | from spotydash.cfg import DB_CONNSTR 7 | 8 | engine = create_engine(DB_CONNSTR) if DB_CONNSTR else None 9 | meta = MetaData(engine) 10 | Base = declarative_base(metadata=meta) 11 | 12 | 13 | class Song(Base): 14 | __tablename__ = "Song" 15 | 16 | id = Column(String(255), primary_key=True, nullable=False) 17 | name = Column(String(255), nullable=False) 18 | artist = Column(String(255), nullable=False) 19 | energy = Column(Float, nullable=False) 20 | liveness = Column(Float, nullable=False) 21 | tempo = Column(Float, nullable=False) 22 | speechiness = Column(Float, nullable=False) 23 | acousticness = Column(Float, nullable=False) 24 | instrumentalness = Column(Float, nullable=False) 25 | time_signature = Column(BigInteger, nullable=False) 26 | danceability = Column(Float, nullable=False) 27 | key = Column(BigInteger, nullable=False) 28 | duration_ms = Column(BigInteger, nullable=False) 29 | loudness = Column(Float, nullable=False) 30 | valence = Column(Float, nullable=False) 31 | mode = Column(BigInteger, nullable=False) 32 | uri = Column(String(255), nullable=False) 33 | 34 | 35 | class Artist(Base): 36 | __tablename__ = "Artist" 37 | 38 | id = Column(String(255), primary_key=True, nullable=False) 39 | name = Column(String(255), nullable=False) 40 | followers = Column(BigInteger, nullable=False) 41 | popularity = Column(BigInteger, nullable=False) 42 | genre = Column(ARRAY(String), nullable=False) 43 | url = Column(String(255), nullable=False) 44 | label = Column(BigInteger, nullable=False) 45 | 46 | 47 | if __name__ == "__main__": 48 | logging.info("Creating tables..") 49 | Base.metadata.create_all() 50 | -------------------------------------------------------------------------------- /spotydash/extract.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import pickle 3 | from datetime import datetime 4 | 5 | from spotydash.cfg import sp 6 | from spotydash.constants import DATA_DIR, USERNAME_ID 7 | 8 | 9 | def get_playlist_audio_features(playlist_id: str): 10 | """Get info about songs for a certain playlist. 11 | 12 | Parameters 13 | ---------- 14 | playlist_id : str 15 | Playlist ID 16 | 17 | Returns 18 | ------- 19 | audio_features : list(JSON) 20 | List that contains info about songs. 21 | ids : list(str) 22 | List that containts songs IDs. 23 | 24 | """ 25 | 26 | offset = 0 27 | songs = [] 28 | ids = [] 29 | content = sp.user_playlist_tracks( 30 | USERNAME_ID, 31 | playlist_id, 32 | fields=None, 33 | limit=None, 34 | offset=offset, 35 | market=None, 36 | ) 37 | songs += content["items"] 38 | 39 | for i in songs: 40 | ids.append(i["track"]["id"]) 41 | 42 | index = 0 43 | audio_features = [] 44 | while index < len(ids): 45 | try: 46 | audio_features += sp.audio_features(ids[index : index + 50]) # noqa: E203 47 | index += 50 48 | except: # noqa: E722 49 | pass 50 | return audio_features, ids 51 | 52 | 53 | def extract_current_songs(execution_date: datetime, avoid_api=True, limit=None): 54 | """Get limit elements from last listen tracks 55 | 56 | Parameters 57 | ---------- 58 | ds : Datetime object 59 | Date to query 60 | avoid_api : boolean 61 | Flag to avoid Spotify API by reading data from local storage. 62 | limit : int 63 | Limit of element to query 64 | 65 | Returns 66 | ------- 67 | result : dict 68 | Result from Spotify API 69 | 70 | """ 71 | if avoid_api: 72 | logging.info("avoid_api = True, reading data from local storage..") 73 | with open(DATA_DIR / "current_songs.pickle", "rb") as handle: 74 | result = pickle.load(handle) 75 | else: 76 | logging.info("avoid_api = False, reading data from Spotify API..") 77 | ds = int(execution_date.timestamp()) * 1000 78 | result = sp.current_user_recently_played(limit=limit, after=ds) 79 | return result 80 | -------------------------------------------------------------------------------- /spotydash/clustering.py: -------------------------------------------------------------------------------- 1 | import logging 2 | import pickle 3 | 4 | import mlflow 5 | import pandas as pd 6 | from sklearn.cluster import KMeans 7 | from sklearn.metrics import ( 8 | calinski_harabasz_score, 9 | davies_bouldin_score, 10 | silhouette_score, 11 | ) 12 | from sklearn.preprocessing import MinMaxScaler 13 | 14 | from spotydash.cfg import KMEANS_PARAMS 15 | from spotydash.constants import ( 16 | CLUSTERING_SCATTERPLOT_FILENAME, 17 | DATA_DIR, 18 | ESTIMATOR_ARTIFACT, 19 | ) 20 | from spotydash.plot import generate_scatter_plot 21 | 22 | 23 | def fit_clustering(df: pd.DataFrame): 24 | """ Run a clustering algorithm and log metrics/artifacts/params/model. 25 | 26 | Parameters 27 | ---------- 28 | df : pd.DataFrame 29 | Dataframe to process clustering. 30 | 31 | Returns 32 | ------- 33 | df : pd.DataFrame 34 | Df with results. 35 | 36 | """ 37 | logging.info("Going to process clustering..") 38 | X = df[["followers", "popularity"]] 39 | s = MinMaxScaler() 40 | Scaled_X = s.fit_transform(X) 41 | # df_X_reduced = pd.DataFrame(Scaled_X, index=X.index, columns=X.columns) 42 | mlflow.log_params(KMEANS_PARAMS) 43 | kmeans = KMeans(**KMEANS_PARAMS).fit(Scaled_X) 44 | mlflow.sklearn.log_model(kmeans, "kmeans_model") 45 | with open(DATA_DIR / ESTIMATOR_ARTIFACT, "wb") as file: 46 | pickle.dump(kmeans, file) 47 | mlflow.log_artifact(DATA_DIR / ESTIMATOR_ARTIFACT) 48 | # y_kmeans = kmeans.predict(X) 49 | df["label"] = kmeans.labels_ 50 | Scaled_X = pd.DataFrame(Scaled_X, columns=["followers", "popularity"]) 51 | Scaled_X["label"] = kmeans.labels_ 52 | centers = kmeans.cluster_centers_ 53 | Scaled_X["name"] = list(df["name"]) 54 | generate_scatter_plot(Scaled_X, centers) 55 | mlflow.log_artifact(DATA_DIR / CLUSTERING_SCATTERPLOT_FILENAME) 56 | del Scaled_X["name"] 57 | ch_score = calinski_harabasz_score(Scaled_X, df["label"]) 58 | db_score = davies_bouldin_score(Scaled_X, df["label"]) 59 | s_score = silhouette_score(Scaled_X, df["label"]) 60 | mlflow.log_metric("calinski_harabasz_score", ch_score) 61 | mlflow.log_metric("davies_bouldin_score", db_score) 62 | mlflow.log_metric("silhouette_score", s_score) 63 | 64 | return df 65 | -------------------------------------------------------------------------------- /spotydash/cfg.py: -------------------------------------------------------------------------------- 1 | from pathlib import Path 2 | 3 | import spotipy 4 | from decouple import config 5 | from pkg_resources import resource_filename 6 | from spotipy import SpotifyOAuth 7 | 8 | _p = Path(resource_filename("spotydash", "/")) 9 | 10 | CLIENT_ID = config("CLIENT_ID") 11 | CLIENT_SECRET = config("CLIENT_SECRET") 12 | SPOTIPY_REDIRECT_URI = config("SPOTIPY_REDIRECT_URI") 13 | DB_CONNSTR = config("DB_CONNSTR") 14 | 15 | PG_CFG = { 16 | "dialect": config("POSTGRES_DIALECT", default="postgres", cast=str), 17 | "driver": config("POSTGRES_DRIVER", default="psycopg2", cast=str), 18 | "username": config("POSTGRES_USER", default="spotydash", cast=str), 19 | "password": config("POSTGRES_PASSWORD", default="spotydash", cast=str), 20 | "host": config("POSTGRES_HOST", default="postgres-db", cast=str), 21 | "port": config("POSTGRES_PORT", default=5432, cast=int), 22 | "database": config("POSTGRES_DB", default="db", cast=str), 23 | "db_type": config("POSTGRES_DB_TYPE", default="postgres", cast=str), 24 | } 25 | 26 | 27 | MLFLOW_CFG = { 28 | "host": config("MLFLOW_HOST", default="mlflow-server", cast=str), 29 | "ui_port": config("MLFLOW_UI_PORT", default=80, cast=int), 30 | "server_port": config("MLFLOW_SERVER_PORT", default=5000, cast=int), 31 | "username": config("MLFLOW_POSTGRES_USER", default="mlflow", cast=str), 32 | "password": config("MLFLOW_POSTGRES_PASSWORD", default="mlflow", cast=str), 33 | "database": config("MLFLOW_POSTGRES_DB", default="mlflowdb", cast=str), 34 | "artifact_root": config( 35 | "MLFLOW_ARTIFACT_ROOT", default="/spotydash/resources/tmp/mlruns/", cast=str 36 | ), 37 | "tracking_user": config("MLFLOW_TRACKING_USER", default="mlflow", cast=str), 38 | "tracking_password": config("MLFLOW_TRACKING_PASSWORD", default="mlflow", cast=str), 39 | } 40 | 41 | 42 | MLFLOW_TRACKING_URI = ( 43 | "http://{tracking_user}:{tracking_password}@{host}:{server_port}".format( 44 | **MLFLOW_CFG 45 | ) 46 | ) 47 | 48 | 49 | sp = spotipy.Spotify( 50 | auth_manager=SpotifyOAuth( 51 | client_id=CLIENT_ID, 52 | client_secret=CLIENT_SECRET, 53 | redirect_uri=SPOTIPY_REDIRECT_URI, 54 | scope="user-read-recently-played", 55 | ) 56 | ) 57 | 58 | KMEANS_PARAMS = {"n_clusters": 4, "random_state": 0} 59 | -------------------------------------------------------------------------------- /spotydash/alembic.ini: -------------------------------------------------------------------------------- 1 | # A generic, single database configuration. 2 | 3 | [alembic] 4 | # path to migration scripts 5 | script_location = alembic 6 | 7 | # template used to generate migration files 8 | # file_template = %%(rev)s_%%(slug)s 9 | 10 | # timezone to use when rendering the date 11 | # within the migration file as well as the filename. 12 | # string value is passed to dateutil.tz.gettz() 13 | # leave blank for localtime 14 | # timezone = 15 | 16 | # max length of characters to apply to the 17 | # "slug" field 18 | # truncate_slug_length = 40 19 | 20 | # set to 'true' to run the environment during 21 | # the 'revision' command, regardless of autogenerate 22 | # revision_environment = false 23 | 24 | # set to 'true' to allow .pyc and .pyo files without 25 | # a source .py file to be detected as revisions in the 26 | # versions/ directory 27 | # sourceless = false 28 | 29 | # version location specification; this defaults 30 | # to alembic/versions. When using multiple version 31 | # directories, initial revisions must be specified with --version-path 32 | # version_locations = %(here)s/bar %(here)s/bat alembic/versions 33 | 34 | # the output encoding used when revision files 35 | # are written from script.py.mako 36 | # output_encoding = utf-8 37 | 38 | sqlalchemy.url = 39 | 40 | 41 | [post_write_hooks] 42 | # post_write_hooks defines scripts or Python functions that are run 43 | # on newly generated revision scripts. See the documentation for further 44 | # detail and examples 45 | 46 | # format using "black" - use the console_scripts runner, against the "black" entrypoint 47 | # hooks=black 48 | # black.type=console_scripts 49 | # black.entrypoint=black 50 | # black.options=-l 79 51 | 52 | # Logging configuration 53 | [loggers] 54 | keys = root,sqlalchemy,alembic 55 | 56 | [handlers] 57 | keys = console 58 | 59 | [formatters] 60 | keys = generic 61 | 62 | [logger_root] 63 | level = WARN 64 | handlers = console 65 | qualname = 66 | 67 | [logger_sqlalchemy] 68 | level = WARN 69 | handlers = 70 | qualname = sqlalchemy.engine 71 | 72 | [logger_alembic] 73 | level = INFO 74 | handlers = 75 | qualname = alembic 76 | 77 | [handler_console] 78 | class = StreamHandler 79 | args = (sys.stderr,) 80 | level = NOTSET 81 | formatter = generic 82 | 83 | [formatter_generic] 84 | format = %(levelname)-5.5s [%(name)s] %(message)s 85 | datefmt = %H:%M:%S 86 | -------------------------------------------------------------------------------- /spotydash/dags/etl_songs_dag.py: -------------------------------------------------------------------------------- 1 | import itertools 2 | import logging 3 | import pickle 4 | from datetime import timedelta 5 | 6 | import pandas as pd 7 | from airflow.decorators import dag, task 8 | from airflow.utils.dates import days_ago 9 | 10 | from spotydash.constants import DATA_DIR 11 | from spotydash.dags.common_args import default_args 12 | from spotydash.extract import get_playlist_audio_features 13 | from spotydash.helpers import get_user_playlist 14 | from spotydash.load import load 15 | from spotydash.transform import transform_songs_data 16 | 17 | 18 | @dag( 19 | "song_ETL_taskflow", 20 | default_args=default_args, 21 | schedule_interval=timedelta(days=1), 22 | start_date=days_ago(2), 23 | tags=["ETL"], 24 | ) 25 | def taskflow_api_etl(): 26 | @task 27 | def extract_task(avoid_api=True): 28 | if avoid_api: 29 | logging.info("avoid_api = True, reading data from local storage..") 30 | with open(DATA_DIR / "audio_features.pickle", "rb") as handle: 31 | composed_audio_features = pickle.load(handle) 32 | with open(DATA_DIR / "ids.pickle", "rb") as handle: 33 | composed_ids = pickle.load(handle) 34 | else: 35 | playlists = get_user_playlist() 36 | list_of_audio = [] 37 | list_of_ids = [] 38 | for p in playlists: 39 | audio, ids = get_playlist_audio_features(p) 40 | list_of_audio.append(audio) 41 | list_of_ids.append(ids) 42 | 43 | composed_audio_features = list(itertools.chain.from_iterable(list_of_audio)) 44 | composed_ids = list(itertools.chain.from_iterable(list_of_ids)) 45 | 46 | return composed_audio_features, composed_ids 47 | 48 | @task 49 | def transform_task(result, avoid_api=True): 50 | logging.info(result) 51 | if avoid_api: 52 | return ( 53 | pd.read_csv(DATA_DIR / "transformed_songs_data.csv") 54 | .drop_duplicates(subset=["id"]) 55 | .to_json() 56 | ) 57 | else: 58 | return ( 59 | transform_songs_data(result[0], result[1]) 60 | .drop_duplicates(subset=["id"]) 61 | .to_json() 62 | ) 63 | 64 | @task 65 | def load_task(json_df): 66 | load(pd.read_json(json_df), "Song") 67 | 68 | df = extract_task() 69 | clean_df = transform_task(df) 70 | load_task(clean_df) 71 | 72 | 73 | taskflow_api_etl_dag = taskflow_api_etl() 74 | -------------------------------------------------------------------------------- /spotydash/alembic/env.py: -------------------------------------------------------------------------------- 1 | from logging.config import fileConfig 2 | 3 | from alembic import context 4 | from sqlalchemy import engine_from_config, pool 5 | 6 | from spotydash.cfg import DB_CONNSTR 7 | from spotydash.models import Base 8 | 9 | # this is the Alembic Config object, which provides 10 | # access to the values within the .ini file in use. 11 | config = context.config 12 | 13 | # Interpret the config file for Python logging. 14 | # This line sets up loggers basically. 15 | fileConfig(config.config_file_name) 16 | 17 | # this will overwrite the ini-file sqlalchemy.url path 18 | # with the path given in the config of the main code 19 | config.set_main_option("sqlalchemy.url", DB_CONNSTR) 20 | 21 | # add your model's MetaData object here 22 | # for 'autogenerate' support 23 | # from myapp import mymodel 24 | # target_metadata = mymodel.Base.metadata 25 | target_metadata = Base.metadata 26 | 27 | # other values from the config, defined by the needs of env.py, 28 | # can be acquired: 29 | # my_important_option = config.get_main_option("my_important_option") 30 | # ... etc. 31 | 32 | 33 | def run_migrations_offline(): 34 | """Run migrations in 'offline' mode. 35 | 36 | This configures the context with just a URL 37 | and not an Engine, though an Engine is acceptable 38 | here as well. By skipping the Engine creation 39 | we don't even need a DBAPI to be available. 40 | 41 | Calls to context.execute() here emit the given string to the 42 | script output. 43 | 44 | """ 45 | url = config.get_main_option("sqlalchemy.url") 46 | context.configure( 47 | url=url, 48 | target_metadata=target_metadata, 49 | literal_binds=True, 50 | dialect_opts={"paramstyle": "named"}, 51 | ) 52 | 53 | with context.begin_transaction(): 54 | context.run_migrations() 55 | 56 | 57 | def run_migrations_online(): 58 | """Run migrations in 'online' mode. 59 | 60 | In this scenario we need to create an Engine 61 | and associate a connection with the context. 62 | 63 | """ 64 | connectable = engine_from_config( 65 | config.get_section(config.config_ini_section), 66 | prefix="sqlalchemy.", 67 | poolclass=pool.NullPool, 68 | ) 69 | 70 | with connectable.connect() as connection: 71 | context.configure(connection=connection, target_metadata=target_metadata) 72 | 73 | with context.begin_transaction(): 74 | context.run_migrations() 75 | 76 | 77 | if context.is_offline_mode(): 78 | run_migrations_offline() 79 | else: 80 | run_migrations_online() 81 | -------------------------------------------------------------------------------- /spotydash/etl_songs_data.py: -------------------------------------------------------------------------------- 1 | """ ETL for songs data. 2 | """ 3 | import itertools 4 | import logging 5 | import pickle 6 | from datetime import datetime, timedelta 7 | 8 | import pandas as pd 9 | 10 | from spotydash.constants import DATA_DIR 11 | from spotydash.extract import get_playlist_audio_features 12 | from spotydash.helpers import get_user_playlist 13 | from spotydash.load import load 14 | from spotydash.transform import transform_songs_data 15 | 16 | 17 | def run_etl_songs_data(execution_date: datetime, avoid_api=True): 18 | """Run Extract-Load-Transform process. 19 | 20 | Parameters 21 | ---------- 22 | execution_date : Datetime Object 23 | Execution date / Date to query. 24 | avoid_api : bool 25 | Flag to avoid call to Spotify API. 26 | 27 | """ 28 | # Extract 29 | playlists = get_user_playlist() 30 | list_of_dfs = [] 31 | for p in playlists: 32 | logging.info(f"Getting info about {p}") 33 | if avoid_api: 34 | logging.info("avoid_api = True, reading data from local storage..") 35 | with open(DATA_DIR / "audio_features.pickle", "rb") as handle: 36 | composed_audio_features = pickle.load(handle) 37 | with open(DATA_DIR / "ids.pickle", "rb") as handle: 38 | composed_ids = pickle.load(handle) 39 | else: 40 | playlists = get_user_playlist() 41 | list_of_audio = [] 42 | list_of_ids = [] 43 | for p in playlists: 44 | audio, ids = get_playlist_audio_features(p) 45 | list_of_audio.append(audio) 46 | list_of_ids.append(ids) 47 | 48 | composed_audio_features = list(itertools.chain.from_iterable(list_of_audio)) 49 | composed_ids = list(itertools.chain.from_iterable(list_of_ids)) 50 | 51 | logging.info(f"Extracted {len(composed_audio_features)} registers") 52 | if avoid_api: 53 | clean_df = pd.read_csv(DATA_DIR / "transformed_songs_data.csv") 54 | else: 55 | clean_df = transform_songs_data(composed_audio_features, composed_ids) 56 | logging.info(f"{clean_df.shape[0]} registers after transform") 57 | list_of_dfs.append(clean_df) 58 | 59 | results = pd.concat(list_of_dfs) 60 | results = results.drop_duplicates(subset=["id"]) 61 | # results = fit_clustering(compose_df) 62 | 63 | # Load 64 | load(results, "Song") 65 | logging.info("Done") 66 | 67 | 68 | if __name__ == "__main__": 69 | date = datetime.today() - timedelta(days=1) 70 | run_etl_songs_data(date) 71 | -------------------------------------------------------------------------------- /spotydash/tests/test_dag_validation.py: -------------------------------------------------------------------------------- 1 | from airflow.models import DagBag 2 | 3 | from spotydash.constants import DAGS_DIR 4 | 5 | 6 | class TestDagValidation: 7 | 8 | LOAD_SECOND_THRESHOLD = 2 9 | EXPECTED_NUMBER_OF_DAGS = 4 10 | DAG_BAG_TEST = DagBag(dag_folder=DAGS_DIR) 11 | 12 | def test_import_dags(self): 13 | """ 14 | Verify that Airflow is able to import all DAGs 15 | in the repo 16 | - check for typos 17 | - check for cycles 18 | """ 19 | assert ( 20 | len(self.DAG_BAG_TEST.import_errors) == 0 21 | ), "DAG failures detected! Got: {}".format(self.DAG_BAG_TEST.import_errors) 22 | 23 | def test_time_import_dags(self): 24 | """ 25 | Verify that DAGs load fast enough 26 | - check for loading time 27 | """ 28 | stats = self.DAG_BAG_TEST.dagbag_stats 29 | slow_dags = list( 30 | filter(lambda f: f.duration.seconds > self.LOAD_SECOND_THRESHOLD, stats) 31 | ) 32 | res = ", ".join(map(lambda f: f.file[1:], slow_dags)) 33 | 34 | assert ( 35 | len(slow_dags) == 0 36 | ), "The following DAGs take more than {0}s to load: {1}".format( 37 | self.LOAD_SECOND_THRESHOLD, res 38 | ) 39 | 40 | def test_default_args_retries(self): 41 | """ 42 | Verify that DAGs have the required number of retries 43 | - Check retries 44 | """ 45 | for dag_id, dag in self.DAG_BAG_TEST.dags.items(): 46 | retries = dag.default_args.get("retries", None) 47 | assert ( 48 | retries is not None 49 | ), "You must specify a number of retries in the DAG: {0}".format(dag_id) 50 | 51 | def test_default_args_retry_delay(self): 52 | """ 53 | Verify that DAGs have the required retry_delay expressed in seconds 54 | - Check retry_delay 55 | """ 56 | for dag_id, dag in self.DAG_BAG_TEST.dags.items(): 57 | retry_delay = dag.default_args.get("retry_delay", None) 58 | assert ( 59 | retry_delay is not None 60 | ), "You must specify a retry delay (seconds) in the DAG: {0}".format(dag_id) 61 | 62 | def test_number_of_dags(self): 63 | """ 64 | Verify if there is the right number of DAGs in the dag folder 65 | - Check number of dags 66 | """ 67 | stats = self.DAG_BAG_TEST.dagbag_stats 68 | dag_num = sum([o.dag_num for o in stats]) 69 | assert ( 70 | dag_num == self.EXPECTED_NUMBER_OF_DAGS 71 | ), "Wrong number of dags, {0} expected got {1} (Can be due to cycles!)".format( 72 | self.EXPECTED_NUMBER_OF_DAGS, dag_num 73 | ) 74 | -------------------------------------------------------------------------------- /spotydash/resources/data/transformed_artists_data.csv: -------------------------------------------------------------------------------- 1 | id,name,followers,popularity,genre,url 2 | 0UAAJKwQZz8jVDoVtly8NA,Massacre,52523,47,"['argentine indie', 'argentine metal', 'argentine punk', 'argentine rock']",https://open.spotify.com/artist/0UAAJKwQZz8jVDoVtly8NA 3 | 5R6YR0pasdxlynyq0Abq7x,Fabiana Cantilo,258246,59,"['argentine rock', 'argentine telepop', 'latin alternative', 'latin rock', 'rock en espanol', 'rock nacional']",https://open.spotify.com/artist/5R6YR0pasdxlynyq0Abq7x 4 | 6MxyNXnnmwQwdW2PD0gXYO,Bersuit Vergarabat,567303,66,"['argentine rock', 'latin alternative', 'latin rock', 'rock en espanol', 'rock nacional', 'ska argentino']",https://open.spotify.com/artist/6MxyNXnnmwQwdW2PD0gXYO 5 | 1QOmebWGB6FdFtW7Bo3F0W,Gustavo Cerati,2529052,74,"['argentine rock', 'latin alternative', 'latin rock', 'rock en espanol']",https://open.spotify.com/artist/1QOmebWGB6FdFtW7Bo3F0W 6 | 1SykQGBiBwkQ1fcGpJ1BJt,Los Tipitos,338463,57,"['argentine rock', 'latin alternative', 'latin rock', 'rock en espanol', 'rock nacional']",https://open.spotify.com/artist/1SykQGBiBwkQ1fcGpJ1BJt 7 | 5me0Irg2ANcsgc93uaYrpb,The Notorious B.I.G.,6357124,84,"['east coast hip hop', 'gangster rap', 'hardcore hip hop', 'hip hop', 'rap']",https://open.spotify.com/artist/5me0Irg2ANcsgc93uaYrpb 8 | 3KsdiCqV04TOBhPWmk7u90,JAF,59406,44,"['argentine rock', 'latin metal', 'rock en espanol', 'rock nacional']",https://open.spotify.com/artist/3KsdiCqV04TOBhPWmk7u90 9 | 5VQCk9RiLwri99OgOT34kq,Vilma Palma e Vampiros,877771,67,"['argentine rock', 'latin', 'latin alternative', 'latin pop', 'latin rock', 'rock en espanol']",https://open.spotify.com/artist/5VQCk9RiLwri99OgOT34kq 10 | 2HcwFjNelS49kFbfvMxQYw,Robbie Williams,2191809,77,"['dance pop', 'dance rock', 'europop', 'pop']",https://open.spotify.com/artist/2HcwFjNelS49kFbfvMxQYw 11 | 0ExYzTb7raTAfsXPtiI5vq,Nicole Kidman,29954,60,['hollywood'],https://open.spotify.com/artist/0ExYzTb7raTAfsXPtiI5vq 12 | 69MEO1AADKg1IZrq2XLzo5,UB40,1713264,74,"['reggae fusion', 'uk reggae']",https://open.spotify.com/artist/69MEO1AADKg1IZrq2XLzo5 13 | 4yiQZ8tQPux8cPriYMWUFP,Gwen Stefani,4674661,79,"['dance pop', 'hip pop', 'pop', 'post-teen pop', 'urban contemporary']",https://open.spotify.com/artist/4yiQZ8tQPux8cPriYMWUFP 14 | 1G9G7WwrXka3Z1r7aIDjI7,Outkast,1661109,80,"['atl hip hop', 'dirty south rap', 'hip hop', 'rap', 'southern hip hop']",https://open.spotify.com/artist/1G9G7WwrXka3Z1r7aIDjI7 15 | 7dGJo4pcD2V6oG8kP0tJRR,Eminem,44496079,95,"['detroit hip hop', 'hip hop', 'rap']",https://open.spotify.com/artist/7dGJo4pcD2V6oG8kP0tJRR 16 | 2mpeljBig2IXLXRAFO9AAs,Dido,1174522,74,"['dance pop', 'new wave pop', 'pop rock']",https://open.spotify.com/artist/2mpeljBig2IXLXRAFO9AAs 17 | 7KMqksf0UMdyA0UCf4R3ux,James Blunt,2403193,77,"['neo mellow', 'pop', 'pop rock']",https://open.spotify.com/artist/7KMqksf0UMdyA0UCf4R3ux 18 | -------------------------------------------------------------------------------- /docker/control_docker.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | # Read env vars 4 | parent_dir="$(dirname "$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)")" 5 | if [ -f "$parent_dir/.env" ]; then 6 | set -a 7 | # shellcheck disable=SC1091 8 | source "$parent_dir/.env" 9 | set +a 10 | else 11 | echo ".env file is not in project root" 12 | exit 1 13 | fi 14 | 15 | 16 | if [[ -n "$2" ]]; then 17 | artifact="$2" 18 | fi 19 | 20 | 21 | 22 | function pg_connect { 23 | pgcli -h localhost -p "$POSTGRES_PORT" -U "$POSTGRES_USER" -d "$POSTGRES_DB" 24 | } 25 | 26 | # Execution of base container (defined in Dockerfile) 27 | function exec_base { 28 | docker container exec -ti "$COMPOSE_PROJECT_NAME"_base_1 /bin/bash 29 | } 30 | 31 | # Check users list of Airflow 32 | function airflow_ls { 33 | echo 'Checking users list of Airflow..' 34 | docker exec -it "$COMPOSE_PROJECT_NAME"_airflow-webserver_1 poetry run airflow users list 35 | } 36 | 37 | 38 | # Create an admin user in Superset 39 | function superset_create_admin { 40 | echo 'Creating an admin user..' 41 | docker exec -it "$COMPOSE_PROJECT_NAME"_superset_1 superset-init 42 | } 43 | 44 | # Check users list of Superset 45 | function superset_ls { 46 | echo 'Checking users list of Superset..' 47 | docker exec -it "$COMPOSE_PROJECT_NAME"_superset_1 flask fab list-users 48 | } 49 | 50 | # Export all dashboards/datasources defined in Superset service. It requires an argument to export that. 51 | function superset_export () { 52 | case "$artifact" in 53 | *"dashboards"*) 54 | echo 'Creating directory for dashboards..' 55 | mkdir -p "$SUPERSET_DASHBOARDS_PATH" 56 | echo 'Exporting dashboards..' 57 | docker exec "$COMPOSE_PROJECT_NAME"_superset_1 superset export_dashboards -f "$SUPERSET_DASHBOARDS_PATH"/dashboard.json 58 | echo "All the dashboards in Superset were exported." 59 | ;; 60 | *"datasources"*) 61 | echo 'Creating directory for datasources..' 62 | mkdir -p "$SUPERSET_DATASOURCES_PATH" 63 | echo 'Exporting datasources..' 64 | docker exec "$COMPOSE_PROJECT_NAME"_superset_1 superset export_datasources -f "$SUPERSET_DATASOURCES_PATH"/datasources.yaml 65 | echo "All the datasources in Superset were exported." 66 | ;; 67 | *) 68 | printf "ERROR: Missing command. Available commands: \n dashboards, datasources \n" 69 | exit 1 70 | ;; 71 | esac 72 | } 73 | 74 | 75 | case "$1" in 76 | pg_connect) 77 | pg_connect 78 | ;; 79 | exec_base) 80 | exec_base 81 | ;; 82 | airflow_ls) 83 | airflow_ls 84 | ;; 85 | superset_create_admin) 86 | superset_create_admin 87 | ;; 88 | superset_ls) 89 | superset_ls 90 | ;; 91 | superset_export) 92 | superset_export 93 | ;; 94 | *) 95 | printf "ERROR: Missing command. Available commands: \n pg_connect, exec_base, airflow_ls, superset_create_admin, superset_ls, superset_export\n" 96 | exit 1 97 | ;; 98 | esac 99 | -------------------------------------------------------------------------------- /superset/datasources/datasources.yaml: -------------------------------------------------------------------------------- 1 | - columns: 2 | - column_name: label 3 | type: BIGINT 4 | - column_name: popularity 5 | type: BIGINT 6 | - column_name: followers 7 | type: BIGINT 8 | - column_name: name 9 | type: TEXT 10 | - column_name: id 11 | type: TEXT 12 | - column_name: genre 13 | type: TEXT 14 | - column_name: url 15 | type: TEXT 16 | metrics: 17 | - expression: COUNT(*) 18 | metric_name: count 19 | metric_type: count 20 | verbose_name: COUNT(*) 21 | schema: public 22 | table_name: Artist 23 | - columns: 24 | - column_name: danceability 25 | type: DOUBLE PRECISION 26 | - column_name: acousticness 27 | type: DOUBLE PRECISION 28 | - column_name: valence 29 | type: DOUBLE PRECISION 30 | - column_name: instrumentalness 31 | type: DOUBLE PRECISION 32 | - column_name: speechiness 33 | type: DOUBLE PRECISION 34 | - column_name: loudness 35 | type: DOUBLE PRECISION 36 | - column_name: energy 37 | type: DOUBLE PRECISION 38 | - column_name: liveness 39 | type: DOUBLE PRECISION 40 | - column_name: tempo 41 | type: DOUBLE PRECISION 42 | - column_name: name 43 | type: VARCHAR(255) 44 | - column_name: artist 45 | type: VARCHAR(255) 46 | - column_name: id 47 | type: VARCHAR(255) 48 | - column_name: uri 49 | type: VARCHAR(255) 50 | - column_name: duration_ms 51 | type: BIGINT 52 | - column_name: time_signature 53 | type: BIGINT 54 | - column_name: mode 55 | type: BIGINT 56 | - column_name: key 57 | type: BIGINT 58 | metrics: 59 | - expression: COUNT(*) 60 | metric_name: count 61 | metric_type: count 62 | verbose_name: COUNT(*) 63 | schema: public 64 | table_name: Song 65 | - columns: 66 | - column_name: avg 67 | type: FLOAT 68 | - column_name: artist 69 | type: STRING 70 | metrics: 71 | - expression: count(*) 72 | metric_name: count 73 | schema: public 74 | sql: '-- Note: Unless you save your query, these tabs will NOT persist if you clear 75 | your cookies or change browsers. 76 | 77 | 78 | SELECT artist, AVG(energy) AS avg_energy FROM "Song" GROUP BY artist ORDER BY 79 | avg DESC' 80 | table_name: AVG_Energy_by_Artist 81 | - columns: 82 | - column_name: avg_energy 83 | type: FLOAT 84 | - column_name: artist 85 | type: STRING 86 | metrics: 87 | - expression: count(*) 88 | metric_name: count 89 | schema: public 90 | sql: "-- Note: Unless you save your query, these tabs will NOT persist if you clear\ 91 | \ your cookies or change browsers.\n\nSELECT artist, AVG(energy) AS avg_energy\ 92 | \ \nFROM \"Song\" \nGROUP BY artist \nORDER BY avg_energy DESC" 93 | table_name: AVG_Energy_Artists 94 | - columns: 95 | - column_name: label 96 | type: INT 97 | - column_name: avg_followers 98 | metrics: 99 | - expression: count(*) 100 | metric_name: count 101 | schema: public 102 | sql: '-- Note: Unless you save your query, these tabs will NOT persist if you clear 103 | your cookies or change browsers. 104 | 105 | 106 | SELECT label, AVG(followers) as avg_followers from "Artist" GROUP BY label' 107 | table_name: AVG_followers_Artists 108 | - columns: 109 | - column_name: label 110 | type: INT 111 | - column_name: avg_popularity 112 | metrics: 113 | - expression: count(*) 114 | metric_name: count 115 | schema: public 116 | sql: '-- Note: Unless you save your query, these tabs will NOT persist if you clear 117 | your cookies or change browsers. 118 | 119 | 120 | SELECT label, AVG(popularity) as avg_popularity from "Artist" GROUP BY label' 121 | table_name: AVG_popularity_Artist 122 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Inspirado en 2 | Karolina Sowinska - Data Engineering (Inglés) 3 | https://www.youtube.com/playlist?list=PLNkCniHtd0PNM4NZ5etgYMw4ojid0Aa6i 4 | 5 | CodinEric - Ejemplo de ETL con Spotify y Python (Español) 6 | https://www.youtube.com/watch?v=eg8t2-E69ew&t=96s&ab_channel=CodinEric 7 | 8 | Juan de Dios Santos - Is my Spotify music boring? An analysis involving music, data, and machine learning (Inglés) 9 | https://towardsdatascience.com/is-my-spotify-music-boring-an-analysis-involving-music-data-and-machine-learning-47550ae931de 10 | 11 | 12 | # Obtener credenciales de Spotify - IMPORTANTE PARA USAR LA API 13 | Utilizar el siguiente link para crear una aplicación dentro de Spotify para poder generar un token de acceso. 14 | 15 | https://developer.spotify.com/dashboard/login 16 | 17 | # Documentación de los métodos utilizados: 18 | - Artistas: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-an-artist 19 | - Tracks/songs: https://developer.spotify.com/documentation/web-api/reference/#endpoint-get-several-audio-features 20 | - Playlist: https://developer.spotify.com/documentation/web-api/reference/#category-playlists 21 | 22 | # Extracción de datos 23 | Utilizaremos la API de Spotify para extraer datos desde nuestra cuenta personal. Entre los datos que podemos obtener de Spotify tenemos: 24 | * Artista 25 | * Track 26 | * Ultimos tracks reproducidos 27 | * Playlists dado un user 28 | * Atributos de sonido 29 | 30 | # Transformación de datos 31 | Realizaremos procesos para extraer algunos campos a partir de los datos obtenidos desde la API de Spotify. Los mismos están definidos en el script `transform.py`. 32 | 33 | # Entrenamiento del modelo. 34 | Entrenaremos un modelo de K-means clustering con una configuración medio al azar por una cuestión de simplicidad. Este modelo está definido en el script `clustering.py`. El modelo a su vez es registrado junto a sus métricas, hiperparámetros y artefactos de interés por MLflow. 35 | 36 | # Carga de datos 37 | Cargar los datos transformados o los resultados de preddiciones de un modelo de ML en una base de datos PostgreSQL usando la librería `pangres`. 38 | 39 | 40 | # COMO HACER EL SETUP DEL PROYECTO 41 | Testeado con las versiones `19.03.3` de Docker y `1.28.4` de Docker Compose. 42 | 43 | Nota: Asegurarte de tener bien configurado el archivo `.env` (Mirar más abajo). 44 | 45 | Estamos utilizando `docker-compose` para correr este proyecto y `poetry` para crear nuestro propio virtual environment y gestionar nuestras librerías Python. 46 | 47 | Primero, tenenemos que buildear la imagen. Para ello iremos a la carpeta `docker` y correremos el siguiente comando en una consola (ya sea WSL2 o consola Bash): 48 | 49 | ```bash 50 | docker-compose --env-file ../.env build 51 | ``` 52 | 53 | Y luego, para levantar los servicios definidos en `docker-compose.yaml` corremos: 54 | ```bash 55 | docker-compose --env-file ../.env up 56 | ``` 57 | 58 | Nota: Es recomendable reiniciar los servicios de airflow dado que estamos haciendo una primera configuración, para ello hacemos: 59 | 60 | ```bash 61 | docker restart spotydash_airflow-scheduler_1 62 | ``` 63 | 64 | ```bash 65 | docker restart spotydash_airflow-webserver_1 66 | ``` 67 | 68 | ## Ejemplo de archivo .env (Necesario para la correcta configuración del proyecto) 69 | Por favor, mirar el archivo `sample_dot_env` en la carpeta del proyecto. 70 | 71 | 72 | # DASHBOARD 73 | El dashboard está construido con la plataforma de visualización Apache Superset (Para más referenciar sobre cómo configurar un dashboard en 5 minutos usando Google Sheets como fuente de datos ver el siguiente tweet https://twitter.com/AldoEscobarLVP/status/1399163240735821825) 74 | 75 | ![Superset Screen](./docs/screen_superset.png) 76 | 77 | 78 | # ETLS - AIRFLOW 79 | Este proyecto tiene 2 DAGs: 80 | 81 | * songs_etl: Contiene un ETL para los datos de las canciones. 82 | * artists_etfl: Contiene un ETFL para datos de artistas. 83 | 84 | ## SOBRE EL ARCHIVO .CACHE 85 | El archivo `.cache` es generado por la API de Spotify cuando entras en la URI de redireccionamiento definida en Spotify. Es posible generarlo corriendo `etl_songs_data.py` o `etfl_artists_data.py` (El método`current_user_recently_played` de la API de Spotify lo genera). 86 | Para correr los ETLs es necesario tener este file en `/spotydash/spotydash/` (En caso de correr el script `etl_songs_data.py` / `etfl_artists_data.py`) o moverlo a la carpeta `/spotify_dash/spotydash/dags/` para correr los DAGs de Airflow. Para más referencias mirar el video de CodinEric. 87 | 88 | # COMO ACCEDER A POSTGRESQL 89 | Podemos correr queries a PostgreSQL, para ello, corremos lo siguiente (asegurarse de tener los servicios de docker levantados): 90 | 91 | ```bash 92 | docker exec -it spotydash_postgres-db_1 psql -d spotipy -U spoty -p spoty -p 5432 93 | ``` 94 | -------------------------------------------------------------------------------- /spotydash/transform.py: -------------------------------------------------------------------------------- 1 | """ Transform module. 2 | 3 | It contains transform functions by getting raw data from Spotify API. 4 | """ 5 | import logging 6 | from typing import Dict, List 7 | 8 | import pandas as pd 9 | from pandera import check_output 10 | 11 | from spotydash.cfg import sp 12 | from spotydash.constants import DATA_DIR 13 | from spotydash.schemas import SONG_COLUMNS 14 | from spotydash.validate_schemas import null_schema_artists_data 15 | 16 | pd.set_option("display.max_columns", None) 17 | pd.set_option("display.max_colwidth", None) 18 | 19 | 20 | def clean_songs_without_genre(_df): 21 | """Clean songs data without genre 22 | 23 | Parameters 24 | ---------- 25 | _df : pd.DataFrame 26 | Dataframe to be cleaned. 27 | 28 | Returns 29 | ------- 30 | df_without_genre : pd.DataFrame 31 | Dataframe that contains not empty genre data. 32 | 33 | """ 34 | df_with_genre = _df[_df.astype(str)["genre"] != "[]"] 35 | logging.info(f"We had {len(_df)} rows, now we have {len(df_with_genre)} rows") 36 | return df_with_genre 37 | 38 | 39 | def transform_songs_data(audio_features: List, ids: List, avoid_api=True): 40 | """Transform songs data. 41 | 42 | Parameters 43 | ---------- 44 | audio_features : list(JSON) 45 | List that contains info about songs. 46 | ids : list(str) 47 | List that containts songs ids. 48 | 49 | Returns 50 | ------- 51 | df : pd.DataFrame 52 | Transformed DF. 53 | 54 | """ 55 | 56 | features_list = [] 57 | counter = 0 58 | for features in [x for x in audio_features if x is not None]: 59 | song_data = sp.track(ids[counter]) 60 | song_id = song_data["id"] 61 | name = song_data["name"] 62 | if len(song_data["artists"]) > 0: 63 | artists = song_data["artists"][0]["name"] 64 | else: 65 | artists = song_data["artists"]["name"] 66 | features_list.append( 67 | [ 68 | song_id, 69 | name, 70 | artists, 71 | features["energy"], 72 | features["liveness"], 73 | features["tempo"], 74 | features["speechiness"], 75 | features["acousticness"], 76 | features["instrumentalness"], 77 | features["time_signature"], 78 | features["danceability"], 79 | features["key"], 80 | features["duration_ms"], 81 | features["loudness"], 82 | features["valence"], 83 | features["mode"], 84 | features["uri"], 85 | ] 86 | ) 87 | counter += 1 88 | 89 | df = pd.DataFrame( 90 | features_list, 91 | columns=SONG_COLUMNS, 92 | ) 93 | df = clean_songs_without_genre(df) 94 | return df 95 | 96 | 97 | @check_output(null_schema_artists_data) 98 | def transform_artist_data(raw_data: Dict, avoid_api=True): 99 | """Transform artists data. 100 | 101 | Parameters 102 | ---------- 103 | raw_data : dict 104 | Extracted data from Spotify API. 105 | avoid_api : boolean 106 | Flag to avoid Spotify API by reading data from local storage. 107 | 108 | Returns 109 | ------- 110 | df : pd.DataFrame 111 | Transformed/formatted DF. 112 | 113 | """ 114 | logging.info("Running transform for artist data") 115 | if avoid_api: 116 | df = pd.read_csv(DATA_DIR / "transformed_artists_data.csv") 117 | return df 118 | json_results = [] 119 | artists = [] 120 | ids = [] 121 | names = [] 122 | followers = [] 123 | popularity = [] 124 | genres = [] 125 | urls = [] 126 | 127 | for item in raw_data["items"]: 128 | artists_data = item["track"]["artists"] 129 | for art in artists_data: 130 | artists.append(art["id"]) 131 | for art in artists: 132 | json_results.append(sp.artist(f"{art}")) 133 | 134 | for i in json_results: 135 | ids.append(i["id"]) 136 | names.append(i["name"]) 137 | followers.append(i["followers"]["total"]) 138 | popularity.append(i["popularity"]) 139 | genres.append(i["genres"]) 140 | urls.append(i["external_urls"]["spotify"]) 141 | 142 | df = pd.DataFrame() 143 | df["id"] = ids 144 | df["name"] = names 145 | df["followers"] = followers 146 | df["popularity"] = popularity 147 | df["genre"] = genres 148 | df["url"] = urls 149 | df = clean_songs_without_genre(df) 150 | df = df.drop_duplicates(subset=["id"]) 151 | logging.info("TRANSFORMED DF") 152 | logging.info(df) 153 | return df 154 | -------------------------------------------------------------------------------- /docker/docker-compose.yaml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | 4 | # POSTGRES DB 5 | postgres-db: 6 | image: postgres:13.2 7 | environment: 8 | POSTGRES_INITDB_ARGS: "--encoding=UTF-8" 9 | POSTGRES_MULTIPLE_DATABASES: "${POSTGRES_DB},${AIRFLOW_POSTGRES_DB},${MLFLOW_POSTGRES_DB},${SUPERSET_POSTGRES_DB}" 10 | POSTGRES_USER: ${POSTGRES_USER} 11 | POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} 12 | TZ: UTC 13 | volumes: 14 | - postgres-data:/var/lib/postgresql/data 15 | - ./pg-init-scripts:/docker-entrypoint-initdb.d 16 | expose: 17 | - ${POSTGRES_PORT} 18 | ports: 19 | - ${POSTGRES_PORT}:5432 20 | networks: 21 | - spotydash-network 22 | restart: always 23 | 24 | # waitfor-postgres-db 25 | waitfor-postgres-db: 26 | image: dadarek/wait-for-dependencies 27 | depends_on: 28 | - postgres-db 29 | command: postgres-db:5432 30 | networks: 31 | - spotydash-network 32 | 33 | 34 | base: 35 | image: spotydash_base 36 | build: 37 | context: ../ 38 | dockerfile: docker/Dockerfile 39 | # command: bash -c "poetry run python spotydash/models.py" 40 | depends_on: 41 | - postgres-db 42 | volumes: 43 | - ../:/spotydash/ 44 | - type: bind 45 | source: ../.env 46 | target: /spotydash/.env 47 | networks: 48 | - spotydash-network 49 | 50 | # AIRFLOW WEBSERVER 51 | airflow-webserver: 52 | image: spotydash_base 53 | restart: always 54 | depends_on: 55 | - waitfor-postgres-db 56 | environment: 57 | AIRFLOW__CORE__BASE_LOG_FOLDER: ${AIRFLOW_LOG_FOLDER} 58 | AIRFLOW__CORE__DAGS_FOLDER: ${AIRFLOW_DAG_FOLDER} 59 | AIRFLOW__CORE__EXECUTOR: LocalExecutor 60 | AIRFLOW__CORE__LOAD_EXAMPLES: 0 61 | AIRFLOW__CORE__SQL_ALCHEMY_CONN: "postgresql+psycopg2://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${COMPOSE_PROJECT_NAME}_${POSTGRES_HOST}_1:5432/${AIRFLOW_POSTGRES_DB}" 62 | AIRFLOW__WEBSERVER__WEB_SERVER_PORT: ${AIRFLOW_PORT} 63 | AIRFLOW_CREATE_USER_CONN: ${AIRFLOW_CREATE_USER_CONN} 64 | AIRFLOW_EMAIL: ${AIRFLOW_EMAIL} 65 | AIRFLOW_FIRST: ${AIRFLOW_FIRST} 66 | AIRFLOW_LAST: ${AIRFLOW_LAST} 67 | AIRFLOW_USER: ${AIRFLOW_USER} 68 | AIRFLOW_PASSWORD: ${AIRFLOW_PASSWORD} 69 | AIRFLOW_ROLE: ${AIRFLOW_ROLE} 70 | TZ: UTC 71 | ports: 72 | - ${AIRFLOW_PORT}:${AIRFLOW_PORT} 73 | entrypoint: bash /spotydash/docker/entrypoints/start_airflow_webserver.sh 74 | healthcheck: 75 | test: ["CMD-SHELL", "[ -f /usr/local/airflow/airflow-webserver.pid ]"] 76 | interval: 60s 77 | timeout: 30s 78 | retries: 3 79 | volumes: 80 | - ../spotydash/dags/logs/:${AIRFLOW_LOG_FOLDER} 81 | - ../spotydash/dags/:${AIRFLOW_DAG_FOLDER} 82 | - ../:/spotydash/ 83 | - type: bind 84 | source: ../.env 85 | target: /spotydash/.env 86 | working_dir: /spotydash/ 87 | networks: 88 | - spotydash-network 89 | 90 | # WAITFOR-WEBSERVER SERVICE 91 | waitfor-webserver: 92 | image: dadarek/wait-for-dependencies 93 | depends_on: 94 | - airflow-webserver 95 | command: airflow-webserver:${AIRFLOW_PORT} 96 | networks: 97 | - spotydash-network 98 | 99 | # AIRFLOW SCHEDULER 100 | airflow-scheduler: 101 | image: spotydash_base 102 | restart: always 103 | depends_on: 104 | - waitfor-webserver 105 | environment: 106 | AIRFLOW__CORE__BASE_LOG_FOLDER: ${AIRFLOW_LOG_FOLDER} 107 | AIRFLOW__CORE__DAGS_FOLDER: ${AIRFLOW_DAG_FOLDER} 108 | AIRFLOW__CORE__EXECUTOR: LocalExecutor 109 | AIRFLOW__CORE__LOAD_EXAMPLES: 0 110 | AIRFLOW__CORE__SQL_ALCHEMY_CONN: "postgresql+psycopg2://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${COMPOSE_PROJECT_NAME}_${POSTGRES_HOST}_1:5432/${AIRFLOW_POSTGRES_DB}" 111 | TZ: UTC 112 | command: poetry run airflow scheduler 113 | volumes: 114 | - ../spotydash/dags/logs/:${AIRFLOW_LOG_FOLDER} 115 | - ../spotydash/dags/:${AIRFLOW_DAG_FOLDER} 116 | - ../:/spotydash/ 117 | - type: bind 118 | source: ../.env 119 | target: /spotydash/.env 120 | working_dir: /spotydash/ 121 | networks: 122 | - spotydash-network 123 | 124 | # MLFLOW SERVER 125 | mlflow-server: 126 | image: spotydash_base 127 | ports: 128 | - ${MLFLOW_SERVER_PORT}:${MLFLOW_SERVER_PORT} 129 | environment: 130 | DB_URI: postgresql+psycopg2://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${COMPOSE_PROJECT_NAME}_${POSTGRES_HOST}_1:5432/${MLFLOW_POSTGRES_DB} 131 | MLFLOW_ARTIFACT_ROOT: ${MLFLOW_ARTIFACT_ROOT} 132 | MLFLOW_TRACKING_USERNAME: ${MLFLOW_TRACKING_USER} 133 | MLFLOW_TRACKING_PASSWORD: ${MLFLOW_TRACKING_PASSWORD} 134 | MLFLOW_SERVER_HOST: ${MLFLOW_SERVER_HOST} 135 | MLFLOW_SERVER_PORT: ${MLFLOW_SERVER_PORT} 136 | TZ: UTC 137 | restart: always 138 | depends_on: 139 | - waitfor-postgres-db 140 | volumes: 141 | - type: bind 142 | source: ../ 143 | target: /spotydash/ 144 | - type: bind 145 | source: ../.env 146 | target: /spotydash/.env 147 | entrypoint: bash /spotydash/docker/entrypoints/start_mlflow_server.sh 148 | networks: 149 | - spotydash-network 150 | 151 | # MLFLOW UI 152 | mlflow-ui: 153 | image: spotydash_base 154 | ports: 155 | - ${MLFLOW_UI_PORT}:${MLFLOW_UI_PORT} 156 | environment: 157 | DB_URI: postgresql+psycopg2://${POSTGRES_USER}:${POSTGRES_PASSWORD}@${COMPOSE_PROJECT_NAME}_${POSTGRES_HOST}_1:5432/${MLFLOW_POSTGRES_DB} 158 | MLFLOW_ARTIFACT_ROOT: ${MLFLOW_ARTIFACT_ROOT} 159 | MLFLOW_TRACKING_USERNAME: ${MLFLOW_TRACKING_USER} 160 | MLFLOW_TRACKING_PASSWORD: ${MLFLOW_TRACKING_PASSWORD} 161 | MLFLOW_UI_HOST: ${MLFLOW_UI_HOST} 162 | MLFLOW_UI_PORT: ${MLFLOW_UI_PORT} 163 | TZ: UTC 164 | restart: always 165 | depends_on: 166 | - mlflow-server 167 | volumes: 168 | - type: bind 169 | source: ../ 170 | target: /spotydash/ 171 | - type: bind 172 | source: ../.env 173 | target: /spotydash/.env 174 | entrypoint: bash /spotydash/docker/entrypoints/start_mlflow_ui.sh 175 | networks: 176 | - spotydash-network 177 | 178 | # SUPERSET 179 | superset: 180 | image: amancevice/superset 181 | entrypoint: bash /docker/entrypoints/start_superset.sh 182 | restart: always 183 | depends_on: 184 | - postgres-db 185 | - redis 186 | environment: 187 | POSTGRES_USER: ${POSTGRES_USER} 188 | POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} 189 | POSTGRES_HOST: ${POSTGRES_HOST} 190 | POSTGRES_PORT: ${POSTGRES_PORT} 191 | POSTGRES_DB: ${POSTGRES_DB} 192 | COMPOSE_PROJECT_NAME: ${COMPOSE_PROJECT_NAME} 193 | FLASK_APP: ${FLASK_APP} 194 | SUPERSET_CREATE_USER: ${SUPERSET_CREATE_USER} 195 | SUPERSET_EMAIL: ${SUPERSET_EMAIL} 196 | SUPERSET_FIRSTNAME: ${SUPERSET_FIRSTNAME} 197 | SUPERSET_LASTNAME: ${SUPERSET_LASTNAME} 198 | SUPERSET_USER: ${SUPERSET_USER} 199 | SUPERSET_PASSWORD: ${SUPERSET_PASSWORD} 200 | SUPERSET_PORT: ${SUPERSET_PORT} 201 | SUPERSET_POSTGRES_DB: ${SUPERSET_POSTGRES_DB} 202 | SUPERSET_REDIS_PORT: ${SUPERSET_REDIS_PORT} 203 | ports: 204 | - ${SUPERSET_PORT}:${SUPERSET_PORT} 205 | volumes: 206 | - type: bind 207 | source: ./ 208 | target: /docker 209 | - type: bind 210 | source: ../superset 211 | target: /superset 212 | - type: bind 213 | source: ../superset/superset_config.py 214 | target: /etc/superset/superset_config.py 215 | networks: 216 | - spotydash-network 217 | 218 | # REDIS 219 | redis: 220 | image: redis 221 | restart: always 222 | 223 | # WAITFOR-SUPERSET-SERVICE 224 | waitfor-superset: 225 | image: dadarek/wait-for-dependencies 226 | depends_on: 227 | - superset 228 | command: superset:${SUPERSET_PORT} 229 | networks: 230 | - spotydash-network 231 | 232 | # VOLUMES 233 | volumes: 234 | postgres-data: 235 | 236 | # NETWORKS 237 | networks: 238 | spotydash-network: 239 | ipam: 240 | driver: default 241 | config: 242 | - subnet: ${IP_SUBNET}/16 243 | -------------------------------------------------------------------------------- /superset/dashboards/dashboard.json: -------------------------------------------------------------------------------- 1 | { 2 | "dashboards": [ 3 | { 4 | "__Dashboard__": { 5 | "css": "", 6 | "dashboard_title": "Spotydash", 7 | "description": null, 8 | "json_metadata": "{\"timed_refresh_immune_slices\": [], \"expanded_slices\": {}, \"refresh_frequency\": 0, \"default_filters\": \"{}\", \"color_scheme\": null, \"remote_id\": 1}", 9 | "position_json": "{\"CHART-IoCthYUkF4\":{\"children\":[],\"id\":\"CHART-IoCthYUkF4\",\"meta\":{\"chartId\":1,\"height\":80,\"sliceName\":\"Promedio de energia por Artista\",\"uuid\":\"5a770960-edaf-4e8f-acc2-acadf30afd75\",\"width\":12},\"parents\":[\"ROOT_ID\",\"GRID_ID\",\"ROW-OgonBZM-L0\"],\"type\":\"CHART\"},\"CHART-UwOwdO7Jnr\":{\"children\":[],\"id\":\"CHART-UwOwdO7Jnr\",\"meta\":{\"chartId\":2,\"height\":49,\"sliceName\":\"Pie chart del promedio de Seguidores por cluster\",\"uuid\":\"22645861-488c-4b5c-8efe-9921132f91f9\",\"width\":4},\"parents\":[\"ROOT_ID\",\"GRID_ID\",\"ROW-RETt6CZXD\"],\"type\":\"CHART\"},\"CHART-v9TBHEi8uw\":{\"children\":[],\"id\":\"CHART-v9TBHEi8uw\",\"meta\":{\"chartId\":3,\"height\":49,\"sliceName\":\"Promedio de popularidad por Cluster\",\"uuid\":\"d66568d9-044e-4c06-b49b-729376ba769c\",\"width\":4},\"parents\":[\"ROOT_ID\",\"GRID_ID\",\"ROW-RETt6CZXD\"],\"type\":\"CHART\"},\"DASHBOARD_VERSION_KEY\":\"v2\",\"GRID_ID\":{\"children\":[\"ROW-OgonBZM-L0\",\"ROW-RETt6CZXD\"],\"id\":\"GRID_ID\",\"parents\":[\"ROOT_ID\"],\"type\":\"GRID\"},\"HEADER_ID\":{\"id\":\"HEADER_ID\",\"meta\":{\"text\":\"Spotydash\"},\"type\":\"HEADER\"},\"MARKDOWN-wPlEhCpPM\":{\"children\":[],\"id\":\"MARKDOWN-wPlEhCpPM\",\"meta\":{\"code\":\"# Gr\\u00e1fico de barras analizando m\\u00e9tricas por cluster\\nEs posible apreciar que el cluster 2 tiene mayor promedio de seguidores que el resto de los clusters, lo mismo podemos concluir con la popularidad, pero en menor proporci\\u00f3n.\",\"height\":51,\"width\":4},\"parents\":[\"ROOT_ID\",\"GRID_ID\",\"ROW-RETt6CZXD\"],\"type\":\"MARKDOWN\"},\"ROOT_ID\":{\"children\":[\"GRID_ID\"],\"id\":\"ROOT_ID\",\"type\":\"ROOT\"},\"ROW-OgonBZM-L0\":{\"children\":[\"CHART-IoCthYUkF4\"],\"id\":\"ROW-OgonBZM-L0\",\"meta\":{\"background\":\"BACKGROUND_TRANSPARENT\"},\"parents\":[\"ROOT_ID\",\"GRID_ID\"],\"type\":\"ROW\"},\"ROW-RETt6CZXD\":{\"children\":[\"MARKDOWN-wPlEhCpPM\",\"CHART-UwOwdO7Jnr\",\"CHART-v9TBHEi8uw\"],\"id\":\"ROW-RETt6CZXD\",\"meta\":{\"background\":\"BACKGROUND_TRANSPARENT\"},\"parents\":[\"ROOT_ID\",\"GRID_ID\"],\"type\":\"ROW\"}}", 10 | "slices": [ 11 | { 12 | "__Slice__": { 13 | "cache_timeout": null, 14 | "datasource_name": "public.AVG_Energy_Artists", 15 | "datasource_type": "table", 16 | "id": 1, 17 | "params": "{\"adhoc_filters\": [], \"bar_stacked\": false, \"bottom_margin\": \"auto\", \"color_scheme\": \"d3Category10\", \"columns\": [], \"datasource\": \"4__table\", \"groupby\": [\"artist\"], \"label_colors\": {}, \"metrics\": [{\"aggregate\": \"AVG\", \"column\": {\"column_name\": \"avg_energy\", \"description\": null, \"expression\": null, \"filterable\": true, \"groupby\": true, \"id\": 29, \"is_dttm\": false, \"python_date_format\": null, \"type\": \"FLOAT\", \"verbose_name\": null}, \"expressionType\": \"SIMPLE\", \"hasCustomLabel\": false, \"isNew\": false, \"label\": \"AVG(avg_energy)\", \"optionName\": \"metric_o3mm1l7x0ag_xw9s0as7n2d\", \"sqlExpression\": null}], \"order_bars\": false, \"order_desc\": false, \"row_limit\": 10000, \"show_bar_value\": false, \"show_legend\": true, \"time_range\": \"No filter\", \"time_range_endpoints\": [\"inclusive\", \"exclusive\"], \"viz_type\": \"dist_bar\", \"x_axis_label\": \"Artist\", \"x_ticks_layout\": \"auto\", \"y_axis_bounds\": [null, null], \"y_axis_format\": \"SMART_NUMBER\", \"y_axis_label\": \"Energy\", \"remote_id\": 1, \"datasource_name\": \"AVG_Energy_Artists\", \"schema\": \"public\", \"database_name\": \"spotipy\"}", 18 | "slice_name": "Promedio de energia por Artista", 19 | "viz_type": "dist_bar" 20 | } 21 | }, 22 | { 23 | "__Slice__": { 24 | "cache_timeout": null, 25 | "datasource_name": "public.AVG_followers_Artists", 26 | "datasource_type": "table", 27 | "id": 2, 28 | "params": "{\"adhoc_filters\": [], \"color_scheme\": \"d3Category20c\", \"datasource\": \"5__table\", \"groupby\": [\"label\"], \"innerRadius\": 56, \"label_line\": true, \"label_type\": \"key\", \"labels_outside\": true, \"legendOrientation\": \"top\", \"legendType\": \"scroll\", \"metric\": {\"aggregate\": \"AVG\", \"column\": {\"column_name\": \"avg_followers\", \"description\": null, \"expression\": null, \"filterable\": true, \"groupby\": true, \"id\": 31, \"is_dttm\": false, \"python_date_format\": null, \"type\": null, \"verbose_name\": null}, \"expressionType\": \"SIMPLE\", \"hasCustomLabel\": false, \"isNew\": false, \"label\": \"AVG(avg_followers)\", \"optionName\": \"metric_okgxpq2mkri_bml1rpdvcx7\", \"sqlExpression\": null}, \"number_format\": \"SMART_NUMBER\", \"outerRadius\": 73, \"row_limit\": 1000, \"show_labels\": true, \"show_legend\": true, \"time_range\": \"No filter\", \"time_range_endpoints\": [\"inclusive\", \"exclusive\"], \"viz_type\": \"pie\", \"remote_id\": 2, \"datasource_name\": \"AVG_followers_Artists\", \"schema\": \"public\", \"database_name\": \"spotipy\"}", 29 | "slice_name": "Pie chart del promedio de Seguidores por cluster", 30 | "viz_type": "pie" 31 | } 32 | }, 33 | { 34 | "__Slice__": { 35 | "cache_timeout": null, 36 | "datasource_name": "public.AVG_popularity_Artist", 37 | "datasource_type": "table", 38 | "id": 3, 39 | "params": "{\"adhoc_filters\": [], \"color_scheme\": \"supersetColors\", \"datasource\": \"6__table\", \"groupby\": [\"label\"], \"innerRadius\": 30, \"label_line\": true, \"label_type\": \"key\", \"labels_outside\": true, \"legendOrientation\": \"top\", \"legendType\": \"scroll\", \"metric\": {\"aggregate\": \"AVG\", \"column\": {\"column_name\": \"avg_popularity\", \"description\": null, \"expression\": null, \"filterable\": true, \"groupby\": true, \"id\": 33, \"is_dttm\": false, \"python_date_format\": null, \"type\": null, \"verbose_name\": null}, \"expressionType\": \"SIMPLE\", \"hasCustomLabel\": false, \"isNew\": false, \"label\": \"AVG(avg_popularity)\", \"optionName\": \"metric_02cv20zyxvkx_pw475nfxlee\", \"sqlExpression\": null}, \"number_format\": \"SMART_NUMBER\", \"outerRadius\": 65, \"row_limit\": 1000, \"show_labels\": true, \"show_legend\": true, \"time_range\": \"No filter\", \"time_range_endpoints\": [\"inclusive\", \"exclusive\"], \"viz_type\": \"pie\", \"remote_id\": 3, \"datasource_name\": \"AVG_popularity_Artist\", \"schema\": \"public\", \"database_name\": \"spotipy\"}", 40 | "slice_name": "Promedio de popularidad por Cluster", 41 | "viz_type": "pie" 42 | } 43 | } 44 | ], 45 | "slug": null 46 | } 47 | } 48 | ], 49 | "datasources": [ 50 | { 51 | "__SqlaTable__": { 52 | "cache_timeout": null, 53 | "columns": [ 54 | { 55 | "__TableColumn__": { 56 | "changed_by_fk": 1, 57 | "changed_on": { 58 | "__datetime__": "2021-05-30T21:10:23" 59 | }, 60 | "column_name": "label", 61 | "created_by_fk": 1, 62 | "created_on": { 63 | "__datetime__": "2021-05-30T21:10:23" 64 | }, 65 | "description": null, 66 | "expression": null, 67 | "filterable": true, 68 | "groupby": true, 69 | "id": 32, 70 | "is_active": true, 71 | "is_dttm": false, 72 | "python_date_format": null, 73 | "table_id": 6, 74 | "type": "INT", 75 | "uuid": "a36afc8e-dc32-4b56-8857-a517f62e05c3", 76 | "verbose_name": null 77 | } 78 | }, 79 | { 80 | "__TableColumn__": { 81 | "changed_by_fk": 1, 82 | "changed_on": { 83 | "__datetime__": "2021-05-30T21:10:23" 84 | }, 85 | "column_name": "avg_popularity", 86 | "created_by_fk": 1, 87 | "created_on": { 88 | "__datetime__": "2021-05-30T21:10:23" 89 | }, 90 | "description": null, 91 | "expression": null, 92 | "filterable": true, 93 | "groupby": true, 94 | "id": 33, 95 | "is_active": true, 96 | "is_dttm": false, 97 | "python_date_format": null, 98 | "table_id": 6, 99 | "type": null, 100 | "uuid": "960e126e-f2cd-486e-ad07-f3f86b8c2b6d", 101 | "verbose_name": null 102 | } 103 | } 104 | ], 105 | "database_id": 1, 106 | "default_endpoint": null, 107 | "description": null, 108 | "extra": null, 109 | "fetch_values_predicate": null, 110 | "filter_select_enabled": false, 111 | "main_dttm_col": null, 112 | "metrics": [ 113 | { 114 | "__SqlMetric__": { 115 | "changed_by_fk": 1, 116 | "changed_on": { 117 | "__datetime__": "2021-05-30T21:10:23" 118 | }, 119 | "created_by_fk": 1, 120 | "created_on": { 121 | "__datetime__": "2021-05-30T21:10:23" 122 | }, 123 | "d3format": null, 124 | "description": null, 125 | "expression": "count(*)", 126 | "extra": null, 127 | "id": 6, 128 | "metric_name": "count", 129 | "metric_type": null, 130 | "table_id": 6, 131 | "uuid": "755cd850-c88f-4615-bd15-7da6a892fbd2", 132 | "verbose_name": null, 133 | "warning_text": null 134 | } 135 | } 136 | ], 137 | "offset": 0, 138 | "params": "{\"remote_id\": 6, \"database_name\": \"spotipy\"}", 139 | "schema": "public", 140 | "sql": "-- Note: Unless you save your query, these tabs will NOT persist if you clear your cookies or change browsers.\n\nSELECT label, AVG(popularity) as avg_popularity from \"Artist\" GROUP BY label", 141 | "table_name": "AVG_popularity_Artist", 142 | "template_params": null 143 | } 144 | }, 145 | { 146 | "__SqlaTable__": { 147 | "cache_timeout": null, 148 | "columns": [ 149 | { 150 | "__TableColumn__": { 151 | "changed_by_fk": 1, 152 | "changed_on": { 153 | "__datetime__": "2021-05-30T21:03:11" 154 | }, 155 | "column_name": "artist", 156 | "created_by_fk": 1, 157 | "created_on": { 158 | "__datetime__": "2021-05-30T21:03:11" 159 | }, 160 | "description": null, 161 | "expression": null, 162 | "filterable": true, 163 | "groupby": true, 164 | "id": 28, 165 | "is_active": true, 166 | "is_dttm": false, 167 | "python_date_format": null, 168 | "table_id": 4, 169 | "type": "STRING", 170 | "uuid": "84dbd850-f72d-4f9d-9dd9-5caaf60f9108", 171 | "verbose_name": null 172 | } 173 | }, 174 | { 175 | "__TableColumn__": { 176 | "changed_by_fk": 1, 177 | "changed_on": { 178 | "__datetime__": "2021-05-30T21:03:11" 179 | }, 180 | "column_name": "avg_energy", 181 | "created_by_fk": 1, 182 | "created_on": { 183 | "__datetime__": "2021-05-30T21:03:11" 184 | }, 185 | "description": null, 186 | "expression": null, 187 | "filterable": true, 188 | "groupby": true, 189 | "id": 29, 190 | "is_active": true, 191 | "is_dttm": false, 192 | "python_date_format": null, 193 | "table_id": 4, 194 | "type": "FLOAT", 195 | "uuid": "5d24b03e-fa37-4441-8e6d-48a8f141bd4b", 196 | "verbose_name": null 197 | } 198 | } 199 | ], 200 | "database_id": 1, 201 | "default_endpoint": null, 202 | "description": null, 203 | "extra": null, 204 | "fetch_values_predicate": null, 205 | "filter_select_enabled": false, 206 | "main_dttm_col": null, 207 | "metrics": [ 208 | { 209 | "__SqlMetric__": { 210 | "changed_by_fk": 1, 211 | "changed_on": { 212 | "__datetime__": "2021-05-30T21:03:11" 213 | }, 214 | "created_by_fk": 1, 215 | "created_on": { 216 | "__datetime__": "2021-05-30T21:03:11" 217 | }, 218 | "d3format": null, 219 | "description": null, 220 | "expression": "count(*)", 221 | "extra": null, 222 | "id": 4, 223 | "metric_name": "count", 224 | "metric_type": null, 225 | "table_id": 4, 226 | "uuid": "60cddb79-1cc3-42e2-b087-8c615421f871", 227 | "verbose_name": null, 228 | "warning_text": null 229 | } 230 | } 231 | ], 232 | "offset": 0, 233 | "params": "{\"remote_id\": 4, \"database_name\": \"spotipy\"}", 234 | "schema": "public", 235 | "sql": "-- Note: Unless you save your query, these tabs will NOT persist if you clear your cookies or change browsers.\n\nSELECT artist, AVG(energy) AS avg_energy \nFROM \"Song\" \nGROUP BY artist \nORDER BY avg_energy DESC", 236 | "table_name": "AVG_Energy_Artists", 237 | "template_params": null 238 | } 239 | }, 240 | { 241 | "__SqlaTable__": { 242 | "cache_timeout": null, 243 | "columns": [ 244 | { 245 | "__TableColumn__": { 246 | "changed_by_fk": 1, 247 | "changed_on": { 248 | "__datetime__": "2021-05-30T21:07:24" 249 | }, 250 | "column_name": "label", 251 | "created_by_fk": 1, 252 | "created_on": { 253 | "__datetime__": "2021-05-30T21:07:24" 254 | }, 255 | "description": null, 256 | "expression": null, 257 | "filterable": true, 258 | "groupby": true, 259 | "id": 30, 260 | "is_active": true, 261 | "is_dttm": false, 262 | "python_date_format": null, 263 | "table_id": 5, 264 | "type": "INT", 265 | "uuid": "d7019e46-7cb9-4d9c-96da-44f63bc4fe74", 266 | "verbose_name": null 267 | } 268 | }, 269 | { 270 | "__TableColumn__": { 271 | "changed_by_fk": 1, 272 | "changed_on": { 273 | "__datetime__": "2021-05-30T21:07:24" 274 | }, 275 | "column_name": "avg_followers", 276 | "created_by_fk": 1, 277 | "created_on": { 278 | "__datetime__": "2021-05-30T21:07:24" 279 | }, 280 | "description": null, 281 | "expression": null, 282 | "filterable": true, 283 | "groupby": true, 284 | "id": 31, 285 | "is_active": true, 286 | "is_dttm": false, 287 | "python_date_format": null, 288 | "table_id": 5, 289 | "type": null, 290 | "uuid": "70a7b962-bf95-44da-b127-a3bc97e1a665", 291 | "verbose_name": null 292 | } 293 | } 294 | ], 295 | "database_id": 1, 296 | "default_endpoint": null, 297 | "description": null, 298 | "extra": null, 299 | "fetch_values_predicate": null, 300 | "filter_select_enabled": false, 301 | "main_dttm_col": null, 302 | "metrics": [ 303 | { 304 | "__SqlMetric__": { 305 | "changed_by_fk": 1, 306 | "changed_on": { 307 | "__datetime__": "2021-05-30T21:07:24" 308 | }, 309 | "created_by_fk": 1, 310 | "created_on": { 311 | "__datetime__": "2021-05-30T21:07:24" 312 | }, 313 | "d3format": null, 314 | "description": null, 315 | "expression": "count(*)", 316 | "extra": null, 317 | "id": 5, 318 | "metric_name": "count", 319 | "metric_type": null, 320 | "table_id": 5, 321 | "uuid": "f888861a-093e-4cb7-bc41-0dca93cfeed8", 322 | "verbose_name": null, 323 | "warning_text": null 324 | } 325 | } 326 | ], 327 | "offset": 0, 328 | "params": "{\"remote_id\": 5, \"database_name\": \"spotipy\"}", 329 | "schema": "public", 330 | "sql": "-- Note: Unless you save your query, these tabs will NOT persist if you clear your cookies or change browsers.\n\nSELECT label, AVG(followers) as avg_followers from \"Artist\" GROUP BY label", 331 | "table_name": "AVG_followers_Artists", 332 | "template_params": null 333 | } 334 | } 335 | ] 336 | } -------------------------------------------------------------------------------- /spotydash/resources/data/transformed_songs_data.csv: -------------------------------------------------------------------------------- 1 | id,name,artist,energy,liveness,tempo,speechiness,acousticness,instrumentalness,time_signature,danceability,key,duration_ms,loudness,valence,mode,uri 2 | 2SAqBLGA283SUiwJ3xOUVI,Laugh Now Cry Later (feat. Lil Durk),Drake,0.518,0.107,133.976,0.134,0.244,3.47e-05,4,0.761,0,261493,-8.871,0.522,1,spotify:track:2SAqBLGA283SUiwJ3xOUVI 3 | 2b8fOow8UzyDFAE27YhOZM,Memories,Maroon 5,0.32,0.0822,91.019,0.0546,0.837,0.0,4,0.764,11,189486,-7.209,0.575,1,spotify:track:2b8fOow8UzyDFAE27YhOZM 4 | 4HBZA5flZLE435QTztThqH,Stuck with U (with Justin Bieber),Ariana Grande,0.45,0.382,178.765,0.0418,0.223,0.0,3,0.597,8,228482,-6.658,0.537,1,spotify:track:4HBZA5flZLE435QTztThqH 5 | 2tnVG71enUj33Ic2nFN6kZ,Ride It,Regard,0.751,0.106,117.948,0.0874,0.177,6.43e-05,4,0.88,7,157606,-4.258,0.884,0,spotify:track:2tnVG71enUj33Ic2nFN6kZ 6 | 5itOtNx0WxtJmi1TQ3RuRd,Giant (with Rag'n'Bone Man),Calvin Harris,0.887,0.0811,122.015,0.0361,0.016,0.000503,4,0.807,1,229184,-4.311,0.606,0,spotify:track:5itOtNx0WxtJmi1TQ3RuRd 7 | 3Z8FwOEN59mRMxDCtb8N0A,Be Kind (with Halsey),Marshmello,0.633,0.0541,93.995,0.0457,0.00776,0.0,4,0.63,4,172762,-7.088,0.452,1,spotify:track:3Z8FwOEN59mRMxDCtb8N0A 8 | 2MbdDtCv5LUVjYy9RuGTgC,"WHATS POPPIN (feat. DaBaby, Tory Lanez & Lil Wayne) - Remix",Jack Harlow,0.723,0.185,145.013,0.26,0.0631,0.0,4,0.904,11,227478,-5.224,0.835,0,spotify:track:2MbdDtCv5LUVjYy9RuGTgC 9 | 6EDO9iiTtwNv6waLwa1UUq,POPSTAR (feat. Drake),DJ Khaled,0.56,0.134,163.071,0.261,0.057,0.0,4,0.8,5,200221,-4.818,0.45,0,spotify:track:6EDO9iiTtwNv6waLwa1UUq 10 | 7CHi4DtfK4heMlQaudCuHK,Lose Control,MEDUZA,0.526,0.14,123.935,0.0415,0.129,0.0,4,0.598,10,168387,-8.659,0.529,0,spotify:track:7CHi4DtfK4heMlQaudCuHK 11 | 3PfIrDoz19wz7qK7tYeu62,Don't Start Now,Dua Lipa,0.793,0.0951,123.95,0.083,0.0123,0.0,4,0.793,11,183290,-4.521,0.679,0,spotify:track:3PfIrDoz19wz7qK7tYeu62 12 | 6Qs4SXO9dwPj5GKvVOv8Ki,Dancing With A Stranger (with Normani),Sam Smith,0.52,0.222,102.998,0.0656,0.45,1.97e-06,4,0.741,8,171030,-7.513,0.347,1,spotify:track:6Qs4SXO9dwPj5GKvVOv8Ki 13 | 2dpaYNEQHiRxtZbfNsse99,Happier,Marshmello,0.792,0.167,100.015,0.0452,0.191,0.0,4,0.687,5,214290,-2.749,0.671,1,spotify:track:2dpaYNEQHiRxtZbfNsse99 14 | 0tgVpDi06FyKpA1z0VMD4v,Perfect,Ed Sheeran,0.448,0.106,95.05,0.0232,0.163,0.0,3,0.599,8,263400,-6.312,0.168,1,spotify:track:0tgVpDi06FyKpA1z0VMD4v 15 | 2u6Jm2klS4yvAlbSHlxUwI,Alane,Robin Schulz,0.799,0.11,124.002,0.164,0.0419,9.43e-06,4,0.581,3,175016,-6.66,0.662,1,spotify:track:2u6Jm2klS4yvAlbSHlxUwI 16 | 09IStsImFySgyp0pIQdqAc,The Middle,Zedd,0.657,0.112,107.01,0.0449,0.171,0.0,4,0.753,7,184732,-3.061,0.437,1,spotify:track:09IStsImFySgyp0pIQdqAc 17 | 017PF4Q3l4DBUiWoXk4OWT,Break My Heart,Dua Lipa,0.729,0.349,113.013,0.0883,0.167,1.39e-06,4,0.73,4,221820,-3.434,0.467,0,spotify:track:017PF4Q3l4DBUiWoXk4OWT 18 | 7qEHsqek33rTcFNT9PFqLf,Someone You Loved,Lewis Capaldi,0.405,0.105,109.891,0.0319,0.751,0.0,4,0.501,1,182161,-5.679,0.446,1,spotify:track:7qEHsqek33rTcFNT9PFqLf 19 | 6UelLqGlWMcVH1E5c4H7lY,Watermelon Sugar,Harry Styles,0.816,0.335,95.39,0.0465,0.122,0.0,4,0.548,0,174000,-4.209,0.557,1,spotify:track:6UelLqGlWMcVH1E5c4H7lY 20 | 1DFD5Fotzgn6yYXkYsKiGs,Piece Of Your Heart,MEDUZA,0.744,0.074,124.08,0.0295,0.0404,0.00016,4,0.677,10,152913,-6.806,0.631,0,spotify:track:1DFD5Fotzgn6yYXkYsKiGs 21 | 0u2P5u6lvoDfwTYjAADbn4,lovely (with Khalid),Billie Eilish,0.296,0.095,115.284,0.0333,0.934,0.0,4,0.351,4,200186,-10.109,0.12,0,spotify:track:0u2P5u6lvoDfwTYjAADbn4 22 | 7ef4DlsgrMEH11cDZd32M6,One Kiss (with Dua Lipa),Calvin Harris,0.862,0.0814,123.994,0.11,0.037,2.19e-05,4,0.791,9,214847,-3.24,0.592,0,spotify:track:7ef4DlsgrMEH11cDZd32M6 23 | 0vWUhCPxpJOJR5urYbZypB,Hypnotized,Purple Disco Machine,0.813,0.109,108.078,0.0997,0.0968,0.000324,4,0.69,11,195658,-5.084,0.704,0,spotify:track:0vWUhCPxpJOJR5urYbZypB 24 | 3eekarcy7kvN4yt5ZFzltW,HIGHEST IN THE ROOM,Travis Scott,0.427,0.21,76.469,0.0317,0.0546,5.83e-06,4,0.598,7,175721,-8.764,0.0605,0,spotify:track:3eekarcy7kvN4yt5ZFzltW 25 | 5WHTFyqSii0lmT9R21abT8,Don't Call Me Up,Mabel,0.881,0.0793,98.994,0.147,0.296,3.01e-06,4,0.674,9,178480,-2.853,0.234,1,spotify:track:5WHTFyqSii0lmT9R21abT8 26 | 2VxeLyX666F8uXCJ0dZF8B,Shallow,Lady Gaga,0.385,0.231,95.799,0.0308,0.371,0.0,4,0.572,7,215733,-6.362,0.323,1,spotify:track:2VxeLyX666F8uXCJ0dZF8B 27 | 0Rx0DJI556Ix5gBny6EWmn,Paradise,Bazzi,0.644,0.113,122.061,0.0479,0.0828,0.0,4,0.844,11,169038,-6.273,0.591,0,spotify:track:0Rx0DJI556Ix5gBny6EWmn 28 | 6ZRuF2n1CQxyxxAAWsKJOy,Nights Like This (feat. Ty Dolla $ign),Kehlani,0.725,0.154,146.163,0.15,0.367,0.0,4,0.61,8,201788,-5.131,0.291,1,spotify:track:6ZRuF2n1CQxyxxAAWsKJOy 29 | 2wrJq5XKLnmhRXHIAf9xBa,"10,000 Hours (with Justin Bieber)",Dan + Shay,0.63,0.111,89.991,0.0259,0.153,0.0,4,0.654,10,167693,-4.644,0.43,1,spotify:track:2wrJq5XKLnmhRXHIAf9xBa 30 | 6gBFPUFcJLzWGx4lenP6h2,goosebumps,Travis Scott,0.728,0.149,130.049,0.0484,0.0847,0.0,4,0.841,7,243837,-3.37,0.43,1,spotify:track:6gBFPUFcJLzWGx4lenP6h2 31 | 3jjujdWJ72nww5eGnfs2E7,Adore You,Harry Styles,0.771,0.102,99.048,0.0483,0.0237,7e-06,4,0.676,8,207133,-3.675,0.569,1,spotify:track:3jjujdWJ72nww5eGnfs2E7 32 | 3Dv1eDb0MEgF93GpLXlucZ,Say So,Doja Cat,0.673,0.0904,110.962,0.158,0.256,3.57e-06,4,0.787,11,237893,-4.577,0.786,0,spotify:track:3Dv1eDb0MEgF93GpLXlucZ 33 | 5uCax9HTNlzGybIStD3vDh,Say You Won't Let Go,James Arthur,0.557,0.0902,85.043,0.059,0.695,0.0,4,0.358,10,211467,-7.398,0.494,1,spotify:track:5uCax9HTNlzGybIStD3vDh 34 | 6osaMSJh9NguagEDQcZaKx,Loco Contigo (feat. J. Balvin & Tyga),DJ Snake,0.758,0.102,192.091,0.218,0.278,1.34e-06,4,0.694,11,185195,-2.986,0.371,1,spotify:track:6osaMSJh9NguagEDQcZaKx 35 | 61ZM92T2zaXIVsqncThQzC,In Your Eyes (feat. Alida),Robin Schulz,0.672,0.0768,120.018,0.0716,0.172,1.04e-06,4,0.57,8,208222,-5.888,0.461,0,spotify:track:61ZM92T2zaXIVsqncThQzC 36 | 2xLMifQCjDGFmkHkpNLD9h,SICKO MODE,Travis Scott,0.73,0.124,155.008,0.222,0.00513,0.0,4,0.834,8,312820,-3.714,0.446,1,spotify:track:2xLMifQCjDGFmkHkpNLD9h 37 | 3AzjcOeAmA57TIOr9zF1ZW,Physical,Dua Lipa,0.844,0.102,146.967,0.0457,0.0137,0.000658,4,0.647,0,193829,-3.756,0.746,1,spotify:track:3AzjcOeAmA57TIOr9zF1ZW 38 | 3QzAOrNlsabgbMwlZt7TAY,Ballin' (with Roddy Ricch),Mustard,0.545,0.151,97.008,0.0735,0.392,0.0,4,0.809,7,180435,-6.678,0.244,1,spotify:track:3QzAOrNlsabgbMwlZt7TAY 39 | 3kwgqoBqTwoAH4nT29TYrq,Nobody's Love,Maroon 5,0.567,0.0949,93.68,0.0379,0.31,0.0,4,0.486,1,211254,-6.456,0.154,1,spotify:track:3kwgqoBqTwoAH4nT29TYrq 40 | 4l0Mvzj72xxOpRrp6h8nHi,Lose You To Love Me,Selena Gomez,0.343,0.21,102.819,0.0436,0.556,0.0,4,0.488,4,206459,-8.985,0.0978,1,spotify:track:4l0Mvzj72xxOpRrp6h8nHi 41 | 3ZCTVFBt2Brf31RLEnCkWJ,everything i wanted,Billie Eilish,0.225,0.106,120.006,0.0994,0.902,0.657,4,0.704,6,245426,-14.454,0.243,0,spotify:track:3ZCTVFBt2Brf31RLEnCkWJ 42 | 3fhBpw640drQ2h0INgs1mS,Tua mamma,J-AX,0.885,0.0915,102.021,0.0535,0.0328,0.0,4,0.748,10,222227,-5.574,0.901,0,spotify:track:3fhBpw640drQ2h0INgs1mS 43 | 2dCMNOtOXFYk2w1IK7wvYJ,Besos en Guerra,Mery Granados,0.296,0.103,123.43,0.0403,0.644,1.81e-05,4,0.679,7,180000,-9.37,0.278,1,spotify:track:2dCMNOtOXFYk2w1IK7wvYJ 44 | 7K1H8u3WIgtp9dYOAb6ibe,Fiesta en Keli,Rels B,0.594,0.103,74.055,0.374,0.125,0.0,4,0.698,10,134720,-7.735,0.499,0,spotify:track:7K1H8u3WIgtp9dYOAb6ibe 45 | 6ZznUaja8PfIbU7UPUJrj4,La Luna de Neuquén,La Vela Puerca,0.264,0.115,126.015,0.0366,0.835,0.00253,4,0.7,7,260524,-16.535,0.55,1,spotify:track:6ZznUaja8PfIbU7UPUJrj4 46 | 027NtsXW0vpDFhzxsJKmTL,Mirenla,Ciro y los Persas,0.717,0.191,161.011,0.0272,0.0253,0.000661,4,0.632,2,256191,-6.924,0.832,1,spotify:track:027NtsXW0vpDFhzxsJKmTL 47 | 5RlrdqMMNm42rKgYq64a3T,23 coltellate,Highsnob,0.584,0.111,81.942,0.225,0.194,1.21e-06,4,0.767,1,155122,-9.126,0.275,1,spotify:track:5RlrdqMMNm42rKgYq64a3T 48 | 2J9TGb5CRT4omfAgnKmXn5,Ostia Lido,J-AX,0.786,0.108,108.944,0.186,0.114,0.0,4,0.874,9,172945,-5.723,0.688,1,spotify:track:2J9TGb5CRT4omfAgnKmXn5 49 | 45xyKCey4BM3fMeFEsF1Hp,Cenere,Nashley,0.685,0.141,109.968,0.114,0.683,2.52e-05,4,0.722,7,170196,-8.815,0.334,0,spotify:track:45xyKCey4BM3fMeFEsF1Hp 50 | 5sPhDjtV7cQgMPZmY6pPw7,Voce,Jeites,0.506,0.0813,129.979,0.0743,0.0666,6.22e-05,4,0.899,10,159093,-11.944,0.708,1,spotify:track:5sPhDjtV7cQgMPZmY6pPw7 51 | 3xeaXIjG0RONgwXA3G5nH3,José Sabía,La Vela Puerca,0.605,0.974,106.553,0.0442,0.803,0.0,4,0.301,9,329947,-7.519,0.356,1,spotify:track:3xeaXIjG0RONgwXA3G5nH3 52 | 1sjr6BBPbtlQjPZ6eHqis4,Spunte Blu (feat. Guè Pequeno),Carl Brave,0.769,0.102,167.983,0.269,0.206,0.0,4,0.682,2,208693,-5.232,0.596,1,spotify:track:1sjr6BBPbtlQjPZ6eHqis4 53 | 6oMxcHFSiTZPSYoRe9wFpF,Pizza Kebab,Ghali,0.776,0.115,143.045,0.0402,0.307,8.79e-06,4,0.708,4,178040,-5.292,0.361,0,spotify:track:6oMxcHFSiTZPSYoRe9wFpF 54 | 1xYBeQ5u8uaJ3oBWktjGyJ,Acurrucar,Ed Maverick,0.216,0.0894,99.1,0.0353,0.944,0.00799,4,0.809,8,234080,-12.103,0.236,1,spotify:track:1xYBeQ5u8uaJ3oBWktjGyJ 55 | 138yvzoeK9TUM8AX8GU4Wk,No Preciso Más,Mery Granados,0.811,0.0712,135.034,0.0602,0.0344,0.0,4,0.71,9,190080,-5.001,0.655,0,spotify:track:138yvzoeK9TUM8AX8GU4Wk 56 | 3fV9z98dnQLSIPIMMJXCm7,Veleno 7,Gemitaiz,0.843,0.363,132.991,0.0601,0.156,1.24e-05,4,0.806,6,173371,-6.237,0.327,0,spotify:track:3fV9z98dnQLSIPIMMJXCm7 57 | 3nlqyVPhWapJasnrSibqKP,Con un Farol,La Vela Puerca,0.842,0.162,138.983,0.0317,0.0263,0.00831,4,0.546,4,198050,-8.146,0.946,1,spotify:track:3nlqyVPhWapJasnrSibqKP 58 | 3pFTpADmXmYZHvDYuIy0v7,Forgive Me,Rels B,0.553,0.0973,110.065,0.0708,0.606,0.0,4,0.74,3,216000,-7.853,0.163,0,spotify:track:3pFTpADmXmYZHvDYuIy0v7 59 | 1bkkbtMn3fitbaxeReKFd8,Santoro e peyote,J-AX,0.868,0.693,110.034,0.0568,0.318,0.0,4,0.771,5,223707,-2.39,0.932,1,spotify:track:1bkkbtMn3fitbaxeReKFd8 60 | 5ZUbSBnGDbmBGcH2l1575M,Un domani (feat. Mr.Rain),Annalisa,0.832,0.118,135.007,0.0906,0.226,0.0,4,0.745,7,223827,-5.248,0.839,1,spotify:track:5ZUbSBnGDbmBGcH2l1575M 61 | 3HcKAD0mL8ZEFzxhaNRSzq,Ti Ho Perso,Ernia,0.52,0.154,139.894,0.084,0.156,0.00172,4,0.717,10,198066,-7.062,0.359,1,spotify:track:3HcKAD0mL8ZEFzxhaNRSzq 62 | 0naXBzJ3g4PFwqk6JFS74r,La Revancha,La Vela Puerca,0.802,0.0966,151.996,0.0359,0.0647,1.97e-05,4,0.536,2,206461,-9.122,0.835,1,spotify:track:0naXBzJ3g4PFwqk6JFS74r 63 | 74ZOwYUoy4ziYvEH5D7tt6,Mamma,Ghali,0.889,0.147,139.996,0.0326,0.115,0.0,4,0.547,9,179815,-4.54,0.892,0,spotify:track:74ZOwYUoy4ziYvEH5D7tt6 64 | 6QZqTHoe5BSdOTMllulIv1,Allenamento #3,Capo Plaza,0.574,0.289,150.075,0.375,0.153,0.0,4,0.686,1,166404,-8.304,0.232,1,spotify:track:6QZqTHoe5BSdOTMllulIv1 65 | 0DRKnh0BloxJHyhXkfbiX8,Assenzio (feat. Stash & Levante),J-AX,0.64,0.108,160.009,0.187,0.341,0.0,4,0.554,0,250533,-7.587,0.641,1,spotify:track:0DRKnh0BloxJHyhXkfbiX8 66 | 2DwLBlnwGFc9o7TP2QM8ug,Blanco y Negro,Nikone,0.65,0.269,170.001,0.152,0.163,0.0,4,0.504,7,202200,-7.803,0.112,0,spotify:track:2DwLBlnwGFc9o7TP2QM8ug 67 | 4xNiin4rPdCovstHbxofXJ,I'm Not The Only One,Mery Granados,0.106,0.0931,175.122,0.0705,0.77,1.83e-06,4,0.6,7,213250,-9.925,0.336,1,spotify:track:4xNiin4rPdCovstHbxofXJ 68 | 573ZF9B8MXJaioqJ5yNeMU,Narco Jr.,Aleman,0.583,0.0852,117.964,0.0419,0.00354,0.0,4,0.862,6,202118,-6.378,0.488,0,spotify:track:573ZF9B8MXJaioqJ5yNeMU 69 | 74yNtds3aWUlLbKaRg2kfC,De la Mano,La Vela Puerca,0.77,0.254,148.963,0.0413,0.0249,2.7e-06,4,0.51,4,200394,-6.912,0.878,0,spotify:track:74yNtds3aWUlLbKaRg2kfC 70 | 30Cste6qnaVsOethYhyoAn,24/7,MadMan,0.651,0.132,127.045,0.1,0.315,0.0,4,0.904,5,167659,-7.176,0.536,0,spotify:track:30Cste6qnaVsOethYhyoAn 71 | 1vKpHTveVVpoGs4ti0hsFW,Resulta,RIKI,0.644,0.126,93.959,0.249,0.151,5.55e-06,4,0.835,8,176000,-4.498,0.69,0,spotify:track:1vKpHTveVVpoGs4ti0hsFW 72 | 2g4qZQiGxtSIpaTUcq95Qw,Maria Salvador (with Il Cile),J-AX,0.831,0.324,97.037,0.162,0.166,0.0,4,0.743,0,223053,-2.955,0.855,0,spotify:track:2g4qZQiGxtSIpaTUcq95Qw 73 | 29Bw35uHUmDXZ5k7I6Z4RR,Winner,Rels B,0.593,0.337,82.942,0.292,0.716,0.0,4,0.72,6,154880,-7.681,0.815,1,spotify:track:29Bw35uHUmDXZ5k7I6Z4RR 74 | 56mbNpJVn5WQhOlsOvb2A0,La Soledad,Bersuit Vergarabat,0.679,0.241,92.02,0.0392,0.105,0.0,4,0.63,9,263933,-4.423,0.774,0,spotify:track:56mbNpJVn5WQhOlsOvb2A0 75 | 28iX9xaEUSAudD2joWmlAb,Sin Palabras,La Vela Puerca,0.762,0.101,149.986,0.0411,0.00224,1.46e-05,4,0.662,5,202040,-4.546,0.875,1,spotify:track:28iX9xaEUSAudD2joWmlAb 76 | 3mQprbUqgdOEs9OtrB2QZK,False Start,Oriana,0.798,0.156,112.062,0.065,0.384,3.77e-05,4,0.799,0,211375,-5.636,0.361,0,spotify:track:3mQprbUqgdOEs9OtrB2QZK 77 | 6pf9CBQ41ckDI6qrrQHjEm,Love Yourself,Mery Granados,0.207,0.23,96.112,0.12,0.745,0.0,4,0.745,1,185000,-15.082,0.557,0,spotify:track:6pf9CBQ41ckDI6qrrQHjEm 78 | 1WKHN8ScKUkjb75VlOIVoM,El Compa Ramiro,Aleman,0.704,0.106,82.539,0.509,0.293,0.00183,4,0.719,8,199797,-4.743,0.583,1,spotify:track:1WKHN8ScKUkjb75VlOIVoM 79 | 4qgcAsBlpZZ4VPQPv3XeHN,Lo Mejore,Rels B,0.477,0.0869,141.078,0.17,0.631,0.0,4,0.78,4,204670,-8.312,0.669,0,spotify:track:4qgcAsBlpZZ4VPQPv3XeHN 80 | 0AtNtseGriGF4sUXaVxBwq,Seremos,Salta La Banca,0.812,0.261,135.972,0.0468,0.106,0.0,4,0.578,5,208187,-6.176,0.802,1,spotify:track:0AtNtseGriGF4sUXaVxBwq 81 | 62dl5DE8Moae6tVOgMWNKR,Ora D'aria,Ghali,0.943,0.239,100.0,0.084,0.0437,2.86e-06,4,0.751,0,193560,-5.68,0.915,0,spotify:track:62dl5DE8Moae6tVOgMWNKR 82 | 1Acwk0yPCot9AdhTQl4gTl,Neutro,La Vela Puerca,0.892,0.0847,125.941,0.0333,0.00278,0.0,4,0.534,2,223987,-3.547,0.358,1,spotify:track:1Acwk0yPCot9AdhTQl4gTl 83 | 3oBJ5L6SEAKXgxuU0eeG7H,Tantas Veces,Aleman,0.719,0.308,81.003,0.373,0.463,0.0,4,0.789,7,273485,-6.099,0.664,1,spotify:track:3oBJ5L6SEAKXgxuU0eeG7H 84 | 1LFKSgrJ6GWMck8eZ6CHTm,Mariposas,Mery Granados,0.323,0.119,96.523,0.0301,0.715,0.0,4,0.655,7,229333,-8.541,0.261,1,spotify:track:1LFKSgrJ6GWMck8eZ6CHTm 85 | 3wPmnfALFXL8sAXUP7h1QK,El Corazón Sobre Todo - En Vivo,Estelares,0.816,0.986,137.05,0.039,0.161,8.48e-05,4,0.54,2,250427,-4.772,0.322,1,spotify:track:3wPmnfALFXL8sAXUP7h1QK 86 | 1pq2DATWDPmsPRGH8OB3sR,Blue,Rels B,0.809,0.102,144.999,0.374,0.503,0.0,4,0.792,9,209659,-6.079,0.864,0,spotify:track:1pq2DATWDPmsPRGH8OB3sR 87 | 7GOFNyZcCTwm1SsC5jOFpA,I Love You,Ghali,0.634,0.33,103.51,0.0559,0.119,0.0,4,0.532,0,177836,-6.981,0.633,0,spotify:track:7GOFNyZcCTwm1SsC5jOFpA 88 | 3XUKbJ8zAkjDGiQPp38Lri,Sopra la media,J-AX,0.937,0.35,167.946,0.146,0.00711,0.0,4,0.576,4,217573,-3.848,0.649,1,spotify:track:3XUKbJ8zAkjDGiQPp38Lri 89 | 0aad6vDkOmu9d1aFNvOwYC,¿Qué Ves?,Divididos,0.53,0.0395,107.908,0.0698,0.0315,0.000123,4,0.869,9,313733,-9.655,0.749,0,spotify:track:0aad6vDkOmu9d1aFNvOwYC 90 | 6BNMAb82xLiPv1ZngMQOBK,Iside (feat. Luchè),Lazza,0.795,0.146,84.965,0.293,0.125,0.0,4,0.714,11,152733,-6.956,0.668,0,spotify:track:6BNMAb82xLiPv1ZngMQOBK 91 | 7cwDTm3iGh2R9Jcelko15v,MI Diablo,La Vela Puerca,0.802,0.251,158.911,0.0326,0.265,0.0002,4,0.507,7,185575,-7.695,0.709,1,spotify:track:7cwDTm3iGh2R9Jcelko15v 92 | 0kFfC97BVMWdBRoDVtRbjV,Flores Negras,Guasones,0.624,0.105,89.955,0.0304,0.336,0.000346,4,0.695,0,253280,-7.853,0.36,1,spotify:track:0kFfC97BVMWdBRoDVtRbjV 93 | 2IK2d5jUGTOEUTUSGBv6VA,A Tu Lao,Pedro LaDroga,0.718,0.0878,140.055,0.0428,0.0124,0.00201,4,0.697,2,198912,-6.195,0.805,0,spotify:track:2IK2d5jUGTOEUTUSGBv6VA 94 | 5LIHbW6EG9IRlIaXfcuFnH,No Tengo Ganas,Intoxicados,0.571,0.198,122.011,0.0298,0.0762,0.000143,4,0.62,0,311040,-9.004,0.765,1,spotify:track:5LIHbW6EG9IRlIaXfcuFnH 95 | 2zi3DFDrmxPOZVYMwTDVuk,Bimbiminkia4life (with Fedez),J-AX,0.94,0.248,117.959,0.138,0.225,0.0,4,0.757,11,225093,-3.548,0.81,1,spotify:track:2zi3DFDrmxPOZVYMwTDVuk 96 | 4uwvbGAZEpZdOY82UUMpgO,Bellaria,Vegas Jones,0.584,0.115,148.657,0.321,0.0754,0.0,4,0.521,8,177960,-8.443,0.264,1,spotify:track:4uwvbGAZEpZdOY82UUMpgO 97 | 4zI2FjKRrdP6LxTO8PYh69,La Stazione Dei Ricordi,Ultimo,0.265,0.369,149.758,0.172,0.876,2.01e-06,3,0.539,4,250000,-14.813,0.376,1,spotify:track:4zI2FjKRrdP6LxTO8PYh69 98 | 4ykrjxWRmQKgtVHVmujrkJ,Avión de Papel,Los Tabaleros,0.55,0.103,87.995,0.0341,0.529,1.01e-05,4,0.652,7,215587,-6.704,0.72,1,spotify:track:4ykrjxWRmQKgtVHVmujrkJ 99 | 6ZM2H3Ml8OD3cCbzaDC1Oi,Konfussion,Pedro LaDroga,0.565,0.143,101.96,0.0354,0.0635,2.77e-06,4,0.682,0,208529,-8.164,0.469,1,spotify:track:6ZM2H3Ml8OD3cCbzaDC1Oi 100 | 6RiprjTTheMrJ2ypJxz3H4,Riccione,Thegiornalisti,0.905,0.0514,109.928,0.0851,0.0127,0.0,4,0.594,7,196861,-4.921,0.559,0,spotify:track:6RiprjTTheMrJ2ypJxz3H4 101 | 1Lf1VuA7hKnxtAYREcEOg2,Locales Calientes,Guasones,0.825,0.108,135.855,0.0435,0.00234,0.0,4,0.487,0,271639,-3.995,0.777,1,spotify:track:1Lf1VuA7hKnxtAYREcEOg2 102 | 7odGv2hlwDXsKUU9frxgNJ,La jermu del cobani,Gustavo Pena El Príncipe,0.789,0.092,127.645,0.0359,0.804,0.00346,4,0.866,0,132200,-5.667,0.977,1,spotify:track:7odGv2hlwDXsKUU9frxgNJ 103 | 3i9Xk6dQsgM5lJJwKOH8PW,Il bello d'esser brutti,J-AX,0.892,0.336,97.928,0.0585,0.00711,0.0,4,0.64,9,209013,-3.901,0.827,1,spotify:track:3i9Xk6dQsgM5lJJwKOH8PW 104 | 5lWYNP1Z8myDJBhmWK3yKl,101 Dalmatas (feat. Marvin Cruz),Yung Beef,0.688,0.0853,135.955,0.0461,0.137,3.16e-06,4,0.825,9,155547,-4.129,0.57,0,spotify:track:5lWYNP1Z8myDJBhmWK3yKl 105 | 7HL7EyuqIHLX0LTr8kvBsc,MweeGwod,Pedro LaDroga,0.764,0.305,119.939,0.216,0.00288,0.00104,4,0.694,1,172771,-9.493,0.472,1,spotify:track:7HL7EyuqIHLX0LTr8kvBsc 106 | 7J0AaU4fjs3APe1XAvKuKc,Papi papi,Vegas Jones,0.84,0.284,110.063,0.0983,0.164,0.0,4,0.721,1,142168,-4.389,0.709,1,spotify:track:7J0AaU4fjs3APe1XAvKuKc 107 | 7jUJ2RmT4PFHHq4goMWqm3,Chic,Izi,0.628,0.195,129.996,0.187,0.269,0.0,4,0.471,2,212640,-6.197,0.19,0,spotify:track:7jUJ2RmT4PFHHq4goMWqm3 108 | 3fhBpw640drQ2h0INgs1mS,Tua mamma,J-AX,0.885,0.0915,102.021,0.0535,0.0328,0.0,4,0.748,10,222227,-5.574,0.901,0,spotify:track:3fhBpw640drQ2h0INgs1mS 109 | 6F5y1lrzsOX3kffTp91TbF,Extraña Sensación,Guasones,0.551,0.104,123.964,0.0363,0.0103,0.0,4,0.71,9,250972,-6.251,0.647,1,spotify:track:6F5y1lrzsOX3kffTp91TbF 110 | 19LRRuiMQ8a9jhqSf8jVip,El Party,Jake La Furia,0.804,0.0577,123.986,0.0344,0.00387,0.0,4,0.672,6,211418,-5.746,0.57,0,spotify:track:19LRRuiMQ8a9jhqSf8jVip 111 | 48iaoK4m7IxW42zZ0PPSDt,Zamba del medio segundo,Gustavo Pena El Príncipe,0.446,0.817,107.268,0.132,0.703,6.11e-06,4,0.465,7,138707,-8.737,0.4,1,spotify:track:48iaoK4m7IxW42zZ0PPSDt 112 | 2CFDPiNUxcSOqfQtUHYNxF,De Nada Sirve,No Te Va Gustar,0.454,0.784,177.085,0.037,0.306,1.89e-05,3,0.585,4,237874,-9.91,0.499,1,spotify:track:2CFDPiNUxcSOqfQtUHYNxF 113 | 57woiRYi9fNngxATydUgaO,TOCCA A ME (feat. Jake La Furia),Vegas Jones,0.727,0.147,94.86,0.406,0.117,0.0,4,0.803,7,155242,-7.972,0.767,0,spotify:track:57woiRYi9fNngxATydUgaO 114 | 5FW8280twRpSVQtv70H9Qv,Muchacha,Fémina,0.783,0.105,97.347,0.109,0.24,0.0,4,0.631,4,261992,-6.308,0.78,0,spotify:track:5FW8280twRpSVQtv70H9Qv 115 | 3TSl7YncGwUGH0aPuoGUBh,Heaven or Hell - En Vivo Acústico,Guasones,0.839,0.708,134.216,0.0402,0.0244,2.56e-05,4,0.582,7,255787,-6.102,0.512,1,spotify:track:3TSl7YncGwUGH0aPuoGUBh 116 | 1bkkbtMn3fitbaxeReKFd8,Santoro e peyote,J-AX,0.868,0.693,110.034,0.0568,0.318,0.0,4,0.771,5,223707,-2.39,0.932,1,spotify:track:1bkkbtMn3fitbaxeReKFd8 117 | 13iGJobkZxCXtOC5MbtUJp,Milonga para una niña (Alfredo Zitarrosa),Gustavo Pena El Príncipe,0.402,0.206,93.634,0.156,0.784,0.0,4,0.53,9,211280,-9.763,0.709,0,spotify:track:13iGJobkZxCXtOC5MbtUJp 118 | 2D7cxrKpa7l2z2micrKVJe,Foll_arte,Pedro LaDroga,0.804,0.103,140.033,0.0607,0.201,0.000582,4,0.699,11,138304,-8.119,0.642,1,spotify:track:2D7cxrKpa7l2z2micrKVJe 119 | 4iHcVgRUU8qS8AEEXOUZmR,Montana Ciocias,Vegas Jones,0.717,0.0957,150.056,0.277,0.0868,4.31e-06,4,0.726,2,99200,-7.133,0.396,1,spotify:track:4iHcVgRUU8qS8AEEXOUZmR 120 | 7Fl40HsZpABPnTgFAM4YLk,Dancehall,Afrojuice 195,0.724,0.0762,105.036,0.228,0.477,0.0,4,0.908,1,254286,-7.814,0.84,0,spotify:track:7Fl40HsZpABPnTgFAM4YLk 121 | 4wGecpdpXwzaFPgZDecKka,Me estás tratando mal,Guasones,0.58,0.0875,98.028,0.0246,0.0827,0.0,4,0.576,4,217359,-5.439,0.579,1,spotify:track:4wGecpdpXwzaFPgZDecKka 122 | 1kxx74eV5H4mYUiQIvONhp,Buen Dia Maria,Adrián Berra,0.25,0.107,95.852,0.0379,0.888,0.0,4,0.667,0,139293,-12.044,0.452,1,spotify:track:1kxx74eV5H4mYUiQIvONhp 123 | 7j1v8nmGcYBroIUt5zJtKz,Imaginando buenas,Gustavo Pena El Príncipe,0.511,0.391,79.189,0.0755,0.72,0.0,4,0.541,2,379000,-9.263,0.72,0,spotify:track:7j1v8nmGcYBroIUt5zJtKz 124 | 7f2ouEpuPefmdZZg5Yxxah,Matame Ya,Pedro LaDroga,0.733,0.21,81.801,0.0383,0.00666,0.00115,3,0.318,9,209925,-5.29,0.273,0,spotify:track:7f2ouEpuPefmdZZg5Yxxah 125 | 6sDsSEVZID6rJAd4vhuRvK,Il giorno e la notte (feat. Giusy Ferreri),J-AX,0.782,0.144,158.144,0.105,0.00831,0.0,4,0.577,1,211200,-8.532,0.61,1,spotify:track:6sDsSEVZID6rJAd4vhuRvK 126 | 7upAH0ezzsThyvr33YKn4u,Pasos Al Costado,Turf,0.901,0.355,125.976,0.0311,0.02,0.0,4,0.589,2,254147,-3.442,0.795,1,spotify:track:7upAH0ezzsThyvr33YKn4u 127 | 4hwwDxMDxwNbCyUJuI5sLa,Trankilo,Vegas Jones,0.799,0.0935,124.182,0.182,0.0107,0.0,4,0.789,10,240000,-4.696,0.385,0,spotify:track:4hwwDxMDxwNbCyUJuI5sLa 128 | 6Lc0La3OwOmAouQjbID4uX,Nera,Irama,0.819,0.165,133.997,0.105,0.136,0.0,4,0.767,0,174147,-5.114,0.799,1,spotify:track:6Lc0La3OwOmAouQjbID4uX 129 | 5DelwP5vBag1H1Nmlygcu8,Barceloneta,Carl Brave x Franco126,0.765,0.118,136.493,0.231,0.229,0.0,4,0.655,5,242628,-4.617,0.715,1,spotify:track:5DelwP5vBag1H1Nmlygcu8 130 | 3hPVPihU6hA1xODBMpt5dl,Lleno Loko,Pedro LaDroga,0.65,0.127,119.333,0.209,0.107,1.94e-06,4,0.554,8,141627,-8.7,0.135,1,spotify:track:3hPVPihU6hA1xODBMpt5dl 131 | 2J9TGb5CRT4omfAgnKmXn5,Ostia Lido,J-AX,0.786,0.108,108.944,0.186,0.114,0.0,4,0.874,9,172945,-5.723,0.688,1,spotify:track:2J9TGb5CRT4omfAgnKmXn5 132 | 2F775eylEUVyAywfcPj3eh,Los mareados,Gustavo Pena El Príncipe,0.178,0.0743,122.054,0.0608,0.881,0.164,4,0.59,2,175496,-12.643,0.443,0,spotify:track:2F775eylEUVyAywfcPj3eh 133 | 4eXOQVM0bNeHFiSZMYqkIo,Hdp,Guasones,0.89,0.304,124.986,0.0498,0.035,9.98e-06,4,0.48,2,230758,-3.373,0.619,1,spotify:track:4eXOQVM0bNeHFiSZMYqkIo 134 | 07qo9gnLM488CUr0EtgIA1,Poetica,Cesare Cremonini,0.607,0.0721,139.807,0.0339,0.014,0.0,3,0.393,7,293960,-6.569,0.202,1,spotify:track:07qo9gnLM488CUr0EtgIA1 135 | 34RaVshrBXIINSVrIzW47P,6 del mattino (feat. Brancar),Jake La Furia,0.768,0.0719,127.911,0.09,0.112,0.0,4,0.809,5,178125,-5.198,0.525,0,spotify:track:34RaVshrBXIINSVrIzW47P 136 | 1cvUco5rd3lSMZS3YYnYRs,Boom,Vegas Jones,0.62,0.083,140.09,0.167,0.0848,2.15e-06,4,0.718,9,253376,-10.847,0.0959,1,spotify:track:1cvUco5rd3lSMZS3YYnYRs 137 | 29iYitjqT5URcL4IWRI9pN,Me Kieren Exa',Pedro LaDroga,0.58,0.11,159.917,0.0597,0.00195,0.0662,4,0.668,2,190805,-10.665,0.299,1,spotify:track:29iYitjqT5URcL4IWRI9pN 138 | 6LKhkWEz9h4QyM3Fm35H33,Riego Mi Sombra,Churupaca,0.42,0.0946,89.923,0.205,0.688,3.94e-05,4,0.59,0,284173,-8.78,0.305,0,spotify:track:6LKhkWEz9h4QyM3Fm35H33 139 | 2WwdECenpNP8pgZ3nQKgYQ,Camellos,Guasones,0.574,0.0861,69.478,0.0331,0.131,0.0,5,0.294,4,264559,-5.15,0.381,1,spotify:track:2WwdECenpNP8pgZ3nQKgYQ 140 | 423CCwsHi7yy81oj01swra,Montón de nada - En Vivo,Memphis La Blusera,0.623,0.68,102.824,0.0341,0.448,2.18e-06,4,0.497,9,353506,-7.441,0.579,1,spotify:track:423CCwsHi7yy81oj01swra 141 | 6XEu1vIqZVjZ3KL2UbSyLY,Buffalo soldier (Bob Marley),Gustavo Pena El Príncipe,0.287,0.911,53.877,0.582,0.838,0.388,4,0.574,0,98827,-13.218,0.6,1,spotify:track:6XEu1vIqZVjZ3KL2UbSyLY 142 | 2hTYxc4K9hS7DN42H3ZXCy,Giù x Terra,Ghali,0.634,0.136,99.144,0.0741,0.0823,4.39e-05,4,0.629,6,133636,-8.866,0.283,1,spotify:track:2hTYxc4K9hS7DN42H3ZXCy 143 | 6E9QGyDV0fkeanLFePwybi,Boogieman (feat. Salmo),Ghali,0.724,0.0922,112.048,0.0704,0.0859,0.000254,4,0.8,1,159911,-7.843,0.35,1,spotify:track:6E9QGyDV0fkeanLFePwybi 144 | 6BtVSzoP8xUzoGO3HwIla4,DNA,Ghali,0.714,0.133,117.98,0.0579,0.357,0.0,4,0.754,0,200339,-5.764,0.674,1,spotify:track:6BtVSzoP8xUzoGO3HwIla4 145 | 3p7xEm9a2jaWCPelAr3upo,Good Times,Ghali,0.736,0.0988,109.028,0.0776,0.0315,0.0,4,0.719,4,163073,-6.32,0.593,0,spotify:track:3p7xEm9a2jaWCPelAr3upo 146 | 2npk3wuI2lrWk1tNSvRqW3,Jennifer (feat. Soolking),Ghali,0.664,0.0892,91.532,0.157,0.301,2.21e-06,4,0.835,5,161848,-8.776,0.657,1,spotify:track:2npk3wuI2lrWk1tNSvRqW3 147 | 3KWFaXjuWepDjS3GnHBF7V,22:22,Ghali,0.73,0.186,94.977,0.0449,0.0956,3.91e-06,4,0.75,0,180000,-6.459,0.427,1,spotify:track:3KWFaXjuWepDjS3GnHBF7V 148 | 7sEoatuIXo9r9n253gJW8I,Fast Food,Ghali,0.66,0.13,120.012,0.113,0.202,0.0,4,0.794,11,159500,-6.481,0.501,0,spotify:track:7sEoatuIXo9r9n253gJW8I 149 | 1ejlLAA420azVRdgYbshiU,Marymango (feat. tha Supreme),Ghali,0.755,0.1,81.283,0.163,0.0351,0.0,4,0.477,10,204984,-5.781,0.586,0,spotify:track:1ejlLAA420azVRdgYbshiU 150 | 24nx4DNu1Cb6Z2GW54MPGh,Flashback,Ghali,0.568,0.107,116.01,0.0657,0.0982,0.0,4,0.775,1,217000,-7.752,0.239,0,spotify:track:24nx4DNu1Cb6Z2GW54MPGh 151 | 2Fpf5N1LuCGE74LiCdkBcA,Combo (feat. Mr Eazi),Ghali,0.781,0.26,100.013,0.107,0.0833,3.55e-05,4,0.825,9,176012,-4.732,0.812,0,spotify:track:2Fpf5N1LuCGE74LiCdkBcA 152 | 5tn1cgoPp9KkDHpqyD27ae,Extasy,Ghali,0.84,0.0995,122.02,0.0475,0.0156,0.0143,4,0.744,5,161557,-7.307,0.685,0,spotify:track:5tn1cgoPp9KkDHpqyD27ae 153 | 0ABzUFvfzx1YfG7nxaZvx4,Barcellona,Ghali,0.542,0.158,89.912,0.212,0.156,0.0,4,0.678,4,176167,-9.587,0.287,0,spotify:track:0ABzUFvfzx1YfG7nxaZvx4 154 | 5tTnNoxj0Bg21JZlp431Di,Cuore a Destra,Ghali,0.844,0.102,98.048,0.207,0.153,0.0,4,0.803,10,181531,-3.735,0.517,0,spotify:track:5tTnNoxj0Bg21JZlp431Di 155 | 7eJIYQ6o0AJetE7xNtEFJ6,Scooby,Ghali,0.568,0.081,170.016,0.196,0.0318,0.0,4,0.769,10,130235,-6.764,0.633,0,spotify:track:7eJIYQ6o0AJetE7xNtEFJ6 156 | 42T9HGzJDzXgMZkWKRQyGM,Fallito,Ghali,0.796,0.12,143.863,0.289,0.0646,0.0,4,0.581,9,191875,-5.105,0.354,0,spotify:track:42T9HGzJDzXgMZkWKRQyGM 157 | 0R1il0ITLNcNInIBqwfXKw,Cacao (feat. Pyrex),Ghali,0.51,0.304,124.028,0.096,0.0226,0.0,3,0.915,1,113831,-5.33,0.327,1,spotify:track:0R1il0ITLNcNInIBqwfXKw 158 | 43WhBVCWNE2zpG65810FPs,Boogieman (feat. Don Patricio) - Remix,Ghali,0.737,0.0921,112.01,0.0493,0.12,0.00152,4,0.799,1,151607,-7.035,0.39,1,spotify:track:43WhBVCWNE2zpG65810FPs 159 | 4SLeGGSSS4ZgreK0HaN9h8,Mainstream (La scala sociale del Rap),J-AX,0.62,0.0844,94.88,0.321,0.0373,0.0,4,0.739,7,206280,-6.639,0.622,1,spotify:track:4SLeGGSSS4ZgreK0HaN9h8 160 | 2vGkBrPzZwjQEihHv6JbGW,Pericoloso (feat. Chadia Rodriguez),J-AX,0.737,0.0921,120.238,0.091,0.0378,0.0,5,0.781,0,220147,-5.177,0.318,1,spotify:track:2vGkBrPzZwjQEihHv6JbGW 161 | 6ExLQlakJDGUxN5O567dAt,Supercalifragili (feat. Annalisa & Luca Di Stefano),J-AX,0.767,0.064,96.01,0.0408,0.0303,0.0,4,0.839,11,170133,-5.183,0.725,0,spotify:track:6ExLQlakJDGUxN5O567dAt 162 | 7lQxJLHcUvrY6CgWLRwZvv,"Quando piove, diluvia",J-AX,0.94,0.322,160.012,0.203,0.224,0.0,4,0.609,9,222587,-3.729,0.835,0,spotify:track:7lQxJLHcUvrY6CgWLRwZvv 163 | 0Yx5tHZ3mokhEFO6I1m3qA,Beretta (feat. Boomdabash),J-AX,0.934,0.0634,90.064,0.124,0.0822,0.0,4,0.712,8,211387,-3.434,0.947,0,spotify:track:0Yx5tHZ3mokhEFO6I1m3qA 164 | 4bMfWDvKPCFQ2df7Qf2UTs,La Mia Hit (feat. Max Pezzali),J-AX,0.853,0.26,100.078,0.0742,0.0623,0.0,4,0.689,8,212640,-6.11,0.701,1,spotify:track:4bMfWDvKPCFQ2df7Qf2UTs 165 | 5a35SM14Z7w3zxBmw7tSzy,Siamesi (feat. Paola Turci),J-AX,0.817,0.0641,79.958,0.125,0.069,0.0,4,0.706,1,209613,-4.337,0.715,0,spotify:track:5a35SM14Z7w3zxBmw7tSzy 166 | 2ziYj31y2U8RArzDNBrJPj,Reale,J-AX,0.93,0.0687,112.029,0.0796,0.0049,0.0,4,0.739,0,222800,-3.64,0.847,0,spotify:track:2ziYj31y2U8RArzDNBrJPj 167 | 5H1U42OXuedXyiLQoQciQh,Cristoforo Colombo (feat. Sergio Sylvestre),J-AX,0.83,0.0826,74.477,0.0665,0.0557,0.0,4,0.612,0,208253,-4.703,0.549,1,spotify:track:5H1U42OXuedXyiLQoQciQh 168 | 0cEpXcjuLkrEX8VrLihQ3l,Fiesta! (feat. Il Cile),J-AX,0.908,0.0946,105.061,0.133,0.172,0.0,4,0.775,0,177867,-4.114,0.839,1,spotify:track:0cEpXcjuLkrEX8VrLihQ3l 169 | 0qjvZE74o5hqBD2wGRIGhi,Cuore a lato (feat. Enrico Ruggeri),J-AX,0.681,0.0917,83.075,0.0539,0.0313,0.0,3,0.556,11,203147,-8.223,0.438,0,spotify:track:0qjvZE74o5hqBD2wGRIGhi 170 | 04slnNZQssNXRaK7SR9wAU,Per sempre nell'83 (feat. Il Pagante),J-AX,0.865,0.211,139.957,0.141,0.0319,0.0,4,0.738,6,197173,-4.093,0.882,0,spotify:track:04slnNZQssNXRaK7SR9wAU 171 | 6U5HemH63pt8KzQnpy9qZz,RedNeck (feat. Jake La Furia),J-AX,0.807,0.0847,124.392,0.188,0.103,0.0,3,0.515,11,218880,-4.547,0.58,0,spotify:track:6U5HemH63pt8KzQnpy9qZz 172 | 67y7QnThINO0GXKUXJWqu9,Il terzo spritz,J-AX,0.826,0.211,130.099,0.0898,0.0361,0.0,4,0.796,7,171507,-3.297,0.821,1,spotify:track:67y7QnThINO0GXKUXJWqu9 173 | 6ErJeLVlpCOQQ9WV5OhvhR,Sarò scemo,J-AX,0.512,0.105,120.735,0.0429,0.427,0.0,4,0.507,7,158093,-7.863,0.416,1,spotify:track:6ErJeLVlpCOQQ9WV5OhvhR 174 | 5fZRWUN09tFjs5Rn5wjMZ0,A me mi,J-AX,0.833,0.291,149.899,0.047,0.0977,0.0,4,0.647,4,206440,-5.02,0.805,1,spotify:track:5fZRWUN09tFjs5Rn5wjMZ0 175 | 4WJ1fu0RntmhYGkP9IWTVL,Ostia Lido,J-AX,0.786,0.108,108.944,0.186,0.114,0.0,4,0.874,9,172945,-5.723,0.688,1,spotify:track:4WJ1fu0RntmhYGkP9IWTVL 176 | 5EdbxJodIPhAeHBYBXfm86,Tutto tua madre,J-AX,0.741,0.343,128.219,0.0678,0.128,0.0,4,0.582,0,226000,-6.264,0.226,1,spotify:track:5EdbxJodIPhAeHBYBXfm86 177 | 4tCtwWceOPWzenK2HAIJSb,Work from Home (feat. Ty Dolla $ign),Fifth Harmony,0.585,0.0644,105.017,0.0432,0.103,3.94e-06,4,0.803,8,214480,-5.861,0.593,1,spotify:track:4tCtwWceOPWzenK2HAIJSb 178 | 0EPxmvsG1BY5td4aTOkWBF,Deu Onda,MC G15,0.604,0.0488,129.926,0.0573,0.456,0.0,4,0.931,0,144039,-1.41,0.864,0,spotify:track:0EPxmvsG1BY5td4aTOkWBF 179 | 02zBhKZIES8MMX9lvo1WKQ,Make You Mine,Maxi Trusso,0.801,0.126,109.997,0.0903,0.527,0.0,4,0.782,0,192213,-6.211,0.46,1,spotify:track:02zBhKZIES8MMX9lvo1WKQ 180 | 6qDF4wWL49CAVbgT7yuHl8,Sigo Extrañándote,J Balvin,0.853,0.205,93.022,0.241,0.154,0.000107,4,0.889,9,201280,-4.26,0.922,1,spotify:track:6qDF4wWL49CAVbgT7yuHl8 181 | 50UTxh3b3tjzenOSu1lJYH,Love Foolosophy - Remastered,Jamiroquai,0.726,0.0801,129.021,0.0827,0.0138,5.32e-06,4,0.793,11,225893,-4.9,0.904,0,spotify:track:50UTxh3b3tjzenOSu1lJYH 182 | 59pYym0DpPDI4ZyUIbPJw5,Take on Me,General Soundbwoy,0.442,0.346,134.012,0.0373,0.000632,0.011,4,0.713,7,272546,-9.784,0.785,1,spotify:track:59pYym0DpPDI4ZyUIbPJw5 183 | 27ebni0DfbT5Owz6W42HP8,Nunca Me Olvides,Yandel,0.785,0.297,95.005,0.0452,0.236,0.0,4,0.814,10,241560,-4.566,0.629,1,spotify:track:27ebni0DfbT5Owz6W42HP8 184 | 3RiPr603aXAoi4GHyXx0uy,Hymn for the Weekend,Coldplay,0.693,0.325,90.027,0.0377,0.211,6.92e-06,4,0.491,0,258267,-6.487,0.412,0,spotify:track:3RiPr603aXAoi4GHyXx0uy 185 | 5NNlUMcOEOdoOIwwaWXv0k,Cold,Maroon 5,0.715,0.0456,99.924,0.114,0.139,0.0,4,0.703,9,234308,-6.285,0.497,0,spotify:track:5NNlUMcOEOdoOIwwaWXv0k 186 | 1vvNmPOiUuyCbgWmtc6yfm,My Way,Calvin Harris,0.913,0.161,119.986,0.0426,0.093,3.69e-05,4,0.818,4,219160,-3.06,0.536,0,spotify:track:1vvNmPOiUuyCbgWmtc6yfm 187 | 6m2LNopVJKsvBB9l7Z1rwn,Olha a Explosão,MC Kevinho,0.611,0.0805,89.995,0.134,0.109,0.0,4,0.774,6,161593,-2.883,0.388,1,spotify:track:6m2LNopVJKsvBB9l7Z1rwn 188 | 0q6LuUqGLUiCPP1cbdwFs3,On Melancholy Hill,Gorillaz,0.739,0.064,120.423,0.026,1.51e-05,0.509,4,0.689,2,233867,-5.81,0.578,1,spotify:track:0q6LuUqGLUiCPP1cbdwFs3 189 | 0q6LuUqGLUiCPP1cbdwFs3,On Melancholy Hill,Gorillaz,0.739,0.064,120.423,0.026,1.51e-05,0.509,4,0.689,2,233867,-5.81,0.578,1,spotify:track:0q6LuUqGLUiCPP1cbdwFs3 190 | 3RiPr603aXAoi4GHyXx0uy,Hymn for the Weekend,Coldplay,0.693,0.325,90.027,0.0377,0.211,6.92e-06,4,0.491,0,258267,-6.487,0.412,0,spotify:track:3RiPr603aXAoi4GHyXx0uy 191 | 6b8Be6ljOzmkOmFslEb23P,24K Magic,Bruno Mars,0.803,0.153,106.97,0.0797,0.034,0.0,4,0.818,1,225983,-4.282,0.632,1,spotify:track:6b8Be6ljOzmkOmFslEb23P 192 | 7ifpNwTk2gqrOb1eivmbDT,Ayer Te Llame,La Makina,0.85,0.0461,134.111,0.0542,0.203,0.000196,4,0.918,9,241227,-4.875,0.961,1,spotify:track:7ifpNwTk2gqrOb1eivmbDT 193 | 3cGmUgp7hF5Eb8NyuEmtCA,Overture/And All That Jazz,Catherine Zeta-Jones,0.597,0.326,119.922,0.111,0.381,2.7e-05,4,0.579,1,364360,-6.541,0.703,0,spotify:track:3cGmUgp7hF5Eb8NyuEmtCA 194 | 28FRcsSqCrY8GtG5KOjSiY,"Hey Baby (Uhh, ahh)",Anton,0.961,0.35,135.1,0.044,0.122,0.0,4,0.662,7,218773,-4.282,0.834,0,spotify:track:28FRcsSqCrY8GtG5KOjSiY 195 | 2YijHFQAFVA2GLoo7pv0aD,Mambo No. 5 (A Little Bit Of...) (Re-Recorded / Remastered),Lou Bega,0.831,0.223,87.051,0.191,0.0644,0.0,4,0.69,10,220680,-3.969,0.964,0,spotify:track:2YijHFQAFVA2GLoo7pv0aD 196 | 4n0qAeAcpS7xnLfBE4GyhM,El Mario De Tu Mujer (feat. Sensato),Don Miguelo,0.938,0.0408,133.979,0.0716,0.0304,0.0,4,0.77,7,246387,-4.283,0.921,1,spotify:track:4n0qAeAcpS7xnLfBE4GyhM 197 | 4sZgNnnh0Ozf30INKF04hf,Nuestra Cancion,Elvis Crespo,0.886,0.24,126.201,0.048,0.424,0.00202,4,0.7,7,208800,-2.938,0.925,0,spotify:track:4sZgNnnh0Ozf30INKF04hf 198 | 1OAh8uOEOvTDqkKFsKksCi,Wild Thoughts (feat. Rihanna & Bryson Tiller),DJ Khaled,0.672,0.118,97.979,0.0688,0.0329,0.0,4,0.671,0,204173,-3.094,0.632,0,spotify:track:1OAh8uOEOvTDqkKFsKksCi 199 | 6DB2KOEwHnjkgEnBt5SdeJ,Mask Off (feat. Kendrick Lamar) - Remix,Future,0.431,0.506,150.005,0.395,0.0111,0.0166,4,0.727,2,257987,-12.007,0.223,1,spotify:track:6DB2KOEwHnjkgEnBt5SdeJ 200 | 1z8gObqL6bpHYuNBd4WCKZ,Te Siento en Para,Ceky Viciny,0.877,0.42,121.98,0.202,0.0163,0.0118,4,0.91,1,165303,-4.22,0.946,1,spotify:track:1z8gObqL6bpHYuNBd4WCKZ 201 | 3rOSwuTsUlJp0Pu0MkN8r8,Mask Off,Future,0.434,0.165,150.062,0.431,0.0102,0.0219,4,0.833,2,204600,-8.795,0.281,1,spotify:track:3rOSwuTsUlJp0Pu0MkN8r8 202 | 5stMpdMWMjI3K1CDmPpXv5,Loco Loquito,Alex Rose,0.724,0.0713,96.024,0.063,0.238,0.0,4,0.737,9,215213,-5.662,0.633,1,spotify:track:5stMpdMWMjI3K1CDmPpXv5 203 | 18MbEK3bfXlTBQZSr74afQ,Te Me Vas,Prince Royce,0.829,0.124,129.001,0.0338,0.441,2.28e-06,4,0.807,11,198973,-6.424,0.787,0,spotify:track:18MbEK3bfXlTBQZSr74afQ 204 | 3VClLWqNn80Llv0PJOsKgr,Báilame - Remix,Nacho,0.866,0.0696,96.011,0.0497,0.248,5.29e-06,4,0.791,6,217080,-4.236,0.71,1,spotify:track:3VClLWqNn80Llv0PJOsKgr 205 | 7FfpP3YZ6fOWMdxkIAtud9,Krippy Kush,Farruko,0.56,0.111,163.043,0.129,0.0668,0.0,4,0.708,9,230520,-7.132,0.411,1,spotify:track:7FfpP3YZ6fOWMdxkIAtud9 206 | 3aymLOOi25GWAB0ihJQrFy,Chacarera Del Olvido,Jorge Rojas,0.838,0.0356,150.95,0.099,0.184,0.0,3,0.538,11,188947,-2.676,0.801,0,spotify:track:3aymLOOi25GWAB0ihJQrFy 207 | 30GWJ6S28o3ZheIZnXcYQQ,One Day,Matisyahu,0.621,0.0916,133.176,0.185,0.865,0.000766,4,0.644,10,309499,-8.508,0.339,1,spotify:track:30GWJ6S28o3ZheIZnXcYQQ 208 | 30GWJ6S28o3ZheIZnXcYQQ,One Day,Matisyahu,0.621,0.0916,133.176,0.185,0.865,0.000766,4,0.644,10,309499,-8.508,0.339,1,spotify:track:30GWJ6S28o3ZheIZnXcYQQ 209 | 1NXvMzcaELhxVOo87LUXYd,Passion,The Flirts,0.673,0.117,119.406,0.0323,0.00796,0.138,4,0.859,9,303700,-11.141,0.858,1,spotify:track:1NXvMzcaELhxVOo87LUXYd 210 | 1b4m6trGUQ8B4IEkSWSQhe,Forget You,CeeLo Green,0.875,0.159,127.391,0.0653,0.134,0.0,4,0.696,0,222733,-3.682,0.773,1,spotify:track:1b4m6trGUQ8B4IEkSWSQhe 211 | 4Tw9JYF9HOuPRyccNWMgwf,The Hardest Part,Coldplay,0.844,0.455,123.721,0.0368,0.0228,0.00398,4,0.5,10,262880,-5.883,0.445,1,spotify:track:4Tw9JYF9HOuPRyccNWMgwf 212 | 7au5GfpnyBltA6B2Eh0ekK,Russian Roulette,Tungevaag,0.836,0.314,127.643,0.0821,0.2,1.06e-06,4,0.56,5,199619,-4.022,0.38,0,spotify:track:7au5GfpnyBltA6B2Eh0ekK 213 | 5bcTCxgc7xVfSaMV3RuVke,"Feels (feat. Pharrell Williams, Katy Perry & Big Sean)",Calvin Harris,0.745,0.0943,101.018,0.0571,0.0642,0.0,4,0.893,11,223413,-3.105,0.872,0,spotify:track:5bcTCxgc7xVfSaMV3RuVke 214 | 2oqjO52h0SGpuhWPcF3jMq,Turn This Club Around,R.I.O.,0.843,0.373,127.981,0.0296,0.000118,0.000392,4,0.61,0,201459,-4.894,0.916,1,spotify:track:2oqjO52h0SGpuhWPcF3jMq 215 | 1t2RBnm5ykUxuoxA2pEYjc,Party Shaker,R.I.O ft. Nicco,0.968,0.0872,144.013,0.0532,0.000316,0.00243,4,0.608,7,271202,-6.14,0.897,1,spotify:track:1t2RBnm5ykUxuoxA2pEYjc 216 | 1Ft13La2daEGqz5yWJC7lx,Bella,Wolfine,0.493,0.127,94.016,0.0735,0.128,0.000147,4,0.909,3,197120,-6.688,0.844,1,spotify:track:1Ft13La2daEGqz5yWJC7lx 217 | 1xznGGDReH1oQq0xzbwXa3,One Dance,Drake,0.619,0.351,103.989,0.0532,0.00784,0.00423,4,0.791,1,173987,-5.886,0.371,1,spotify:track:1xznGGDReH1oQq0xzbwXa3 218 | 5kLDQ7urRnWPu9tb70DYsm,Semente,Armandinho,0.934,0.951,89.914,0.242,0.13,3.72e-06,4,0.404,9,359547,-6.984,0.466,1,spotify:track:5kLDQ7urRnWPu9tb70DYsm 219 | 5yQW46XPWdGqkX2PyMegLD,Pescador,Armandinho,0.683,0.13,152.287,0.0442,0.186,0.0,4,0.693,6,179467,-7.362,0.742,1,spotify:track:5yQW46XPWdGqkX2PyMegLD 220 | 5BcLjf7GnxATd6nmz82U01,Arena En Nuestras Manos,Dread Mar I,0.247,0.0631,81.977,0.0583,0.111,0.0,4,0.737,9,345496,-16.386,0.778,1,spotify:track:5BcLjf7GnxATd6nmz82U01 221 | 7ehmaSwhEZv4aaJzxsVMGY,She Don't Give a FO (feat. Khea),Duki,0.556,0.165,119.938,0.14,0.345,0.0,4,0.854,1,209531,-4.49,0.342,1,spotify:track:7ehmaSwhEZv4aaJzxsVMGY 222 | 1tkikMrqW4NvmzIfIyNXw7,Hello Cotto,Duki,0.799,0.0907,140.133,0.311,0.0495,0.0,4,0.668,10,217250,-2.797,0.431,0,spotify:track:1tkikMrqW4NvmzIfIyNXw7 223 | 5VYCf57tScdakmCr1vGrI9,No Como,Emmanuel Horvilleur,0.775,0.0454,178.959,0.0433,0.0494,0.00304,4,0.48,7,207540,-5.932,0.865,1,spotify:track:5VYCf57tScdakmCr1vGrI9 224 | 4RepvCWqsP6zBuzvwYibAS,I Feel It Coming,The Weeknd,0.813,0.0952,92.985,0.143,0.429,0.0,4,0.769,0,269187,-5.9,0.567,0,spotify:track:4RepvCWqsP6zBuzvwYibAS 225 | 2vi23luhEYDrtUnNHAqF6q,Te Robo,Zato DJ,0.702,0.0588,101.998,0.0455,0.631,3.87e-06,4,0.907,0,157675,-2.591,0.658,1,spotify:track:2vi23luhEYDrtUnNHAqF6q 226 | 2oaK4JLVnmRGIO9ytBE1bt,Dark Necessities,Red Hot Chili Peppers,0.742,0.11,91.959,0.0716,0.0722,0.0199,4,0.7,5,302000,-6.777,0.197,0,spotify:track:2oaK4JLVnmRGIO9ytBE1bt 227 | 4srQQlWnjE38SnSmo7laQF,Sunlight (feat. Years and Years) - Extended Club Mix,The Magician,0.539,0.0735,122.002,0.0442,0.00191,0.000439,4,0.761,1,402340,-6.452,0.166,1,spotify:track:4srQQlWnjE38SnSmo7laQF 228 | 7BKLCZ1jbUBVqRi2FVlTVw,Closer,The Chainsmokers,0.524,0.111,95.01,0.0338,0.414,0.0,4,0.748,8,244960,-5.599,0.661,1,spotify:track:7BKLCZ1jbUBVqRi2FVlTVw 229 | 3CA9pLiwRIGtUBiMjbZmRw,Nice For What,Drake,0.909,0.119,93.372,0.0707,0.0891,9.7e-05,4,0.585,8,210747,-6.474,0.758,1,spotify:track:3CA9pLiwRIGtUBiMjbZmRw 230 | 5gfK6bZFaApxdSHsHXrwPD,Be Careful What You Wish For,Luke Combs,0.876,0.135,159.025,0.0404,0.0106,0.0,4,0.501,3,175493,-4.792,0.681,1,spotify:track:5gfK6bZFaApxdSHsHXrwPD 231 | 2r77vqSZkOktTSgmAOoHsV,Chica Paranormal,Paulo Londra,0.596,0.0897,139.937,0.0918,0.216,0.0,4,0.84,6,221214,-4.319,0.71,0,spotify:track:2r77vqSZkOktTSgmAOoHsV 232 | 6gpcs5eMhJwax4mIfKDYQk,Slide (feat. Frank Ocean & Migos),Calvin Harris,0.795,0.254,104.066,0.0545,0.498,1.21e-06,4,0.736,1,230813,-3.299,0.511,0,spotify:track:6gpcs5eMhJwax4mIfKDYQk 233 | 0cL0AarTZtfSt5Tc3a2ZDN,Alright - Remastered,Jamiroquai,0.875,0.136,105.805,0.0598,0.174,0.048,4,0.815,7,263920,-7.822,0.733,0,spotify:track:0cL0AarTZtfSt5Tc3a2ZDN 234 | 2uxlGf62lgfqUdIVHMnyKS,Kiss on My List,Daryl Hall & John Oates,0.823,0.0769,121.939,0.0346,0.248,0.00723,4,0.786,0,232907,-4.991,0.966,1,spotify:track:2uxlGf62lgfqUdIVHMnyKS 235 | 2En6fFzzlzPLcV8sXwrx7X,Selva,La Portuaria,0.52,0.212,115.121,0.03,0.00168,0.00481,4,0.636,11,248707,-13.511,0.853,1,spotify:track:2En6fFzzlzPLcV8sXwrx7X 236 | 6q8Lb50EtqNeeJXXe8mMAH,Culpables,KAROL G,0.801,0.143,130.059,0.0683,0.279,4.71e-06,4,0.728,8,226627,-2.942,0.416,0,spotify:track:6q8Lb50EtqNeeJXXe8mMAH 237 | 3gEoKDn0uhb9qqLwC16tly,Everybody Wants to Rule the World,Weezer,0.714,0.149,112.053,0.0363,0.0259,0.00113,4,0.667,8,244800,-4.533,0.387,1,spotify:track:3gEoKDn0uhb9qqLwC16tly 238 | 71NOmiKvk7s5R7dUurNjuy,You Little Beauty,FISHER,0.953,0.313,123.983,0.0911,0.00235,0.442,4,0.926,6,206588,-5.531,0.927,0,spotify:track:71NOmiKvk7s5R7dUurNjuy 239 | 5O6r8ZUbLompp4pYMdMZ76,Rituals,Shane Fontane,0.884,0.0883,124.01,0.0545,0.00296,0.907,4,0.8,8,434556,-7.376,0.1,1,spotify:track:5O6r8ZUbLompp4pYMdMZ76 240 | 278kSqsZIiYp8p3QjYAqa8,NI BIEN NI MAL,Bad Bunny,0.449,0.273,128.028,0.0674,0.556,1.85e-05,4,0.826,5,236216,-8.33,0.337,0,spotify:track:278kSqsZIiYp8p3QjYAqa8 241 | 7kh95COsNZjnTmc6aF76n7,Homerun (Intro),Paulo Londra,0.264,0.0972,135.117,0.0593,0.669,0.0,4,0.822,5,149505,-9.37,0.672,1,spotify:track:7kh95COsNZjnTmc6aF76n7 242 | 265zv3IDBskSIkvgPOSiGQ,2U (feat. Justin Bieber),David Guetta,0.613,0.227,144.878,0.0591,0.234,0.0,4,0.534,8,194893,-7.41,0.528,0,spotify:track:265zv3IDBskSIkvgPOSiGQ 243 | 0QKfiqpEU4h9ycPSzIFwYe,Maniac,Michael Sembello,0.533,0.0415,158.86,0.0651,0.0891,4.04e-06,4,0.617,3,244707,-11.516,0.835,0,spotify:track:0QKfiqpEU4h9ycPSzIFwYe 244 | 1ihZ6juKpqxLNHxtH6hPYV,Heart Of Glass - Remix,Blondie,0.701,0.105,114.685,0.0336,0.00104,0.0653,4,0.727,4,251773,-8.027,0.476,1,spotify:track:1ihZ6juKpqxLNHxtH6hPYV 245 | 3ibbvzRDRumaKResaWtuyz,Metalhammer - Live,And One,0.835,0.915,130.037,0.0262,0.0366,0.0,4,0.626,10,250573,-6.625,0.208,0,spotify:track:3ibbvzRDRumaKResaWtuyz 246 | 6u7jPi22kF8CTQ3rb9DHE7,Old Town Road (feat. Billy Ray Cyrus) - Remix,Lil Nas X,0.619,0.113,136.041,0.102,0.0533,0.0,4,0.878,6,157067,-5.56,0.639,1,spotify:track:6u7jPi22kF8CTQ3rb9DHE7 247 | 6KNUrRgzrccGtJpGdP39GU,Check Out Time,2Pac,0.703,0.0788,94.302,0.251,0.149,1.77e-06,4,0.798,6,279067,-4.136,0.6,1,spotify:track:6KNUrRgzrccGtJpGdP39GU 248 | 6ho0GyrWZN3mhi9zVRW7xi,Losing It,FISHER,0.964,0.0975,125.003,0.0577,0.00181,0.703,4,0.76,2,248036,-5.844,0.643,1,spotify:track:6ho0GyrWZN3mhi9zVRW7xi 249 | 65Wb0cfazkL4uW6g9qEwjS,Flores Amarillas,Floricienta,0.794,0.143,121.995,0.0272,0.0444,0.0,4,0.708,6,223187,-5.565,0.626,1,spotify:track:65Wb0cfazkL4uW6g9qEwjS 250 | 2jxQtbaswNN39LF1KvwNOY,Vengo a Cantar,Leandro Robin,0.718,0.0918,155.078,0.216,0.335,1.28e-05,3,0.832,2,155534,-8.607,0.851,0,spotify:track:2jxQtbaswNN39LF1KvwNOY 251 | 5H4YQCdThMeLunCQkjRiMz,Encontrar,Cruzando El Charco,0.477,0.259,95.02,0.0237,0.743,0.0,4,0.638,7,185387,-6.894,0.314,1,spotify:track:5H4YQCdThMeLunCQkjRiMz 252 | 5VYCf57tScdakmCr1vGrI9,No Como,Emmanuel Horvilleur,0.775,0.0454,178.959,0.0433,0.0494,0.00304,4,0.48,7,207540,-5.932,0.865,1,spotify:track:5VYCf57tScdakmCr1vGrI9 253 | 7cwDTm3iGh2R9Jcelko15v,MI Diablo,La Vela Puerca,0.802,0.251,158.911,0.0326,0.265,0.0002,4,0.507,7,185575,-7.695,0.709,1,spotify:track:7cwDTm3iGh2R9Jcelko15v 254 | 6vBeZiyYQmb0eD1Fj3RThI,Naistumichiu,CHANO,0.846,0.754,96.963,0.0317,0.145,0.0,4,0.589,1,179747,-4.288,0.641,0,spotify:track:6vBeZiyYQmb0eD1Fj3RThI 255 | 6ihEe9if8YRTAlzDdM1HPY,"Amor (Amor, amor, amor)",Luis Miguel,0.773,0.537,147.796,0.0254,0.0445,4.25e-05,4,0.616,7,222293,-5.409,0.717,1,spotify:track:6ihEe9if8YRTAlzDdM1HPY 256 | 1Xkto2kVP1qmT3uQBzITDb,Eu Vi Chegar (En Vivo),Los Pericos,0.809,0.826,132.105,0.0689,0.0666,2.35e-05,4,0.467,0,186984,-7.173,0.665,1,spotify:track:1Xkto2kVP1qmT3uQBzITDb 257 | 6dT5W7zuEcUZHnZuVlSIJ5,La Noche Sin Tí,Los Huayra,0.59,0.0914,81.311,0.043,0.548,0.0,4,0.364,1,258827,-6.686,0.446,0,spotify:track:6dT5W7zuEcUZHnZuVlSIJ5 258 | 0P4mudPDmwTuIZ7vA3y89j,Don't Come Close - 2002 Remaster,Ramones,0.868,0.185,157.016,0.0768,0.186,0.0105,4,0.65,2,164067,-5.083,0.921,1,spotify:track:0P4mudPDmwTuIZ7vA3y89j 259 | 5ojXuKXBYq0apcNucYSDXq,Mamita,CNCO,0.724,0.148,91.035,0.0541,0.112,3.67e-06,4,0.803,10,174201,-4.835,0.496,1,spotify:track:5ojXuKXBYq0apcNucYSDXq 260 | 17eJyYLIlMNlOqcwHYJ9F2,Lago en el Cielo,Gustavo Cerati,0.833,0.315,128.008,0.0322,0.00172,0.0387,4,0.539,7,308947,-5.717,0.57,1,spotify:track:17eJyYLIlMNlOqcwHYJ9F2 261 | 5dXlF4mvWnLkJoTrNfgcc7,700 Toneladas,Tan Bionica,0.656,0.0648,115.926,0.045,0.0262,6.39e-05,4,0.311,7,252479,-7.873,0.183,1,spotify:track:5dXlF4mvWnLkJoTrNfgcc7 262 | 5jjnq0YlUSgcqEemQQZ3rZ,A Mil,Cruzando El Charco,0.806,0.134,135.984,0.0353,0.00659,0.0,4,0.599,7,189507,-5.434,0.641,1,spotify:track:5jjnq0YlUSgcqEemQQZ3rZ 263 | 0HNXnhNZZtRZFLhP4hfyCP,Hey Baby (Radio Mix),DJ Ötzi,0.968,0.347,135.099,0.046,0.123,0.0,4,0.666,10,219240,-3.196,0.834,1,spotify:track:0HNXnhNZZtRZFLhP4hfyCP 264 | 48UPSzbZjgc449aqz8bxox,Californication,Red Hot Chili Peppers,0.767,0.127,96.483,0.027,0.0021,0.00165,4,0.592,9,329733,-2.788,0.328,0,spotify:track:48UPSzbZjgc449aqz8bxox 265 | 16LDbpqgCtvEZDQ5wfOWrj,Nuestra Cancion,Elvis Crespo,0.885,0.239,126.228,0.0466,0.425,0.00256,4,0.692,7,208640,-3.132,0.923,0,spotify:track:16LDbpqgCtvEZDQ5wfOWrj 266 | 0VYSH5t5gIXadaAhcufgPu,Soy Como Quiero Ser,Luis Miguel,0.737,0.281,111.128,0.0297,0.083,0.0,4,0.639,0,176173,-8.596,0.671,0,spotify:track:0VYSH5t5gIXadaAhcufgPu 267 | 3wo5ZlsWZNVAeemkiel7Ds,Eterno Amor,Los Manseros Santiagueños,0.474,0.318,130.902,0.0308,0.532,0.0,3,0.661,9,221986,-6.759,0.817,1,spotify:track:3wo5ZlsWZNVAeemkiel7Ds 268 | 6Tzjug1Iwou2u0zzulqDEN,Loosing my religion,Estelares,0.719,0.288,130.022,0.0288,0.0163,0.0,4,0.598,9,259799,-6.359,0.417,0,spotify:track:6Tzjug1Iwou2u0zzulqDEN 269 | 4A1yL9EnHfgyITkfOGKwAv,La Voz Del Viento,Los Huayra,0.632,0.0889,163.061,0.0413,0.363,2.29e-05,3,0.546,4,282067,-6.062,0.534,0,spotify:track:4A1yL9EnHfgyITkfOGKwAv 270 | 0KoVPPiV28IDJKvlQL3QEM,A Soñar Un Rato,Ivan Noble,0.473,0.879,82.476,0.0297,0.646,1.57e-05,4,0.529,5,266640,-10.222,0.258,1,spotify:track:0KoVPPiV28IDJKvlQL3QEM 271 | 2eY5iKmq2BDcD9P3uEnr4L,La Marca de la Gorra,Mala Fama,0.68,0.113,163.82,0.0542,0.106,1.12e-05,4,0.801,4,220160,-6.247,0.879,0,spotify:track:2eY5iKmq2BDcD9P3uEnr4L 272 | 06DnNFQMEbBG7QtGwa0rvG,Bella Ciao,Fer Palacio,0.535,0.367,99.978,0.0386,0.668,0.045,4,0.789,9,116738,-4.791,0.641,0,spotify:track:06DnNFQMEbBG7QtGwa0rvG 273 | 6h1OMefYA76A8nWHbundSJ,Tu Nombre,Cruzando El Charco,0.64,0.116,104.003,0.0255,0.411,0.0,4,0.649,6,218173,-5.51,0.426,1,spotify:track:6h1OMefYA76A8nWHbundSJ 274 | 5wqbrRK8dhrW1rByRnQ1V2,Motivos (En Vivo),Abel Pintos,0.703,0.944,103.624,0.0602,0.435,0.0,4,0.495,7,197147,-7.455,0.221,1,spotify:track:5wqbrRK8dhrW1rByRnQ1V2 275 | 3pMo77B4r1NwwIK78lO4xf,Me Gusta,Ciro y los Persas,0.813,0.131,131.997,0.0272,0.0204,5.48e-05,4,0.643,2,289654,-5.976,0.706,1,spotify:track:3pMo77B4r1NwwIK78lO4xf 276 | 4kSKacywUJHdhyst4PL6pl,Somethin' Stupid,Robbie Williams,0.515,0.174,106.191,0.0261,0.429,5.62e-06,4,0.654,0,170493,-12.185,0.677,1,spotify:track:4kSKacywUJHdhyst4PL6pl 277 | 2G7V7zsVDxg1yRsu7Ew9RJ,In My Feelings,Drake,0.626,0.396,91.03,0.125,0.0589,6e-05,4,0.835,1,217925,-5.833,0.35,1,spotify:track:2G7V7zsVDxg1yRsu7Ew9RJ 278 | 26oFgeiS15gSbUr8eR7nvx,Esperaba,Julieta Venegas,0.777,0.103,164.943,0.0433,0.113,6.71e-05,4,0.563,2,195653,-5.967,0.597,1,spotify:track:26oFgeiS15gSbUr8eR7nvx 279 | 5o0fPRx7uT5Oi4lMt2D6Jh,El Mundo Es Nuestro,Tan Bionica,0.754,0.0734,127.995,0.0441,0.284,0.0388,4,0.694,11,185867,-6.195,0.842,1,spotify:track:5o0fPRx7uT5Oi4lMt2D6Jh 280 | 5bldrrpdHrTeaWNT1Kp5xs,What Do You Mean? - Acoustic,Justin Bieber,0.358,0.104,124.934,0.044,0.794,0.0,4,0.773,8,203800,-10.634,0.756,1,spotify:track:5bldrrpdHrTeaWNT1Kp5xs 281 | 4Uq5tAWXRu77t5XDhMl7od,I Want You Around - Ed Stasium Version,Ramones,0.706,0.0827,119.601,0.0292,0.121,3.12e-05,4,0.674,2,180160,-6.591,0.638,1,spotify:track:4Uq5tAWXRu77t5XDhMl7od 282 | 7N2Knor6x7g0XIqpMoBg1z,X (Equis),Mak Donal,0.735,0.265,91.952,0.0491,0.0503,0.0,4,0.729,9,173471,-3.56,0.965,0,spotify:track:7N2Knor6x7g0XIqpMoBg1z 283 | 4Lo9osdsopemnKIfgi6IqW,Tesoro,Leo García,0.857,0.136,136.058,0.0388,0.0105,0.0,4,0.472,7,290947,-3.406,0.769,1,spotify:track:4Lo9osdsopemnKIfgi6IqW 284 | 0LQvt4cmAfMm6SmXetFw9P,Inmortal,Cruzando El Charco,0.874,0.119,94.95,0.0312,0.395,1.07e-06,4,0.572,7,165000,-4.556,0.862,1,spotify:track:0LQvt4cmAfMm6SmXetFw9P 285 | 3zN6kV9JWuQYVqXPtNvZku,Ya Nada Queda,Kudai,0.651,0.0418,150.059,0.0283,0.0895,0.0,4,0.543,5,224000,-5.784,0.6,1,spotify:track:3zN6kV9JWuQYVqXPtNvZku 286 | 2b44DfiDm52uA7aFQX6YOz,Tchauzinho,El Super Hobby,0.899,0.303,202.055,0.133,0.614,0.0,4,0.479,2,180834,-4.044,0.946,1,spotify:track:2b44DfiDm52uA7aFQX6YOz 287 | 1Ft13La2daEGqz5yWJC7lx,Bella,Wolfine,0.493,0.127,94.016,0.0735,0.128,0.000147,4,0.909,3,197120,-6.688,0.844,1,spotify:track:1Ft13La2daEGqz5yWJC7lx 288 | 1g7pyL3TVrXvJRLMShJUUI,Princesita,Elvis Crespo,0.901,0.041,123.242,0.037,0.458,0.00656,4,0.799,9,287227,-3.333,0.957,1,spotify:track:1g7pyL3TVrXvJRLMShJUUI 289 | 3FDrI0FLKzrYQiWxPhqV2W,Rollin (feat. Future & Khalid),Calvin Harris,0.762,0.224,92.002,0.0849,0.45,6.67e-05,4,0.754,6,272667,-4.486,0.673,0,spotify:track:3FDrI0FLKzrYQiWxPhqV2W 290 | 3EmmCZoqpWOTY1g2GBwJoR,Just Hold On,Steve Aoki,0.932,0.0574,114.991,0.0824,0.00383,1.5e-06,4,0.647,11,198774,-3.515,0.374,1,spotify:track:3EmmCZoqpWOTY1g2GBwJoR 291 | 4qo8esHlkaxttbr8QxxuHE,Make You Mine,Maxi Trusso,0.931,0.115,119.993,0.106,0.205,0.0,4,0.751,0,202293,-4.674,0.57,1,spotify:track:4qo8esHlkaxttbr8QxxuHE 292 | 0Fp5Zs2KZwiuvA58kz5kYg,La Calle Adicción,La Vela Puerca,0.949,0.112,158.912,0.0794,0.0031,1.58e-05,4,0.517,4,193613,-5.385,0.65,1,spotify:track:0Fp5Zs2KZwiuvA58kz5kYg 293 | 7f1X6tauagdeqpfNuNOYWr,Have You Ever Seen The Rain,Rod Stewart,0.808,0.0744,114.995,0.0285,0.0183,1.72e-05,4,0.615,11,192147,-6.19,0.762,1,spotify:track:7f1X6tauagdeqpfNuNOYWr 294 | 7g4r5YjKlvos3yOXiQ9xsW,Niña Chay,Sergio Galleguillo,0.857,0.731,97.984,0.0955,0.598,1.82e-06,4,0.518,7,225013,-4.574,0.579,0,spotify:track:7g4r5YjKlvos3yOXiQ9xsW 295 | 4tg0qvJQYf8TLMZEJ7fHmR,Terminales,Cruzando El Charco,0.687,0.0831,147.964,0.044,0.00141,0.0,4,0.562,5,199587,-6.592,0.821,1,spotify:track:4tg0qvJQYf8TLMZEJ7fHmR 296 | 4Ovy5UkvkweOluGd9hoKsR,Sere nere,Tiziano Ferro,0.689,0.0957,135.882,0.0379,0.179,0.0,4,0.585,6,264987,-4.774,0.399,1,spotify:track:4Ovy5UkvkweOluGd9hoKsR 297 | 4K5Q0c4y2ag9ynUh5K7VLE,Hey DJ,Version Cumbia La Plata,0.754,0.107,203.933,0.0734,0.25,0.0,4,0.527,5,154985,-6.726,0.938,1,spotify:track:4K5Q0c4y2ag9ynUh5K7VLE 298 | 1S6BO6K72rapT2Ehce2nP1,No Vale Enamorarse,Los Turros,0.311,0.114,165.856,0.0907,0.258,0.0,4,0.818,2,93437,-11.403,0.965,1,spotify:track:1S6BO6K72rapT2Ehce2nP1 299 | 26lG5q6s0MG3GK44rmYmFg,De La Guitarra,Intoxicados,0.75,0.24,126.014,0.0284,0.046,9.42e-05,4,0.626,7,312760,-7.547,0.7,1,spotify:track:26lG5q6s0MG3GK44rmYmFg 300 | 08piX6cjGIstSVAteSf5LE,La Otra Manera,Tan Bionica,0.72,0.0895,99.976,0.0351,0.0154,0.0352,4,0.61,0,264386,-6.9,0.236,1,spotify:track:08piX6cjGIstSVAteSf5LE 301 | 0i2elQQdEZwsDX5icf0Co8,Fue Tan Bueno,La Franela,0.516,0.0927,94.005,0.0256,0.0177,0.0,4,0.641,4,295373,-6.857,0.745,0,spotify:track:0i2elQQdEZwsDX5icf0Co8 302 | 0EayXisPHaulRoFgazbi0A,Bella Ciao,"Interpreti dello spettacolo ""Bella Ciao""",0.389,0.0931,145.851,0.0695,0.77,0.0,4,0.596,9,96400,-11.485,0.938,0,spotify:track:0EayXisPHaulRoFgazbi0A 303 | 2m7k94oFN4AvRFdEkkfa8G,Luz,Ciro y los Persas,0.577,0.118,159.766,0.0342,0.116,9.51e-06,4,0.422,0,271332,-6.749,0.235,1,spotify:track:2m7k94oFN4AvRFdEkkfa8G 304 | 76PJhxLxYuqlytINQ4WuZa,Me Canse,Angel Y Khriz,0.899,0.304,128.009,0.0797,0.0823,0.0,4,0.822,9,259475,-5.05,0.712,0,spotify:track:76PJhxLxYuqlytINQ4WuZa 305 | 4mCOEC7MifBw7Wz26JaVwF,El Profeta - En Vivo,La Vela Puerca,0.947,0.919,156.825,0.187,0.00721,0.0,4,0.331,0,243320,-6.03,0.347,1,spotify:track:4mCOEC7MifBw7Wz26JaVwF 306 | 7FFo6OcgORAgOK81R2kSqy,Cambiando De Color,Cruzando El Charco,0.616,0.0952,94.981,0.028,0.139,0.0,4,0.686,9,210427,-7.644,0.418,1,spotify:track:7FFo6OcgORAgOK81R2kSqy 307 | 0Oii8bI6O1ZlhBrOrtJ5GF,I Just Called To Say I Love You,Stevie Wonder,0.55,0.0866,113.545,0.0238,0.217,1.95e-06,4,0.746,1,262240,-9.064,0.632,1,spotify:track:0Oii8bI6O1ZlhBrOrtJ5GF 308 | 5WzGvUECNBgXZqU5fgA36A,Lento,Coti,0.665,0.131,139.039,0.0298,0.0913,0.000929,4,0.626,11,201427,-8.948,0.819,1,spotify:track:5WzGvUECNBgXZqU5fgA36A 309 | 1zsG4eaZmkA1dvjDDsAGLK,Échame La Culpa,Luis Fonsi,0.895,0.097,96.022,0.0411,0.0322,0.0,4,0.724,7,173720,-3.617,0.64,1,spotify:track:1zsG4eaZmkA1dvjDDsAGLK 310 | 3TMvz08PqjPCVzINmbK06s,Needles and Pins - 2002 Remaster,Ramones,0.886,0.103,119.218,0.0318,0.0143,0.000759,4,0.788,6,141507,-5.914,0.942,1,spotify:track:3TMvz08PqjPCVzINmbK06s 311 | 2CAK2t1reUgPK6OMgAMURB,Wasted,Tiësto,0.816,0.195,112.014,0.0308,0.00149,0.00115,4,0.638,2,190014,-5.503,0.386,1,spotify:track:2CAK2t1reUgPK6OMgAMURB 312 | 1mXK8Cog4ScFTqbdQAzXli,Ciudad Mágica,Tan Bionica,0.904,0.146,121.999,0.0328,0.000791,3.33e-05,4,0.625,9,210607,-5.287,0.687,0,spotify:track:1mXK8Cog4ScFTqbdQAzXli 313 | 16rQTTMtbn0ODLyflr0O6Q,Pájaro Cantor,Abel Pintos,0.87,0.101,142.003,0.0347,0.115,2.93e-06,4,0.611,4,299320,-2.257,0.847,1,spotify:track:16rQTTMtbn0ODLyflr0O6Q 314 | 77z3SBwaO57QHjjA0rnIrV,Por Tener Tu Amor,Los Huayra,0.801,0.967,118.233,0.0417,0.0273,0.0231,4,0.3,0,430320,-8.153,0.351,1,spotify:track:77z3SBwaO57QHjjA0rnIrV 315 | 45hvERQti0lxhrFCyGXCnL,Reirme Más,Leo García,0.79,0.0501,125.03,0.0383,0.0556,0.000236,4,0.783,11,218733,-6.869,0.967,0,spotify:track:45hvERQti0lxhrFCyGXCnL 316 | 4j8KVDMrMFzuWYnBAEeOFf,Casi Todo,La Vela Puerca,0.908,0.109,187.879,0.0706,0.0131,0.00191,4,0.339,6,158819,-4.879,0.735,1,spotify:track:4j8KVDMrMFzuWYnBAEeOFf 317 | 4kyakm8Sn1pMjl2FPK5qHM,Te Vengo a Buscar,Leandro Robin,0.557,0.117,100.912,0.139,0.355,2.2e-06,1,0.876,9,150127,-8.121,0.695,1,spotify:track:4kyakm8Sn1pMjl2FPK5qHM 318 | 5IXm926BIDseqJxZqZNPg1,Piratas del Caribe,Antoine Barry,0.415,0.066,76.89,0.0408,0.264,0.891,4,0.579,7,87078,-7.248,0.757,0,spotify:track:5IXm926BIDseqJxZqZNPg1 319 | 7dNxJbThVkQKPuDCrg2AvJ,Tango En Segunda - El Amor Espera - Live,Charly García & The Prostitution,0.757,0.957,79.231,0.0368,0.00122,0.538,4,0.328,2,387707,-6.008,0.297,1,spotify:track:7dNxJbThVkQKPuDCrg2AvJ 320 | 5MYjrH1DifdsSVXHBtF5bP,Punto para Vos,Ivan Noble,0.607,0.215,84.927,0.0252,0.0183,0.0,4,0.582,7,256067,-7.201,0.562,1,spotify:track:5MYjrH1DifdsSVXHBtF5bP 321 | 45b1FmcfKKktix1QYWC6m4,Cuando Calienta el Sol,Diego Boneta,0.77,0.156,125.675,0.0287,0.125,1.64e-06,4,0.751,5,237040,-5.234,0.765,1,spotify:track:45b1FmcfKKktix1QYWC6m4 322 | 6BdAwMv1YorLfkBWlE493X,Héroe Favorito,Romeo Santos,0.655,0.135,128.038,0.0485,0.659,0.0,4,0.799,1,239824,-6.34,0.82,1,spotify:track:6BdAwMv1YorLfkBWlE493X 323 | 05iMQqncVBIm4AE26EvaTL,Andar Conmigo,Julieta Venegas,0.585,0.116,116.994,0.0285,0.3,0.0,4,0.77,0,193373,-8.06,0.912,1,spotify:track:05iMQqncVBIm4AE26EvaTL 324 | 4waqcUQWdj0yH26STWl2Rq,Rosas,La Oreja de Van Gogh,0.685,0.108,107.01,0.0271,0.627,3.49e-06,4,0.783,9,236333,-5.008,0.54,1,spotify:track:4waqcUQWdj0yH26STWl2Rq 325 | 1KdQcx4Ac4PfVm9sQsRHf0,Oda a la Sin Nombre,El Bordo,0.731,0.122,125.964,0.0333,0.0225,0.0101,4,0.596,4,264560,-6.969,0.442,1,spotify:track:1KdQcx4Ac4PfVm9sQsRHf0 326 | 5oAgI7Pzg6vxuKrfapg3Pi,Pizza,Martin Garrix,0.712,0.183,127.967,0.0355,0.000408,0.589,4,0.381,5,255103,-6.9,0.0378,1,spotify:track:5oAgI7Pzg6vxuKrfapg3Pi 327 | 3T45hB2sscHjSbKgrnRB4l,De Negro y Rojo,La Vela Puerca,0.793,0.2,189.907,0.0362,0.0581,7.5e-06,4,0.42,5,174368,-8.144,0.798,1,spotify:track:3T45hB2sscHjSbKgrnRB4l 328 | 5Wnvu7pNPn8qpszTX9FJRc,Zamba de Serenata,Leandro Robin,0.563,0.119,104.028,0.111,0.435,0.0,3,0.863,4,157415,-8.473,0.576,0,spotify:track:5Wnvu7pNPn8qpszTX9FJRc 329 | 13Cej6nXVeBimkpCmaueC3,Nada Que Perder (En Vivo),Los Pericos,0.828,0.932,148.978,0.166,0.155,2.86e-05,4,0.445,1,176245,-7.466,0.752,1,spotify:track:13Cej6nXVeBimkpCmaueC3 330 | 5G4qc4G1dvOJxVN2SWpOvK,Te Llevo para Que Me Lleves,Gustavo Cerati,0.718,0.398,130.153,0.0274,0.0601,0.382,4,0.631,11,220827,-8.719,0.451,0,spotify:track:5G4qc4G1dvOJxVN2SWpOvK 331 | 1jxO9AwMqYynDsuMWKrPvi,La bikina - En vivo,Luis Miguel,0.71,0.918,160.397,0.0351,0.161,0.0,3,0.389,5,179040,-6.265,0.666,1,spotify:track:1jxO9AwMqYynDsuMWKrPvi 332 | 3NwVga1qCZ6TgJ8RVcBbKD,Bella ciao,Modena City Ramblers,0.758,0.287,159.108,0.0661,0.512,3.19e-06,4,0.337,7,269507,-5.949,0.446,0,spotify:track:3NwVga1qCZ6TgJ8RVcBbKD 333 | 5QqdvVeYLL1xvZ1ndUjxnO,In My Life - Remastered,The Beatles,0.435,0.113,103.239,0.0323,0.449,0.0,4,0.688,9,146333,-11.359,0.435,1,spotify:track:5QqdvVeYLL1xvZ1ndUjxnO 334 | 29jq3EM1cLPzQxyuelVCRi,Nena Maldición - Cumbia,Mak Donal,0.636,0.076,97.943,0.0467,0.173,0.0,4,0.909,6,193464,-5.178,0.654,1,spotify:track:29jq3EM1cLPzQxyuelVCRi 335 | 7muesIkUA6Yr3uCvRGPKJF,Plan B: Anhelo de Satisfacción,Massacre,0.836,0.0876,126.179,0.0662,0.000227,0.00624,4,0.449,5,262600,-8.043,0.319,0,spotify:track:7muesIkUA6Yr3uCvRGPKJF 336 | 5Y61Z8U2IpdZYeY8VJImMk,Crimen,Salta La Banca,0.487,0.0799,173.898,0.028,0.225,0.0386,4,0.389,4,236387,-8.212,0.26,1,spotify:track:5Y61Z8U2IpdZYeY8VJImMk 337 | 3uU6dqBjVKRTPis0RrTaT4,Las de la Intuición,Shakira,0.731,0.0888,130.032,0.0347,0.0331,0.351,4,0.728,2,220667,-7.075,0.602,0,spotify:track:3uU6dqBjVKRTPis0RrTaT4 338 | 5w3GTe4W2fHBC3tLnqCr1B,Un Dia Perfecto,Estelares,0.902,0.532,138.037,0.0649,0.000516,1.88e-05,4,0.462,0,242933,-4.059,0.718,1,spotify:track:5w3GTe4W2fHBC3tLnqCr1B 339 | 5TON6glBoeE7ORmFur35nO,La Yapa (En Vivo),Soledad,0.911,0.678,77.974,0.104,0.236,0.0,3,0.53,0,197427,-3.051,0.733,0,spotify:track:5TON6glBoeE7ORmFur35nO 340 | 4EbfeFf88tna6YcInp1ugJ,Casi Nunca Lo Ves (En Vivo) (feat. Ciro y Los Persas),Los Pericos,0.882,0.919,158.892,0.0732,0.0179,0.00102,4,0.361,9,296120,-5.726,0.351,1,spotify:track:4EbfeFf88tna6YcInp1ugJ 341 | 69PXLn7FaqhOMhMpzheUT9,La Mañana,Los Huayra,0.572,0.131,98.08,0.0263,0.522,0.0,4,0.58,7,216080,-7.127,0.556,1,spotify:track:69PXLn7FaqhOMhMpzheUT9 342 | 2S2IWM3kJMKFZHtwdvwGF8,O Tu O Ninguna,Luis Miguel,0.428,0.105,144.075,0.0338,0.479,0.0,4,0.302,5,196333,-8.814,0.119,1,spotify:track:2S2IWM3kJMKFZHtwdvwGF8 343 | 7dmdwwxTx9aoUsfXbRHIoQ,Loco Un Poco,Turf,0.964,0.0761,176.117,0.123,0.0162,0.0,4,0.441,11,207280,-5.183,0.775,0,spotify:track:7dmdwwxTx9aoUsfXbRHIoQ 344 | 7hpNv31H2waXjtB3uptPTk,Dame Un Motivo,Ivan Noble,0.645,0.922,93.036,0.0341,0.461,0.000565,4,0.677,8,255427,-8.671,0.608,1,spotify:track:7hpNv31H2waXjtB3uptPTk 345 | 1CRVvwUopaV42bAEvoh194,I've Got All This Ringing In My Ears And None On My Fingers,Fall Out Boy,0.922,0.614,101.989,0.0387,0.0192,3.19e-05,4,0.583,11,246533,-3.843,0.4,1,spotify:track:1CRVvwUopaV42bAEvoh194 346 | 2EY5933fodiPLQoENHH8Sb,Bella,Mak Donal,0.68,0.0693,94.088,0.0455,0.306,0.0,4,0.884,3,188937,-5.973,0.893,1,spotify:track:2EY5933fodiPLQoENHH8Sb 347 | 4pEMBjS9eKYGgMITqF6Mdo,Recuérdame (Interpretada por Ernesto De la Cruz),Marco Antonio Solís,0.543,0.337,128.939,0.0399,0.709,1.69e-05,4,0.57,2,109280,-6.398,0.774,1,spotify:track:4pEMBjS9eKYGgMITqF6Mdo 348 | 0f8UKGM3m5ZdxgF46vaikm,Otra Piel,Gustavo Cerati,0.797,0.136,104.974,0.0228,0.0264,0.654,4,0.61,8,280613,-7.953,0.734,0,spotify:track:0f8UKGM3m5ZdxgF46vaikm 349 | 0Lckblu9CJUXOeMV0XY3b9,We Can Work It Out - Remastered 2015,The Beatles,0.677,0.183,106.071,0.0298,0.0635,0.0,4,0.378,2,135693,-8.63,0.648,1,spotify:track:0Lckblu9CJUXOeMV0XY3b9 350 | 4cG7HUWYHBV6R6tHn1gxrl,Friday (feat. Mufasa & Hypeman) - Dopamine Re-Edit,Riton,0.862,0.303,122.98,0.126,0.0076,0.000132,4,0.824,2,169153,-3.424,0.801,1,spotify:track:4cG7HUWYHBV6R6tHn1gxrl 351 | 0siYMEsGrzzzlWLXK5zJfS,BED,Joel Corry,0.782,0.333,123.989,0.0341,0.0142,0.00221,4,0.671,6,178088,-4.593,0.618,1,spotify:track:0siYMEsGrzzzlWLXK5zJfS 352 | 0b18g3G5spr4ZCkz7Y6Q0Q,Rasputin,Majestic,0.913,0.193,128.04,0.113,0.00364,6.92e-05,4,0.758,6,186210,-2.926,0.658,0,spotify:track:0b18g3G5spr4ZCkz7Y6Q0Q 353 | 6OufwUcCqo81guU2jAlDVP,Love Tonight - Edit,Shouse,0.681,0.0861,123.028,0.0265,0.00214,0.000307,4,0.727,5,241970,-7.114,0.448,0,spotify:track:6OufwUcCqo81guU2jAlDVP 354 | 2REu6wX4KKrG6uGlTKVqu6,One More Time (feat. Alida),Robin Schulz,0.701,0.307,123.985,0.0499,0.0302,8.97e-06,4,0.5,0,199358,-6.261,0.159,0,spotify:track:2REu6wX4KKrG6uGlTKVqu6 355 | 2pPO9YecZimmuVQfIzfV6U,Wasted Love (feat. Lagique),Ofenbach,0.855,0.0901,121.955,0.135,0.0821,4.73e-06,4,0.734,6,139563,-4.578,0.54,0,spotify:track:2pPO9YecZimmuVQfIzfV6U 356 | 5YaskwnGDZFDRipaqzbwQx,Your Love (9PM),ATB,0.784,0.115,125.993,0.112,0.194,6.28e-06,4,0.669,7,150053,-5.603,0.517,1,spotify:track:5YaskwnGDZFDRipaqzbwQx 357 | 3zPfyVThoCzQ6IB5CSGDTz,You've Done Enough,Gorgon City,0.791,0.703,125.052,0.0337,0.016,0.153,4,0.685,0,213547,-6.628,0.539,1,spotify:track:3zPfyVThoCzQ6IB5CSGDTz 358 | 2cc8Sw1OnCuA5bV8nqWqpE,You,Regard,0.695,0.0647,106.064,0.0367,0.0592,0.0,4,0.691,0,233386,-5.6,0.514,1,spotify:track:2cc8Sw1OnCuA5bV8nqWqpE 359 | 5i5zn4un7FhVeNYiGNnLDA,Trouble - Spotify Singles,Aluna,0.615,0.0954,109.992,0.0682,0.0516,0.00219,4,0.737,8,170087,-7.971,0.717,1,spotify:track:5i5zn4un7FhVeNYiGNnLDA 360 | 6L5eyrIlO6GkRJAdqQEThe,Mad World,Timmy Trumpet,0.892,0.195,106.594,0.11,0.233,9.35e-05,3,0.54,11,153304,-4.985,0.152,1,spotify:track:6L5eyrIlO6GkRJAdqQEThe 361 | 7ltLi7CG003USSGYsSba9s,It Don’t Matter - Spotify Singles,Alok,0.864,0.367,118.032,0.0378,0.161,1.34e-05,4,0.732,3,173743,-5.94,0.568,0,spotify:track:7ltLi7CG003USSGYsSba9s 362 | 4crczEC1PpoD8TsDsmoWNI,Goodbye,Imanbek,0.931,0.191,125.011,0.0563,0.0225,0.000102,4,0.741,10,144000,-3.447,0.517,0,spotify:track:4crczEC1PpoD8TsDsmoWNI 363 | 4ga4WvRNhMsIL38pkBbnIN,Pressure (feat. Tove Lo),Martin Garrix,0.558,0.124,114.978,0.0902,0.659,0.324,4,0.859,7,144391,-8.991,0.357,0,spotify:track:4ga4WvRNhMsIL38pkBbnIN 364 | 2Q8fFORnsDE6I3RNvSLXSf,Gotta Be You,NERVO,0.869,0.0708,123.91,0.0452,0.252,0.0288,4,0.642,6,149032,-5.271,0.376,0,spotify:track:2Q8fFORnsDE6I3RNvSLXSf 365 | 7HXBG0W8gFJwHUh5mVF9tf,Rise,Lost Frequencies,0.612,0.368,122.076,0.0387,0.228,7.77e-06,4,0.689,6,193018,-6.014,0.461,1,spotify:track:7HXBG0W8gFJwHUh5mVF9tf 366 | 12yj178KaJo8PrddT0StaL,What's Up,Gaullin,0.845,0.775,121.997,0.0397,0.00155,0.0107,4,0.739,5,147541,-5.93,0.839,0,spotify:track:12yj178KaJo8PrddT0StaL 367 | 3AygCrAj6TZZ6mGkcvD9To,Take Your Time,ARTY,0.94,0.0524,127.009,0.0551,0.0476,0.000206,4,0.583,7,186142,-3.05,0.378,1,spotify:track:3AygCrAj6TZZ6mGkcvD9To 368 | 5WNa0eaGNwQ1ZXTHVlULpd,Deep End - SIDEPIECE Remix,John Summit,0.652,0.44,126.007,0.0807,0.143,0.024,4,0.773,11,196687,-9.187,0.453,0,spotify:track:5WNa0eaGNwQ1ZXTHVlULpd 369 | 20McUFi8KCIVdNDLrkTDuZ,Goosebumps,HVME,0.659,0.13,124.946,0.0444,0.325,0.0,4,0.767,1,163208,-7.429,0.439,1,spotify:track:20McUFi8KCIVdNDLrkTDuZ 370 | 59o6ojGNGJOYiVJSzC6Lsa,Memories (feat. Kid Cudi) - 2021 Remix,David Guetta,0.982,0.274,128.122,0.0496,0.00618,0.433,4,0.612,6,162187,-2.984,0.175,0,spotify:track:1pUTByFRmxwuFIl18NpUB8 371 | 1pUTByFRmxwuFIl18NpUB8,The Logical Song,MATTN,0.781,0.139,127.919,0.151,0.00575,0.0,4,0.664,9,150469,-5.3,0.343,0,spotify:track:50Q24gRvLy128dfU2DDoao 372 | 50Q24gRvLy128dfU2DDoao,Distant Memory (with Timmy Trumpet x W&W),R3HAB,0.919,0.277,124.946,0.154,0.0789,1.11e-06,4,0.682,6,157927,-2.447,0.704,0,spotify:track:3lDax71SDuJGcFrCyw9qak 373 | 3lDax71SDuJGcFrCyw9qak,Morning,Karen Harding,0.82,0.104,129.991,0.061,0.00113,0.199,4,0.676,4,144200,-5.347,0.553,0,spotify:track:3V3ijKDFFwPM9ADBAW41XQ 374 | 3V3ijKDFFwPM9ADBAW41XQ,TASTY,Shygirl,0.62,0.112,120.031,0.232,0.414,0.0192,4,0.798,8,164000,-7.079,0.235,0,spotify:track:6f3Slt0GbA2bPZlz0aIFXN 375 | 6f3Slt0GbA2bPZlz0aIFXN,The Business,Tiësto,0.837,0.135,123.954,0.0596,0.0198,4.78e-06,4,0.525,0,196189,-4.012,0.477,0,spotify:track:7I5XQpe29kmU86T37nhJip 376 | 7I5XQpe29kmU86T37nhJip,Lies,MK,0.81,0.322,125.979,0.0669,0.0424,0.000233,4,0.697,6,156888,-5.128,0.558,0,spotify:track:5WYB4aZkflwjAApBoDCYkz 377 | 5WYB4aZkflwjAApBoDCYkz,Astronomia - Never Go Home,Tony Igy,0.866,0.528,128.027,0.106,0.0107,0.0537,4,0.744,9,184687,-4.834,0.302,1,spotify:track:3rgTS3933lMWoPiN6CW4qY 378 | 3rgTS3933lMWoPiN6CW4qY,Kids (feat. MKLA),KSHMR,0.907,0.107,124.007,0.0424,0.0208,0.855,4,0.638,5,245927,-9.357,0.0362,0,spotify:track:0pJDnLRe38vYS1zAhpsESV 379 | 0pJDnLRe38vYS1zAhpsESV,Children - Edit Mix,Tinlicker,0.697,0.332,122.752,0.133,0.0193,0.0,4,0.611,2,320357,-8.618,0.476,1,spotify:track:0DiWol3AO6WpXZgp0goxAV 380 | 0DiWol3AO6WpXZgp0goxAV,One More Time,Daft Punk,0.796,0.25,114.95,0.0343,0.0522,2.69e-05,4,0.803,6,129814,-5.077,0.549,0,spotify:track:2rUsJXt4NeeDiIU6sBvrxo 381 | 2rUsJXt4NeeDiIU6sBvrxo,All We Got (feat. KIDDO) - Ofenbach Remix,Robin Schulz,0.783,0.114,123.998,0.0332,0.176,0.000933,4,0.751,10,147261,-7.974,0.398,0,spotify:track:27bZ77uG7mEhydpaPvThR6 382 | 27bZ77uG7mEhydpaPvThR6,Turn Back Time,Diplo,0.732,0.109,199.978,0.0504,0.0319,0.868,4,0.528,2,292525,-9.492,0.0324,1,spotify:track:3evAUkYDPeLX5kn0LbvGz4 383 | 3evAUkYDPeLX5kn0LbvGz4,Hypnocurrency,Rezz,0.738,0.207,121.936,0.154,0.0129,7.27e-05,4,0.567,0,192838,-6.03,0.432,0,spotify:track:6KddlPfPQ0L8MyffEpo63p 384 | 6KddlPfPQ0L8MyffEpo63p,Water (feat. ZOHARA),KREAM,0.595,0.209,124.114,0.0401,0.0689,0.0,4,0.632,8,167903,-7.644,0.435,0,spotify:track:6ft4hAq6yde8jPZY2i5zLr 385 | 6ft4hAq6yde8jPZY2i5zLr,Paradise (feat. Dermot Kennedy),MEDUZA,0.78,0.184,125.997,0.0529,0.101,4.36e-06,4,0.744,10,142971,-3.631,0.762,0,spotify:track:4FUFk1uJuPtUJrDQ8ZSylK 386 | 4FUFk1uJuPtUJrDQ8ZSylK,Afraid (feat. HARLEE),James Hype,0.724,0.251,117.998,0.0421,0.18,8.69e-05,4,0.696,11,159657,-7.083,0.568,1,spotify:track:1cVQmBnSLjhWB67iqAXYZZ 387 | 1cVQmBnSLjhWB67iqAXYZZ,I Just Wanna (feat. Bow Anderson),Felix Jaehn,0.893,0.0673,119.932,0.0475,0.0441,0.000937,4,0.722,0,116750,-3.255,0.439,0,spotify:track:3iw6V4LH7yPj1ESORX9RIN 388 | 3iw6V4LH7yPj1ESORX9RIN,Wellerman - Sea Shanty / 220 KID x Billen Ted Remix,Nathan Evans,0.927,0.162,126.037,0.049,0.011,0.0,4,0.648,1,182000,-3.633,0.361,1,spotify:track:46lyJh9GYmWsHez3EsvmAx 389 | 46lyJh9GYmWsHez3EsvmAx,Rise Up (feat. Vamero),VINAI,0.82,0.0775,120.066,0.0478,0.0205,0.000685,4,0.749,7,197573,-6.114,0.534,1,spotify:track:3DTqHfTGj1c6y2gDXsTez4 390 | 3DTqHfTGj1c6y2gDXsTez4,Regardless,RAYE,0.822,0.121,127.225,0.0507,0.0534,1.99e-05,4,0.636,0,147402,-4.321,0.338,0,spotify:track:63bWXWGcWnRQvdS8bJWdkB 391 | 63bWXWGcWnRQvdS8bJWdkB,Love Again (feat. Alida),Alok,0.759,0.104,127.966,0.114,0.227,0.00102,4,0.898,7,180152,-4.942,0.24,1,spotify:track:0FRavXSn6XmeItbuJR3VrR 392 | 0FRavXSn6XmeItbuJR3VrR,Space Melody (Edward Artemyev) (feat. Leony),VIZE,0.66,0.14,117.923,0.158,0.158,0.02,4,0.8,0,140012,-4.903,0.634,1,spotify:track:4NexTaCZZ7Ehnf03A6SVjt 393 | 4NexTaCZZ7Ehnf03A6SVjt,Dandelion,Galantis,0.893,0.061,129.047,0.225,0.207,9.33e-05,4,0.898,1,150635,-7.255,0.653,1,spotify:track:4tcPIwy0UvLYjhXLrMyx89 394 | 4tcPIwy0UvLYjhXLrMyx89,Pump It Up,Endor,0.807,0.105,123.904,0.122,0.448,0.0,4,0.759,8,136996,-5.812,0.62,0,spotify:track:0Cnb8XdGDMHAmIRBUJMkIS 395 | 0Cnb8XdGDMHAmIRBUJMkIS,Where The Lights Are Low,Toby Romeo,0.783,0.0488,122.98,0.0773,0.239,2.93e-06,4,0.795,6,151475,-4.715,0.864,0,spotify:track:27ITlhgZIx0ZYwaLYYDBsi 396 | 27ITlhgZIx0ZYwaLYYDBsi,LOVELIFE (with Jeremih),Benny Benassi,0.721,0.285,121.962,0.0506,0.0149,0.00432,4,0.785,8,176219,-5.457,0.894,1,spotify:track:2Wo6QQD1KMDWeFkkjLqwx5 397 | 2Wo6QQD1KMDWeFkkjLqwx5,Roses - Imanbek Remix,SAINt JHN,0.526,0.14,123.935,0.0415,0.129,0.0,4,0.598,10,168387,-8.659,0.529,0,spotify:track:7CHi4DtfK4heMlQaudCuHK 398 | 7CHi4DtfK4heMlQaudCuHK,Lose Control,MEDUZA,0.726,0.134,124.075,0.0468,0.0387,0.0,4,0.668,9,172143,-7.512,0.453,1,spotify:track:7CH8J4ulT49UfZwSDSkSZA 399 | 7CH8J4ulT49UfZwSDSkSZA,i miss u (with Au/Ra),Jax Jones,0.72,0.129,122.031,0.218,0.223,0.0,4,0.789,8,166794,-5.652,0.664,0,spotify:track:3H7ihDc1dqLriiWXwsc2po 400 | 3H7ihDc1dqLriiWXwsc2po,Breaking Me,Topic,0.799,0.113,123.109,0.0446,0.0655,0.0,4,0.728,4,177805,-2.838,0.309,1,spotify:track:3vIPdMmbsye0YMhXy4GeXt 401 | 3vIPdMmbsye0YMhXy4GeXt,Home Sweet Home (feat. ALMA & Digital Farm Animals),Sam Feldt,0.868,0.288,100.048,0.0555,0.0426,2.12e-05,4,0.637,1,160907,-4.921,0.444,0,spotify:track:5k1uIPpsHmnbWFr4nbpdYb 402 | 5k1uIPpsHmnbWFr4nbpdYb,Up All Night (feat. Afrojack),VINAI,0.935,0.236,124.023,0.175,0.00625,0.006,4,0.697,11,167419,-5.809,0.728,0,spotify:track:3Shi5fUIeuoNQWV0hjYXNs 403 | 3Shi5fUIeuoNQWV0hjYXNs,LIES,Steve Aoki,0.76,0.151,183.933,0.0426,0.286,0.0,4,0.504,4,190218,-4.246,0.64,1,spotify:track:1FP9s72rDYty6mfoOEYKnE 404 | 1FP9s72rDYty6mfoOEYKnE,All We Got (feat. KIDDO),Robin Schulz,0.576,0.0959,123.036,0.0345,0.0204,0.0811,4,0.746,11,173951,-4.796,0.0769,0,spotify:track:5QUbOFOkbDlt4ZY7bdL4Am 405 | 5QUbOFOkbDlt4ZY7bdL4Am,I Admit It (feat. 24kGoldn),ZHU,0.773,0.377,122.016,0.0579,0.0166,7.64e-06,4,0.818,8,143953,-5.714,0.878,0,spotify:track:7GiozRoMk95aFl1WbrDdjX 406 | 7GiozRoMk95aFl1WbrDdjX,Nobody,NOTD,0.693,0.089,126.006,0.0326,0.0127,0.066,4,0.733,11,230476,-8.165,0.104,1,spotify:track:3ijMfK5xwJTDdeyJp72mPM 407 | 3ijMfK5xwJTDdeyJp72mPM,Alive,PAX,0.873,0.117,125.906,0.0644,0.169,1.53e-05,4,0.684,0,160000,-4.94,0.374,1,spotify:track:0WDHsTEgyvjw4EM24O0Tyd 408 | 0WDHsTEgyvjw4EM24O0Tyd,Love Is Killing Me,BONNIE X CLYDE,0.651,0.104,149.979,0.0384,0.0819,0.0,4,0.494,11,222400,-4.127,0.162,0,spotify:track:06kxa3al7bUqRRo5nAFduZ 409 | 06kxa3al7bUqRRo5nAFduZ,Nightlight,ILLENIUM,0.793,0.104,125.028,0.0391,0.00542,4.1e-05,4,0.673,4,181742,-5.265,0.352,0,spotify:track:4kd8NJrrfzzPvarSre2yAu 410 | 4kd8NJrrfzzPvarSre2yAu,Need You Now,Armin van Buuren,0.766,0.129,123.062,0.0568,0.0219,6.81e-06,4,0.677,6,190488,-6.896,0.198,1,spotify:track:51Of5p3lKZeOg6itfs4og4 411 | 51Of5p3lKZeOg6itfs4og4,Lovefool,twocolors,0.599,0.083,127.986,0.039,0.347,0.824,4,0.819,11,246507,-6.778,0.489,1,spotify:track:73X9X7kDgsm4YeHpc8prf6 412 | 73X9X7kDgsm4YeHpc8prf6,Apricots,Bicep,0.874,0.0489,122.953,0.0662,0.168,1.14e-05,4,0.734,8,166028,-3.158,0.905,1,spotify:track:6cx06DFPPHchuUAcTxznu9 413 | 6cx06DFPPHchuUAcTxznu9,Head & Heart (feat. MNEK),Joel Corry,0.92,0.329,132.001,0.0539,0.0126,0.117,4,0.675,0,329280,-7.153,0.842,0,spotify:track:0csz09qS2n8Jo7LogHKu7j 414 | 0csz09qS2n8Jo7LogHKu7j,Tondo,Disclosure,0.631,0.119,121.968,0.033,0.00833,0.146,4,0.639,5,177598,-10.686,0.197,0,spotify:track:3SXRZuCEGbbxsPiHyqwWuG 415 | 3SXRZuCEGbbxsPiHyqwWuG,Underwater,Anabel Englund,0.665,0.286,126.005,0.0639,0.000713,0.323,4,0.867,7,246600,-8.802,0.55,0,spotify:track:3HYCPBUC827RcXZsfwAU4l 416 | 3HYCPBUC827RcXZsfwAU4l,Innadadance (feat. Suli Breaks & Jazzie B),Faithless,0.788,0.115,118.039,0.0908,0.0703,0.0,4,0.729,10,159536,-4.832,0.857,0,spotify:track:3GYlQmwfBDo7imFyGPhrl7 417 | 3GYlQmwfBDo7imFyGPhrl7,Say My Name,Dimitri Vegas & Like Mike,0.678,0.127,128.021,0.06,0.707,0.0,4,0.865,1,240813,-5.596,0.778,1,spotify:track:6RFJxVj9tL0Xrd3Jve4Vo4 418 | 6RFJxVj9tL0Xrd3Jve4Vo4,Héroe Favorito,Romeo Santos,0.585,0.0707,132.053,0.0443,0.292,0.00141,4,0.899,11,260387,-7.839,0.96,1,spotify:track:05XwC0A5ZfyMJbwtO4yngG 419 | 05XwC0A5ZfyMJbwtO4yngG,Llora Alma Mía,Yoskar Sarante,0.83,0.111,127.103,0.0297,0.0489,0.0,4,0.704,11,211453,-3.139,0.957,1,spotify:track:0u4N6w5lBw5xMrzJitRWUo 420 | 0u4N6w5lBw5xMrzJitRWUo,Corazon Sin Cara,Prince Royce,0.649,0.0973,122.99,0.0372,0.465,0.0,4,0.839,0,222080,-6.121,0.904,1,spotify:track:0Kt035u0yJBkOnM1BYPpI6 421 | 0Kt035u0yJBkOnM1BYPpI6,Culpa al Corazón,Prince Royce,0.648,0.0953,127.953,0.0389,0.197,0.0,4,0.786,7,219053,-6.195,0.891,0,spotify:track:3fPMRb2gcFTZcYmR0bXnDc 422 | 3fPMRb2gcFTZcYmR0bXnDc,Te Robaré,Prince Royce,0.729,0.206,123.046,0.0374,0.401,1.2e-06,4,0.843,6,250640,-3.634,0.903,0,spotify:track:6I86RF3odBlcuZA9Vfjzeq 423 | 6I86RF3odBlcuZA9Vfjzeq,Eres Mía,Romeo Santos,0.719,0.249,131.954,0.0452,0.457,0.0,4,0.885,4,241766,-5.507,0.876,0,spotify:track:4AX0mPH9LnPtRPU7qYqTHW 424 | 4AX0mPH9LnPtRPU7qYqTHW,Me Voy (feat. Romeo Santos),"Héctor Acosta ""El Torito""",0.884,0.0459,119.15,0.0546,0.552,2.59e-05,4,0.758,0,259067,-2.793,0.889,1,spotify:track:63016P9yyqY523dTSrsNZH 425 | 63016P9yyqY523dTSrsNZH,Píntame,Elvis Crespo,0.874,0.0476,124.052,0.071,0.234,0.00162,4,0.814,8,267160,-3.18,0.911,1,spotify:track:7JIjUx3GsL0upxmNJacmtz 426 | 7JIjUx3GsL0upxmNJacmtz,Suavemente,Elvis Crespo,0.913,0.0478,128.901,0.0539,0.394,0.000833,4,0.783,9,274040,-3.098,0.853,1,spotify:track:36gbETWFHYOhKagApK6spF 427 | 36gbETWFHYOhKagApK6spF,Tu Sonrisa,Elvis Crespo,0.736,0.213,135.024,0.0301,0.506,1.12e-05,4,0.754,9,230840,-5.404,0.96,1,spotify:track:19Sij07U1rhR57FoAwpVEz 428 | 19Sij07U1rhR57FoAwpVEz,Tatuaje (feat. Bachata Heightz),Elvis Crespo,0.943,0.108,122.135,0.0443,0.446,0.00259,4,0.801,9,265533,-3.729,0.931,1,spotify:track:0go99GZlacnuwN249CgCfG 429 | 0go99GZlacnuwN249CgCfG,Luna Llena,Elvis Crespo,0.885,0.239,126.228,0.0466,0.425,0.00256,4,0.692,7,208640,-3.132,0.923,0,spotify:track:16LDbpqgCtvEZDQ5wfOWrj 430 | 16LDbpqgCtvEZDQ5wfOWrj,Nuestra Cancion,Elvis Crespo,0.901,0.041,123.242,0.037,0.458,0.00656,4,0.799,9,287227,-3.333,0.957,1,spotify:track:1g7pyL3TVrXvJRLMShJUUI 431 | 1g7pyL3TVrXvJRLMShJUUI,Princesita,Elvis Crespo,0.951,0.063,165.373,0.225,0.541,0.0,4,0.648,7,216504,-1.577,0.967,1,spotify:track:3ilsYQV58CAdhmQuDjke1C 432 | 3ilsYQV58CAdhmQuDjke1C,Dale Vieja Dale,Toño Rosario,0.85,0.0634,130.019,0.0598,0.013,0.00023,4,0.849,10,190734,-3.785,0.788,0,spotify:track:6IZ6XJEWn2c9wfJQ1HTDGJ 433 | 6IZ6XJEWn2c9wfJQ1HTDGJ,Pa Que Me Dan de Eso,Don Miguelo,0.915,0.0695,109.99,0.055,0.0245,0.000128,4,0.876,3,148014,-4.618,0.916,1,spotify:track:7mo10WU1gtn1Q3XlpyYPE9 434 | 7mo10WU1gtn1Q3XlpyYPE9,Dale un Boton,Liro Shaq,0.395,0.0712,128.092,0.06,0.834,0.113,4,0.912,4,310613,-8.971,0.927,0,spotify:track:5guZMseET21n74ZIIOoXD2 435 | 5guZMseET21n74ZIIOoXD2,Vocales de amor,Joan Soriano,0.56,0.0608,133.682,0.0397,0.416,0.0,4,0.804,1,254720,-6.912,0.768,0,spotify:track:65H6t1WQBim6q93yM8fEwn 436 | 65H6t1WQBim6q93yM8fEwn,Obsesion,Aventura,0.782,0.112,135.009,0.0325,0.293,0.0,4,0.863,7,251907,-3.143,0.958,1,spotify:track:4ZIyAJRSCffZBDdrQi2D4K 437 | 4ZIyAJRSCffZBDdrQi2D4K,Primavera Azul,"Héctor Acosta ""El Torito""",0.877,0.42,121.98,0.202,0.0163,0.0118,4,0.91,1,165303,-4.22,0.946,1,spotify:track:1z8gObqL6bpHYuNBd4WCKZ 438 | 1z8gObqL6bpHYuNBd4WCKZ,Te Siento en Para,Ceky Viciny,0.489,0.15,129.97,0.0353,0.62,3.69e-05,4,0.847,0,242533,-12.105,0.895,1,spotify:track:38nwdi1gZfoXsDFrk4eSF4 439 | 38nwdi1gZfoXsDFrk4eSF4,Como Sanar,Frank Reyes,0.657,0.0867,135.304,0.0411,0.54,0.000839,4,0.866,10,180584,-5.216,0.963,1,spotify:track:461B3KmKXpH92lf9cWcpaQ 440 | 461B3KmKXpH92lf9cWcpaQ,Devuélveme Mi Libertad,Frank Reyes,0.729,0.151,139.97,0.0288,0.511,0.00087,4,0.78,1,204565,-5.087,0.718,1,spotify:track:4CKNP0H3WEWQBSNGeOvjFU 441 | 4CKNP0H3WEWQBSNGeOvjFU,Mujer de las Mil Batallas,Frank Reyes,0.738,0.136,132.992,0.038,0.276,3.07e-06,4,0.806,4,244300,-3.649,0.854,1,spotify:track:38o8GBqVGScqG1mclUymmd 442 | 38o8GBqVGScqG1mclUymmd,Necesito de Ti,Anthony Santos,0.801,0.31,123.981,0.0327,0.39,0.0,4,0.732,9,196480,-3.859,0.824,1,spotify:track:46HdsiK0uR26B2dY9QPzda 443 | 46HdsiK0uR26B2dY9QPzda,Deja vu,Prince Royce,0.849,0.0379,134.103,0.0524,0.181,0.000185,4,0.918,9,242040,-4.905,0.96,1,spotify:track:6vIJeMh2PMfvOApN3eCZCE 444 | 6vIJeMh2PMfvOApN3eCZCE,Ayer Te Llame,La Makina,0.431,0.506,150.005,0.395,0.0111,0.0166,4,0.727,2,257987,-12.007,0.223,1,spotify:track:6DB2KOEwHnjkgEnBt5SdeJ 445 | 6DB2KOEwHnjkgEnBt5SdeJ,Mask Off (feat. Kendrick Lamar) - Remix,Future,0.927,0.416,105.045,0.0835,0.0485,0.0,4,0.811,11,198625,-1.711,0.706,1,spotify:track:6OdD1XrpFD5BuxiAMFUWZC 446 | 6OdD1XrpFD5BuxiAMFUWZC,Te De Campana,Atomic Otro Way,0.779,0.333,150.069,0.211,0.0135,0.0,4,0.55,0,230281,-3.841,0.315,1,spotify:track:0RIHDrcRAXtUlnkvTYPW1a 447 | 0RIHDrcRAXtUlnkvTYPW1a,"All I Do Is Win - Feat. T-Pain, Ludacris, Snoop Dogg & Rick Ross",DJ Khaled,0.584,0.0833,146.646,0.467,0.0391,1.55e-05,4,0.62,11,546834,-12.148,0.563,0,spotify:track:6OgYscysKGzWsSRw8Xmj3D 448 | 6OgYscysKGzWsSRw8Xmj3D,"Jersey Club, Pt. 3",DJ Prospect,0.672,0.118,97.979,0.0688,0.0329,0.0,4,0.671,0,204173,-3.094,0.632,0,spotify:track:1OAh8uOEOvTDqkKFsKksCi 449 | 1OAh8uOEOvTDqkKFsKksCi,Wild Thoughts (feat. Rihanna & Bryson Tiller),DJ Khaled,0.968,0.347,135.099,0.046,0.123,0.0,4,0.666,10,219240,-3.196,0.834,1,spotify:track:0HNXnhNZZtRZFLhP4hfyCP 450 | 0HNXnhNZZtRZFLhP4hfyCP,Hey Baby (Radio Mix),DJ Ötzi,0.622,0.0948,80.015,0.046,0.163,0.0,4,0.715,4,195053,-5.102,0.808,0,spotify:track:2rCbl9naJYhaxjLsfx88uM 451 | 2rCbl9naJYhaxjLsfx88uM,Pareja Del Año,Sebastian Yatra,0.691,0.226,168.024,0.352,0.614,1.04e-05,4,0.812,8,255607,-5.837,0.876,0,spotify:track:2TmT3wSwRf0CYJFGGaIXNB 452 | 2TmT3wSwRf0CYJFGGaIXNB,Si Te Veo,Arcangel,0.748,0.0992,133.028,0.162,0.354,0.0,4,0.83,1,177443,-5.362,0.523,1,spotify:track:3ke6it1vTmHtz2ApcIVUz5 453 | 3ke6it1vTmHtz2ApcIVUz5,"Snow Tha Product: Bzrp Music Sessions, Vol. 39",Bizarrap,0.598,0.0783,74.858,0.0769,0.107,1.89e-06,4,0.705,9,197960,-3.439,0.335,1,spotify:track:74UFJflGMdA46TltO7XPSB 454 | 74UFJflGMdA46TltO7XPSB,Te Necesito,KHEA,0.596,0.0728,167.933,0.315,0.308,0.0016,4,0.764,6,171429,-6.059,0.77,0,spotify:track:4hs52wFSucGnS5dYryIZ4F 455 | 4hs52wFSucGnS5dYryIZ4F,Perreito Salvaje,Emilia,0.628,0.0461,92.021,0.0536,0.147,1.92e-06,4,0.803,9,193043,-4.358,0.661,0,spotify:track:4M4DTyLupKvbJKlE4I4EYq 456 | 4M4DTyLupKvbJKlE4I4EYq,YO SE QUE TU (feat. Rusherking),FMK,0.541,0.286,92.003,0.0674,0.161,5.01e-06,4,0.85,2,165275,-4.522,0.916,1,spotify:track:0cOa970mzTWAxKtltpkpLc 457 | 0cOa970mzTWAxKtltpkpLc,Miénteme,TINI,0.517,0.0916,171.959,0.333,0.399,8.95e-05,4,0.83,6,182496,-6.416,0.616,0,spotify:track:2dNhNlpZAtV4lwAFW45LIv 458 | 2dNhNlpZAtV4lwAFW45LIv,Am,Nio Garcia,0.455,0.12,83.876,0.224,0.675,1.08e-05,4,0.54,3,212032,-5.988,0.432,1,spotify:track:71R8HJxQk5qMiRstrlXN9t 459 | 71R8HJxQk5qMiRstrlXN9t,2/Catorce,Rauw Alejandro,0.66,0.107,83.971,0.1,0.141,0.0,4,0.833,9,221121,-3.985,0.751,0,spotify:track:5eaLGyPrVG7FbZ5vVnBm93 460 | 5eaLGyPrVG7FbZ5vVnBm93,IMPOSIBLE - REMIX,Blessd,0.861,0.125,88.004,0.196,0.319,1.58e-06,4,0.791,1,215135,-3.994,0.606,1,spotify:track:2E5AxSvxrnRsaExLe1aaXI 461 | 2E5AxSvxrnRsaExLe1aaXI,EL TREN,Micro TDH,0.738,0.105,94.024,0.0541,0.0708,0.000223,4,0.84,4,169000,-2.341,0.727,0,spotify:track:1VkfjnJvS5Q5Zn5TmqvcFZ 462 | 1VkfjnJvS5Q5Zn5TmqvcFZ,LE GUSTA QUE LA VEAN,Lunay,0.548,0.145,94.036,0.164,0.0751,0.000234,4,0.503,0,228920,-7.564,0.441,0,spotify:track:2CdTLdDjwZdVcm0bresVWx 463 | 2CdTLdDjwZdVcm0bresVWx,Otra Noche Sin Ti,J Balvin,0.899,0.299,90.025,0.127,0.192,0.000189,4,0.786,10,216510,-0.515,0.813,1,spotify:track:5u7twkeask1VIyDeNTElSU 464 | 5u7twkeask1VIyDeNTElSU,Sal y Perrea,Sech,0.723,0.083,83.691,0.283,0.488,0.0,4,0.549,6,214000,-5.228,0.782,0,spotify:track:1KwMVzMArDnM5m2LNuzXAO 465 | 1KwMVzMArDnM5m2LNuzXAO,Millonario (Remix) [feat. Ozuna],Messiah,0.669,0.0914,110.696,0.0748,0.0438,0.0,5,0.852,6,151813,-4.067,0.682,1,spotify:track:4e54PAuILqrhjr2ryuMvdq 466 | 4e54PAuILqrhjr2ryuMvdq,PURRITO APA,Feid,0.627,0.112,82.562,0.316,0.483,5.48e-06,4,0.713,9,180364,-8.723,0.653,0,spotify:track:2jMesSWfkSsFyk94weNwi1 467 | 2jMesSWfkSsFyk94weNwi1,Acuérdate De Mí,LATENIGHTJIGGY,0.695,0.519,130.027,0.125,0.0578,3.72e-06,4,0.745,2,187898,-5.888,0.618,0,spotify:track:1QigNNcv8c5X2iL294bZev 468 | 1QigNNcv8c5X2iL294bZev,MÍRENME AHORA,Myke Towers,0.477,0.21,93.027,0.292,0.68,0.0,4,0.77,8,209640,-9.728,0.565,0,spotify:track:48wkz2E0apRJr6E4zQyDpx 469 | 48wkz2E0apRJr6E4zQyDpx,7 De Mayo,J Balvin,0.738,0.119,88.985,0.0558,0.296,0.00126,4,0.742,1,189375,-4.86,0.456,1,spotify:track:0cHuDFkcVBjuvYQxEgcpBv 470 | 0cHuDFkcVBjuvYQxEgcpBv,Feeling,Dalex,0.593,0.154,90.002,0.0702,0.386,0.168,4,0.852,6,221407,-5.892,0.87,1,spotify:track:66S2z95FN3nUAr9S1gUIsp 471 | 66S2z95FN3nUAr9S1gUIsp,Ella,Boza,0.56,0.0556,97.988,0.107,0.143,2.08e-05,4,0.845,2,230204,-7.002,0.819,0,spotify:track:0PG6Bi0xxnArCbS6hJpC4q 472 | 0PG6Bi0xxnArCbS6hJpC4q,LO NECESARIO,Aissa,0.812,0.0747,100.065,0.0843,0.37,0.0,4,0.689,1,187200,-2.078,0.605,0,spotify:track:2ITfHO15LB2CFYKEhSS3dE 473 | 2ITfHO15LB2CFYKEhSS3dE,Demente,Denise Rosenthal,0.673,0.12,180.026,0.102,0.232,4.45e-06,4,0.74,0,198592,-2.872,0.698,1,spotify:track:1bmm8qIp60aMkozpkPnxNM 474 | 1bmm8qIp60aMkozpkPnxNM,Me Enamora,Lenny Tavárez,0.673,0.107,109.019,0.127,0.282,3.24e-06,4,0.89,9,178349,-4.993,0.85,0,spotify:track:0Fl57YAClqAj6DKo7H2TR3 475 | 0Fl57YAClqAj6DKo7H2TR3,Vamo' a Gozárnola,Maluma,0.544,0.292,176.173,0.213,0.326,0.0,4,0.71,6,194447,-4.787,0.77,1,spotify:track:4GpnuoBxRqKZUjZ5FdwPG2 476 | 4GpnuoBxRqKZUjZ5FdwPG2,Presente Y Futuro,Llane,0.567,0.164,143.01,0.212,0.179,0.0,4,0.684,6,151588,-8.031,0.702,1,spotify:track:6DPIWnxy6DBXUrkdAs58dn 477 | 6DPIWnxy6DBXUrkdAs58dn,Black & Proud,DEVA,0.558,0.1,179.972,0.229,0.306,0.000327,4,0.741,11,188955,-6.029,0.265,0,spotify:track:0iWxrdjwEGOrTC9AszgAJk 478 | 0iWxrdjwEGOrTC9AszgAJk,Viendo el Techo,Jay Wheeler,0.602,0.0856,112.012,0.0929,0.857,2.32e-06,4,0.653,11,161187,-8.177,0.411,1,spotify:track:0RGwZxzgWTs5z0qQgd9apG 479 | 0RGwZxzgWTs5z0qQgd9apG,Ruta 66,Ankhal,0.621,0.0953,83.95,0.0888,0.247,1.31e-06,4,0.752,4,180714,-6.119,0.432,0,spotify:track:3YLIOwJrc2qPpPpmTi1IJ2 480 | 3YLIOwJrc2qPpPpmTi1IJ2,Gira Gira,Las Villa,0.752,0.0866,180.017,0.149,0.25,0.00386,4,0.778,1,171814,-4.976,0.791,0,spotify:track:5H6SZcjJzBNsB2VzKW2Ivd 481 | 5H6SZcjJzBNsB2VzKW2Ivd,Tiempo,Ozuna,0.899,0.0894,128.05,0.0494,0.222,1.14e-06,4,0.77,8,231604,-2.981,0.851,1,spotify:track:6PDlkWmrq2ZKiUuFt2aQsH 482 | 6PDlkWmrq2ZKiUuFt2aQsH,Loco,Justin Quiles,0.763,0.278,93.977,0.16,0.129,1.54e-05,4,0.785,11,172827,-3.708,0.384,0,spotify:track:5dWSxhdL95JvuzrhU5Pexe 483 | 5dWSxhdL95JvuzrhU5Pexe,Mala De Verdad,Mariah Angeliq,0.813,0.278,97.018,0.0777,0.305,0.0,4,0.908,5,200785,-2.749,0.924,0,spotify:track:4DHDIdeayp8xvlyg22wREO 484 | 4DHDIdeayp8xvlyg22wREO,Ram Pam Pam,Natti Natasha,0.797,0.252,102.028,0.0782,0.189,6.66e-06,4,0.889,9,174932,-4.073,0.543,1,spotify:track:2KNcIEF7mHjChtXSPddVmu 485 | 2KNcIEF7mHjChtXSPddVmu,Rumba (Puro Oro Anthem),Maluma,0.682,0.361,89.085,0.271,0.207,0.0,4,0.635,10,288282,-6.86,0.673,1,spotify:track:2fpKvUg9hxiKAOLuwfEdlJ 486 | 2fpKvUg9hxiKAOLuwfEdlJ,Conexión,Foreign Teck,0.885,0.291,103.006,0.046,0.00642,0.0,4,0.686,7,224587,-4.485,0.263,1,spotify:track:3yFFIGLByW4gG7U7ogIHPd 487 | 3yFFIGLByW4gG7U7ogIHPd,Aire,Steve Aoki,0.665,0.184,180.017,0.233,0.236,3.48e-06,4,0.801,0,254173,-3.805,0.69,1,spotify:track:3w8S5rmjdFWD9X5VNQgwMh 488 | 3w8S5rmjdFWD9X5VNQgwMh,Bonita - Remix,Jeeiph,0.64,0.081,81.157,0.154,0.241,0.0,4,0.592,6,208469,-5.577,0.623,0,spotify:track:6IXx1EoraLU3mFBYCXh1av 489 | 6IXx1EoraLU3mFBYCXh1av,No Se Que,Boza,0.64,0.17,170.067,0.207,0.119,0.0,4,0.773,3,228720,-4.777,0.605,0,spotify:track:2MaYHbpwybBOm9CrDBfChl 490 | 2MaYHbpwybBOm9CrDBfChl,Cosas Malas,Manuel Turizo,0.538,0.104,106.646,0.22,0.455,0.0,5,0.507,1,201750,-5.965,0.472,0,spotify:track:0AobgJo4CiiUPxnQktjswB 491 | 0AobgJo4CiiUPxnQktjswB,De Mí Para Tí - Remix,vf7,0.771,0.093,154.001,0.0796,0.075,3.89e-05,4,0.825,2,212416,-2.515,0.929,0,spotify:track:3ymdUMzgylwrSfpxdlCUWV 492 | 3ymdUMzgylwrSfpxdlCUWV,EL PONY,Daddy Yankee,0.688,0.152,169.929,0.261,0.187,0.000126,4,0.766,11,279832,-7.223,0.62,0,spotify:track:7BErD9UIVpUr07RXsX8YyX 493 | 7BErD9UIVpUr07RXsX8YyX,Inocentes,Alex Gargolas,0.755,0.556,179.826,0.0861,0.183,0.0,4,0.606,7,202430,-4.916,0.743,0,spotify:track:3OYQbnGzAPgoxlRRnu5PRa 494 | 3OYQbnGzAPgoxlRRnu5PRa,Sin Panty,Nio Garcia,0.796,0.258,173.888,0.257,0.134,2.68e-05,4,0.598,6,147250,-5.561,0.834,1,spotify:track:1TGIQTydkggLD4Ikfc2cmY 495 | 1TGIQTydkggLD4Ikfc2cmY,Montoya,Farina,0.67,0.226,96.013,0.148,0.208,0.00105,4,0.859,7,185000,-4.859,0.667,1,spotify:track:56hRNcWyNKZ2W5AT60hAe2 496 | 56hRNcWyNKZ2W5AT60hAe2,Caliente,Manuel Turizo,0.77,0.23,82.001,0.1,0.444,7.24e-05,4,0.83,5,237627,-3.364,0.739,0,spotify:track:3YNolHalg56UrvPabqw6JP 497 | 3YNolHalg56UrvPabqw6JP,Fragancia (with Jay Wheeler),Juhn,0.852,0.0838,168.118,0.275,0.188,0.0,4,0.731,6,154126,-5.571,0.608,0,spotify:track:1sO0Y7fVn6JXqgd5lOTlsx 498 | 1sO0Y7fVn6JXqgd5lOTlsx,Millonario,Messiah,0.621,0.118,151.983,0.157,0.224,0.0,4,0.89,11,155740,-5.806,0.537,0,spotify:track:6rcKAarXztPHGdnNS2s8q9 499 | 6rcKAarXztPHGdnNS2s8q9,New Calle (feat. Doeman),De La Ghetto,0.675,0.0759,102.377,0.17,0.0636,0.00757,4,0.609,1,170387,-3.657,0.44,0,spotify:track:6wi7nKXKwAsJ2moj9JsaX5 500 | 6wi7nKXKwAsJ2moj9JsaX5,De la Mata,Gigolo Y La Exce,0.44,0.0971,121.93,0.0566,0.0232,1.55e-06,4,0.773,11,130348,-7.526,0.627,0,spotify:track:6BQKLd86gks38xcNuXLw4q 501 | 6BQKLd86gks38xcNuXLw4q,Nubes,Mi$HNRZ,0.66,0.122,92.988,0.0652,0.0659,0.0,4,0.778,5,231547,-6.776,0.669,0,spotify:track:0uYrddmRKNDcG2NfiJec0q 502 | 0uYrddmRKNDcG2NfiJec0q,Dímelo Shorty,Nacho,0.477,0.126,188.026,0.565,0.302,2e-06,4,0.742,6,185923,-11.021,0.435,0,spotify:track:1rX556xgeUc50HUZBvgguK 503 | 1rX556xgeUc50HUZBvgguK,SIEMPRE TARDE,Kris Floyd,0.867,0.114,99.038,0.229,0.25,0.0,4,0.733,8,197879,-3.118,0.778,1,spotify:track:6wnysAiKxkM6Yk87S4xSI9 504 | 6wnysAiKxkM6Yk87S4xSI9,Tóxico,Fran Rozzano,0.589,0.113,89.963,0.134,0.13,0.0,4,0.891,11,173333,-4.595,0.686,0,spotify:track:6ZYa7s67Xdr0BqKB9IXYUP 505 | --------------------------------------------------------------------------------