From 372e98ded98305a83e3609f86766d5bbd2cdeb5c Mon Sep 17 00:00:00 2001 From: agres Date: Thu, 3 Apr 2025 17:28:46 +0200 Subject: [PATCH] Audoi analysis of tracks --- src/audio_analysis.ipynb | 389 ++++++++++++--------------------------- 1 file changed, 122 insertions(+), 267 deletions(-) diff --git a/src/audio_analysis.ipynb b/src/audio_analysis.ipynb index 9f9673d..01c9879 100644 --- a/src/audio_analysis.ipynb +++ b/src/audio_analysis.ipynb @@ -2,254 +2,14 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, + "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Processing file 1/1772...\n", - "Processing file 2/1772...\n", - "Processing file 3/1772...\n", - "Processing file 4/1772...\n", - "Processing file 5/1772...\n", - "Processing file 6/1772...\n", - "Processing file 7/1772...\n", - "Processing file 8/1772...\n", - "Processing file 9/1772...\n", - "Processing file 10/1772...\n", - "Processing file 11/1772...\n", - "Processing file 12/1772...\n", - "Processing file 13/1772...\n", - "Processing file 14/1772...\n", - "Processing file 15/1772...\n", - "Processing file 16/1772...\n", - "Processing file 17/1772...\n", - "Processing file 18/1772...\n", - "Processing file 19/1772...\n", - "Processing file 20/1772...\n", - "Processing file 21/1772...\n", - "Processing file 22/1772...\n", - "Processing file 23/1772...\n", - "Processing file 24/1772...\n", - "Processing file 25/1772...\n", - "Processing file 26/1772...\n", - "Processing file 27/1772...\n", - "Processing file 28/1772...\n", - "Processing file 29/1772...\n", - "Processing file 30/1772...\n", - "Processing file 31/1772...\n", - "Processing file 32/1772...\n", - "Processing file 33/1772...\n", - "Processing file 34/1772...\n", - "Processing file 35/1772...\n", - "Processing file 36/1772...\n", - "Processing file 37/1772...\n", - "Processing file 38/1772...\n", - "Processing file 39/1772...\n", - "Processing file 40/1772...\n", - "Processing file 41/1772...\n", - "Processing file 42/1772...\n", - "Processing file 43/1772...\n", - "Processing file 44/1772...\n", - "Processing file 45/1772...\n", - "Processing file 46/1772...\n", - "Processing file 47/1772...\n", - "Processing file 48/1772...\n", - "Processing file 49/1772...\n", - "Processing file 50/1772...\n", - "Processing file 51/1772...\n", - "Processing file 52/1772...\n", - "Processing file 53/1772...\n", - "Processing file 54/1772...\n", - "Processing file 55/1772...\n", - "Processing file 56/1772...\n", - "Processing file 57/1772...\n", - "Processing file 58/1772...\n", - "Processing file 59/1772...\n", - "Processing file 60/1772...\n", - "Processing file 61/1772...\n", - "Processing file 62/1772...\n", - "Processing file 63/1772...\n", - "Processing file 64/1772...\n", - "Processing file 65/1772...\n", - "Processing file 66/1772...\n", - "Processing file 67/1772...\n", - "Processing file 68/1772...\n", - "Processing file 69/1772...\n", - "Processing file 70/1772...\n", - "Processing file 71/1772...\n", - "Processing file 72/1772...\n", - "Processing file 73/1772...\n", - "Processing file 74/1772...\n", - "Processing file 75/1772...\n", - "Processing file 76/1772...\n", - "Processing file 77/1772...\n", - "Processing file 78/1772...\n", - "Processing file 79/1772...\n", - "Processing file 80/1772...\n", - "Processing file 81/1772...\n", - "Processing file 82/1772...\n", - "Processing file 83/1772...\n", - "Processing file 84/1772...\n", - "Processing file 85/1772...\n", - "Processing file 86/1772...\n", - "Processing file 87/1772...\n", - "Processing file 88/1772...\n", - "Processing file 89/1772...\n", - "Processing file 90/1772...\n", - "Processing file 91/1772...\n", - "Processing file 92/1772...\n", - "Processing file 93/1772...\n", - "Processing file 94/1772...\n", - "Processing file 95/1772...\n", - "Processing file 96/1772...\n", - "Processing file 97/1772...\n", - "Processing file 98/1772...\n", - "Processing file 99/1772...\n", - "Processing file 100/1772...\n", - "Processing file 101/1772...\n", - "Processing file 102/1772...\n", - "Processing file 103/1772...\n", - "Processing file 104/1772...\n", - "Processing file 105/1772...\n", - "Processing file 106/1772...\n", - "Processing file 107/1772...\n", - "Processing file 108/1772...\n", - "Processing file 109/1772...\n", - "Processing file 110/1772...\n", - "Processing file 111/1772...\n", - "Processing file 112/1772...\n", - "Processing file 113/1772...\n", - "Processing file 114/1772...\n", - "Processing file 115/1772...\n", - "Processing file 116/1772...\n", - "Processing file 117/1772...\n", - "Processing file 118/1772...\n", - "Processing file 119/1772...\n", - "Processing file 120/1772...\n", - "Processing file 121/1772...\n", - "Processing file 122/1772...\n", - "Processing file 123/1772...\n", - "Processing file 124/1772...\n", - "Processing file 125/1772...\n", - "Processing file 126/1772...\n", - "Processing file 127/1772...\n", - "Processing file 128/1772...\n", - "Processing file 129/1772...\n", - "Processing file 130/1772...\n", - "Processing file 131/1772...\n", - "Processing file 132/1772...\n", - "Processing file 133/1772...\n", - "Processing file 134/1772...\n", - "Processing file 135/1772...\n", - "Processing file 136/1772...\n", - "Processing file 137/1772...\n", - "Processing file 138/1772...\n", - "Processing file 139/1772...\n", - "Processing file 140/1772...\n", - "Processing file 141/1772...\n", - "Processing file 142/1772...\n", - "Processing file 143/1772...\n", - "Processing file 144/1772...\n", - "Processing file 145/1772...\n", - "Processing file 146/1772...\n", - "Processing file 147/1772...\n", - "Processing file 148/1772...\n", - "Processing file 149/1772...\n", - "Processing file 150/1772...\n", - "Processing file 151/1772...\n", - "Processing file 152/1772...\n", - "Processing file 153/1772...\n", - "Processing file 154/1772...\n", - "Processing file 155/1772...\n", - "Processing file 156/1772...\n", - "Processing file 157/1772...\n", - "Processing file 158/1772...\n", - "Processing file 159/1772...\n", - "Processing file 160/1772...\n", - "Processing file 161/1772...\n", - "Processing file 162/1772...\n", - "Processing file 163/1772...\n", - "Processing file 164/1772...\n", - "Processing file 165/1772...\n", - "Processing file 166/1772...\n", - "Processing file 167/1772...\n", - "Processing file 168/1772...\n", - "Processing file 169/1772...\n", - "Processing file 170/1772...\n", - "Processing file 171/1772...\n", - "Processing file 172/1772...\n", - "Processing file 173/1772...\n", - "Processing file 174/1772...\n", - "Processing file 175/1772...\n", - "Processing file 176/1772...\n", - "Processing file 177/1772...\n", - "Processing file 178/1772...\n", - "Processing file 179/1772...\n", - "Processing file 180/1772...\n", - "Processing file 181/1772...\n", - "Processing file 182/1772...\n", - "Processing file 183/1772...\n", - "Processing file 184/1772...\n", - "Processing file 185/1772...\n", - "Processing file 186/1772...\n", - "Processing file 187/1772...\n", - "Processing file 188/1772...\n", - "Processing file 189/1772...\n", - "Processing file 190/1772...\n", - "Processing file 191/1772...\n", - "Processing file 192/1772...\n", - "Processing file 193/1772...\n", - "Processing file 194/1772...\n", - "Processing file 195/1772...\n", - "Processing file 196/1772...\n", - "Processing file 197/1772...\n", - "Processing file 198/1772...\n", - "Processing file 199/1772...\n", - "Processing file 200/1772...\n", - "Processing file 201/1772...\n", - "Processing file 202/1772...\n", - "Processing file 203/1772...\n", - "Processing file 204/1772...\n", - "Processing file 205/1772...\n", - "Processing file 206/1772...\n", - "Processing file 207/1772...\n", - "Processing file 208/1772...\n", - "Processing file 209/1772...\n", - "Processing file 210/1772...\n", - "Processing file 211/1772...\n", - "Processing file 212/1772...\n", - "Processing file 213/1772...\n", - "Processing file 214/1772...\n", - "Processing file 215/1772...\n", - "Processing file 216/1772...\n", - "Processing file 217/1772...\n", - "Processing file 218/1772...\n", - "Processing file 219/1772...\n", - "Processing file 220/1772...\n", - "Processing file 221/1772...\n", - "Processing file 222/1772...\n", - "Processing file 223/1772...\n", - "Processing file 224/1772...\n", - "Processing file 225/1772...\n", - "Processing file 226/1772...\n" - ] - }, - { - "ename": "KeyboardInterrupt", - "evalue": "", - "output_type": "error", - "traceback": [ - "\u001b[31m---------------------------------------------------------------------------\u001b[39m", - "\u001b[31mKeyboardInterrupt\u001b[39m Traceback (most recent call last)", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[1]\u001b[39m\u001b[32m, line 53\u001b[39m\n\u001b[32m 51\u001b[39m file_path = os.path.join(folder_path, file)\n\u001b[32m 52\u001b[39m file_id = os.path.splitext(file)[\u001b[32m0\u001b[39m]\n\u001b[32m---> \u001b[39m\u001b[32m53\u001b[39m features = \u001b[43mextract_features_librosa\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfile_path\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 54\u001b[39m audio_features_essentia[file_id] = features\n\u001b[32m 56\u001b[39m \u001b[38;5;28mprint\u001b[39m(audio_features_essentia)\n", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[1]\u001b[39m\u001b[32m, line 12\u001b[39m, in \u001b[36mextract_features_librosa\u001b[39m\u001b[34m(file_path)\u001b[39m\n\u001b[32m 10\u001b[39m mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=\u001b[32m13\u001b[39m)\n\u001b[32m 11\u001b[39m chroma = librosa.feature.chroma_stft(y=y, sr=sr)\n\u001b[32m---> \u001b[39m\u001b[32m12\u001b[39m spectral_centroid = \u001b[43mlibrosa\u001b[49m\u001b[43m.\u001b[49m\u001b[43mfeature\u001b[49m\u001b[43m.\u001b[49m\u001b[43mspectral_centroid\u001b[49m\u001b[43m(\u001b[49m\u001b[43my\u001b[49m\u001b[43m=\u001b[49m\u001b[43my\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msr\u001b[49m\u001b[43m=\u001b[49m\u001b[43msr\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 13\u001b[39m spectral_rolloff = librosa.feature.spectral_rolloff(y=y, sr=sr)\n\u001b[32m 14\u001b[39m zero_crossings = librosa.feature.zero_crossing_rate(y)\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/Projects/seb/predictify/.venv/lib/python3.11/site-packages/librosa/feature/spectral.py:186\u001b[39m, in \u001b[36mspectral_centroid\u001b[39m\u001b[34m(y, sr, S, n_fft, hop_length, freq, win_length, window, center, pad_mode)\u001b[39m\n\u001b[32m 183\u001b[39m freq = util.expand_to(freq, ndim=S.ndim, axes=-\u001b[32m2\u001b[39m)\n\u001b[32m 185\u001b[39m \u001b[38;5;66;03m# Column-normalize S\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m186\u001b[39m centroid: np.ndarray = \u001b[43mnp\u001b[49m\u001b[43m.\u001b[49m\u001b[43msum\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 187\u001b[39m \u001b[43m \u001b[49m\u001b[43mfreq\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m \u001b[49m\u001b[43mutil\u001b[49m\u001b[43m.\u001b[49m\u001b[43mnormalize\u001b[49m\u001b[43m(\u001b[49m\u001b[43mS\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnorm\u001b[49m\u001b[43m=\u001b[49m\u001b[32;43m1\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[43m=\u001b[49m\u001b[43m-\u001b[49m\u001b[32;43m2\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[43m=\u001b[49m\u001b[43m-\u001b[49m\u001b[32;43m2\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkeepdims\u001b[49m\u001b[43m=\u001b[49m\u001b[38;5;28;43;01mTrue\u001b[39;49;00m\n\u001b[32m 188\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 189\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m centroid\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/Projects/seb/predictify/.venv/lib/python3.11/site-packages/numpy/core/fromnumeric.py:2313\u001b[39m, in \u001b[36msum\u001b[39m\u001b[34m(a, axis, dtype, out, keepdims, initial, where)\u001b[39m\n\u001b[32m 2310\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m out\n\u001b[32m 2311\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m res\n\u001b[32m-> \u001b[39m\u001b[32m2313\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_wrapreduction\u001b[49m\u001b[43m(\u001b[49m\u001b[43ma\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mnp\u001b[49m\u001b[43m.\u001b[49m\u001b[43madd\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[33;43m'\u001b[39;49m\u001b[33;43msum\u001b[39;49m\u001b[33;43m'\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mout\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkeepdims\u001b[49m\u001b[43m=\u001b[49m\u001b[43mkeepdims\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 2314\u001b[39m \u001b[43m \u001b[49m\u001b[43minitial\u001b[49m\u001b[43m=\u001b[49m\u001b[43minitial\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mwhere\u001b[49m\u001b[43m=\u001b[49m\u001b[43mwhere\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[36mFile \u001b[39m\u001b[32m~/Projects/seb/predictify/.venv/lib/python3.11/site-packages/numpy/core/fromnumeric.py:88\u001b[39m, in \u001b[36m_wrapreduction\u001b[39m\u001b[34m(obj, ufunc, method, axis, dtype, out, **kwargs)\u001b[39m\n\u001b[32m 85\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 86\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m reduction(axis=axis, out=out, **passkwargs)\n\u001b[32m---> \u001b[39m\u001b[32m88\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mufunc\u001b[49m\u001b[43m.\u001b[49m\u001b[43mreduce\u001b[49m\u001b[43m(\u001b[49m\u001b[43mobj\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43maxis\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mout\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mpasskwargs\u001b[49m\u001b[43m)\u001b[49m\n", - "\u001b[31mKeyboardInterrupt\u001b[39m: " + "Processing file 1/1772...\n" ] } ], @@ -258,43 +18,100 @@ "import librosa\n", "import numpy as np\n", "\n", + "\n", + "def summarize_feature(feature_array):\n", + " \"\"\"\n", + " feature_array shape: [num_coeffs, num_frames]\n", + " Returns: 1D numpy array containing mean, std, and median of each row.\n", + " \"\"\"\n", + " # axis=1 means we compute statistics across 'frames'\n", + " means = np.mean(feature_array, axis=1)\n", + " stds = np.std(feature_array, axis=1)\n", + " medians = np.median(feature_array, axis=1)\n", + " \n", + " # Concatenate all stats into one 1D array\n", + " return np.concatenate([means, stds, medians], axis=0) #[means, stds, medians]\n", + "\n", "def extract_features_librosa(file_path):\n", + "\n", " # Load the audio file\n", " y, sr = librosa.load(file_path, sr=None)\n", " \n", " # Extract features\n", - " mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=13)\n", - " chroma = librosa.feature.chroma_stft(y=y, sr=sr)\n", - " spectral_centroid = librosa.feature.spectral_centroid(y=y, sr=sr)\n", - " spectral_rolloff = librosa.feature.spectral_rolloff(y=y, sr=sr)\n", - " zero_crossings = librosa.feature.zero_crossing_rate(y)\n", + " chroma_stft = librosa.feature.chroma_stft(y=y, sr=sr)\n", + " chroma_cqt = librosa.feature.chroma_cqt(y=y, sr=sr)\n", + " chroma_cens = librosa.feature.chroma_cens(y=y, sr=sr)\n", + " chroma_vqt = librosa.feature.chroma_vqt(y=y, sr=sr, intervals='equal')\n", + " melspectogram = librosa.feature.melspectrogram(y=y, sr=sr)\n", + " mfccs = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=12) # Numer of mfccs difference?\n", " rms = librosa.feature.rms(y=y)\n", + " spectral_centroid = librosa.feature.spectral_centroid(y=y, sr=sr)\n", + " spectral_bandwith = librosa.feature.spectral_bandwidth(y=y, sr=sr)\n", + " spectral_contrast = librosa.feature.spectral_contrast(y=y, sr=sr)\n", + " spectral_flatness = librosa.feature.spectral_flatness(y=y) \n", + " spectral_rolloff = librosa.feature.spectral_rolloff(y=y, sr=sr)\n", + " poly_features = librosa.feature.poly_features(y=y, sr=sr)\n", + " tonnetz = librosa.feature.tonnetz(y=y, sr=sr)\n", + " zero_crossings = librosa.feature.zero_crossing_rate(y)\n", " \n", " # Estimate tempo and beats\n", - " tempo, beat_frames = librosa.beat.beat_track(y=y, sr=sr)\n", - " \n", - " # A simple heuristic for \"danceability\"\n", - " # For example, we can assume higher tempo and consistent beats might be more danceable\n", - " # (This is only an example and not a scientifically rigorous metric.)\n", - " danceability = tempo / 200 # Normalize tempo (assume 200 BPM as an upper bound)\n", - " \n", + " tempo = librosa.feature.tempo(y=y, sr=sr)\n", + " tempogram = librosa.feature.tempogram(y=y, sr=sr)\n", + " fourier_tempogram = librosa.feature.fourier_tempogram(y=y, sr=sr)\n", + " tempogram_ratio = librosa.feature.tempogram_ratio(y=y, sr=sr)\n", + "\n", + " track_features = np.concatenate([\n", + " summarize_feature(mfccs),\n", + " summarize_feature(chroma_stft),\n", + " summarize_feature(chroma_cqt),\n", + " summarize_feature(chroma_cens),\n", + " summarize_feature(chroma_vqt),\n", + " summarize_feature(melspectogram),\n", + " summarize_feature(spectral_centroid),\n", + " summarize_feature(spectral_bandwith),\n", + " summarize_feature(spectral_contrast),\n", + " summarize_feature(spectral_flatness),\n", + " summarize_feature(spectral_rolloff),\n", + " summarize_feature(poly_features),\n", + " summarize_feature(tonnetz),\n", + " summarize_feature(zero_crossings),\n", + " summarize_feature(tempogram),\n", + " summarize_feature(fourier_tempogram),\n", + " summarize_feature(tempogram_ratio),\n", + " summarize_feature(rms),\n", + " tempo\n", + " ], axis=0)\n", + "\n", + " return track_features\n", + "\n", " # Aggregate features into a dictionary\n", + " \"\"\"\n", " features = {\n", - " 'mfcc_mean': np.mean(mfccs, axis=1).tolist(), # Mean of each MFCC coefficient\n", - " 'mfcc_std': np.std(mfccs, axis=1).tolist(),\n", - " 'chroma_mean': np.mean(chroma, axis=1).tolist(),\n", - " 'spectral_centroid_mean': np.mean(spectral_centroid).item(),\n", - " 'spectral_rolloff_mean': np.mean(spectral_rolloff).item(),\n", - " 'zero_crossing_rate_mean': np.mean(zero_crossings).item(),\n", - " 'rms_mean': np.mean(rms).item(),\n", + " 'chroma_stft': ,\n", + " 'chroma_cqt': summarize_feature(chroma_cqt),\n", + " 'chroma_cens': summarize_feature(chroma_cens),\n", + " 'chroma_vqt': summarize_feature(chroma_vqt),\n", + " 'melspectogram': summarize_feature(melspectogram),\n", + " 'mfccs': ,\n", + " 'rms': summarize_feature(rms),\n", + " 'spectral_centroid': summarize_feature(spectral_centroid),\n", + " 'spectral_bandwith': summarize_feature(spectral_bandwith),\n", + " 'spectral_contrast': summarize_feature(spectral_contrast),\n", + " 'spectral_flatness': summarize_feature(spectral_flatness),\n", + " 'spectral_rolloff': summarize_feature(spectral_rolloff),\n", + " 'poly_features': summarize_feature(poly_features),\n", + " 'tonnetz': summarize_feature(tonnetz),\n", + " 'zero_crossings': summarize_feature(zero_crossings),\n", " 'tempo': tempo,\n", - " 'danceability': danceability,\n", - " 'beat_count': len(beat_frames)\n", + " 'tempogram': summarize_feature(tempogram),\n", + " 'fourier_tempogram': summarize_feature(fourier_tempogram),\n", + " 'tempogram_ratio': summarize_feature(tempogram_ratio)\n", " }\n", " return features\n", + " \"\"\"\n", "\n", "folder_path = './audio_previews'\n", - "audio_features_essentia = {}\n", + "X = []\n", "\n", "folder_len = os.listdir(folder_path)\n", "folder_len_num = len(folder_len)\n", @@ -307,9 +124,47 @@ " file_path = os.path.join(folder_path, file)\n", " file_id = os.path.splitext(file)[0]\n", " features = extract_features_librosa(file_path)\n", - " audio_features_essentia[file_id] = features\n", + " X.append(features)\n", + " if counter == 1:\n", + " break\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "ename": "ValueError", + "evalue": "Complex data not supported\n[array([-2.43607666e+02+0.j, 2.02283173e+02+0.j, -9.33068466e+00+0.j, ...,\n 3.39018144e-02+0.j, 1.07776299e-01+0.j, 1.20185320e+02+0.j])]\n", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mComplexWarning\u001b[39m Traceback (most recent call last)", + "\u001b[36mFile \u001b[39m\u001b[32m~/Services/predictify/.venv/lib/python3.11/site-packages/sklearn/utils/validation.py:1055\u001b[39m, in \u001b[36mcheck_array\u001b[39m\u001b[34m(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_writeable, force_all_finite, ensure_all_finite, ensure_non_negative, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, estimator, input_name)\u001b[39m\n\u001b[32m 1054\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m-> \u001b[39m\u001b[32m1055\u001b[39m array = \u001b[43m_asarray_with_order\u001b[49m\u001b[43m(\u001b[49m\u001b[43marray\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43morder\u001b[49m\u001b[43m=\u001b[49m\u001b[43morder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[43m=\u001b[49m\u001b[43mdtype\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mxp\u001b[49m\u001b[43m=\u001b[49m\u001b[43mxp\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 1056\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m ComplexWarning \u001b[38;5;28;01mas\u001b[39;00m complex_warning:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Services/predictify/.venv/lib/python3.11/site-packages/sklearn/utils/_array_api.py:839\u001b[39m, in \u001b[36m_asarray_with_order\u001b[39m\u001b[34m(array, dtype, order, copy, xp, device)\u001b[39m\n\u001b[32m 838\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m--> \u001b[39m\u001b[32m839\u001b[39m array = \u001b[43mnumpy\u001b[49m\u001b[43m.\u001b[49m\u001b[43masarray\u001b[49m\u001b[43m(\u001b[49m\u001b[43marray\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43morder\u001b[49m\u001b[43m=\u001b[49m\u001b[43morder\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[43m=\u001b[49m\u001b[43mdtype\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 841\u001b[39m \u001b[38;5;66;03m# At this point array is a NumPy ndarray. We convert it to an array\u001b[39;00m\n\u001b[32m 842\u001b[39m \u001b[38;5;66;03m# container that is consistent with the input's namespace.\u001b[39;00m\n", + "\u001b[31mComplexWarning\u001b[39m: Casting complex values to real discards the imaginary part", + "\nThe above exception was the direct cause of the following exception:\n", + "\u001b[31mValueError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[14]\u001b[39m\u001b[32m, line 5\u001b[39m\n\u001b[32m 1\u001b[39m \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01msklearn\u001b[39;00m\u001b[34;01m.\u001b[39;00m\u001b[34;01mpreprocessing\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[38;5;28;01mimport\u001b[39;00m StandardScaler\n\u001b[32m 3\u001b[39m scaler = StandardScaler()\n\u001b[32m----> \u001b[39m\u001b[32m5\u001b[39m X_scaled = \u001b[43mscaler\u001b[49m\u001b[43m.\u001b[49m\u001b[43mfit_transform\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Services/predictify/.venv/lib/python3.11/site-packages/sklearn/utils/_set_output.py:319\u001b[39m, in \u001b[36m_wrap_method_output..wrapped\u001b[39m\u001b[34m(self, X, *args, **kwargs)\u001b[39m\n\u001b[32m 317\u001b[39m \u001b[38;5;129m@wraps\u001b[39m(f)\n\u001b[32m 318\u001b[39m \u001b[38;5;28;01mdef\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34mwrapped\u001b[39m(\u001b[38;5;28mself\u001b[39m, X, *args, **kwargs):\n\u001b[32m--> \u001b[39m\u001b[32m319\u001b[39m data_to_wrap = \u001b[43mf\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 320\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(data_to_wrap, \u001b[38;5;28mtuple\u001b[39m):\n\u001b[32m 321\u001b[39m \u001b[38;5;66;03m# only wrap the first output for cross decomposition\u001b[39;00m\n\u001b[32m 322\u001b[39m return_tuple = (\n\u001b[32m 323\u001b[39m _wrap_data_with_container(method, data_to_wrap[\u001b[32m0\u001b[39m], X, \u001b[38;5;28mself\u001b[39m),\n\u001b[32m 324\u001b[39m *data_to_wrap[\u001b[32m1\u001b[39m:],\n\u001b[32m 325\u001b[39m )\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Services/predictify/.venv/lib/python3.11/site-packages/sklearn/base.py:918\u001b[39m, in \u001b[36mTransformerMixin.fit_transform\u001b[39m\u001b[34m(self, X, y, **fit_params)\u001b[39m\n\u001b[32m 903\u001b[39m warnings.warn(\n\u001b[32m 904\u001b[39m (\n\u001b[32m 905\u001b[39m \u001b[33mf\u001b[39m\u001b[33m\"\u001b[39m\u001b[33mThis object (\u001b[39m\u001b[38;5;132;01m{\u001b[39;00m\u001b[38;5;28mself\u001b[39m.\u001b[34m__class__\u001b[39m.\u001b[34m__name__\u001b[39m\u001b[38;5;132;01m}\u001b[39;00m\u001b[33m) has a `transform`\u001b[39m\u001b[33m\"\u001b[39m\n\u001b[32m (...)\u001b[39m\u001b[32m 913\u001b[39m \u001b[38;5;167;01mUserWarning\u001b[39;00m,\n\u001b[32m 914\u001b[39m )\n\u001b[32m 916\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m y \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n\u001b[32m 917\u001b[39m \u001b[38;5;66;03m# fit method of arity 1 (unsupervised transformation)\u001b[39;00m\n\u001b[32m--> \u001b[39m\u001b[32m918\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mfit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mfit_params\u001b[49m\u001b[43m)\u001b[49m.transform(X)\n\u001b[32m 919\u001b[39m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[32m 920\u001b[39m \u001b[38;5;66;03m# fit method of arity 2 (supervised transformation)\u001b[39;00m\n\u001b[32m 921\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28mself\u001b[39m.fit(X, y, **fit_params).transform(X)\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Services/predictify/.venv/lib/python3.11/site-packages/sklearn/preprocessing/_data.py:894\u001b[39m, in \u001b[36mStandardScaler.fit\u001b[39m\u001b[34m(self, X, y, sample_weight)\u001b[39m\n\u001b[32m 892\u001b[39m \u001b[38;5;66;03m# Reset internal state before fitting\u001b[39;00m\n\u001b[32m 893\u001b[39m \u001b[38;5;28mself\u001b[39m._reset()\n\u001b[32m--> \u001b[39m\u001b[32m894\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[38;5;28;43mself\u001b[39;49m\u001b[43m.\u001b[49m\u001b[43mpartial_fit\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43my\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43msample_weight\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Services/predictify/.venv/lib/python3.11/site-packages/sklearn/base.py:1389\u001b[39m, in \u001b[36m_fit_context..decorator..wrapper\u001b[39m\u001b[34m(estimator, *args, **kwargs)\u001b[39m\n\u001b[32m 1382\u001b[39m estimator._validate_params()\n\u001b[32m 1384\u001b[39m \u001b[38;5;28;01mwith\u001b[39;00m config_context(\n\u001b[32m 1385\u001b[39m skip_parameter_validation=(\n\u001b[32m 1386\u001b[39m prefer_skip_nested_validation \u001b[38;5;129;01mor\u001b[39;00m global_skip_validation\n\u001b[32m 1387\u001b[39m )\n\u001b[32m 1388\u001b[39m ):\n\u001b[32m-> \u001b[39m\u001b[32m1389\u001b[39m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfit_method\u001b[49m\u001b[43m(\u001b[49m\u001b[43mestimator\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Services/predictify/.venv/lib/python3.11/site-packages/sklearn/preprocessing/_data.py:930\u001b[39m, in \u001b[36mStandardScaler.partial_fit\u001b[39m\u001b[34m(self, X, y, sample_weight)\u001b[39m\n\u001b[32m 898\u001b[39m \u001b[38;5;250m\u001b[39m\u001b[33;03m\"\"\"Online computation of mean and std on X for later scaling.\u001b[39;00m\n\u001b[32m 899\u001b[39m \n\u001b[32m 900\u001b[39m \u001b[33;03mAll of X is processed as a single batch. This is intended for cases\u001b[39;00m\n\u001b[32m (...)\u001b[39m\u001b[32m 927\u001b[39m \u001b[33;03m Fitted scaler.\u001b[39;00m\n\u001b[32m 928\u001b[39m \u001b[33;03m\"\"\"\u001b[39;00m\n\u001b[32m 929\u001b[39m first_call = \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28mhasattr\u001b[39m(\u001b[38;5;28mself\u001b[39m, \u001b[33m\"\u001b[39m\u001b[33mn_samples_seen_\u001b[39m\u001b[33m\"\u001b[39m)\n\u001b[32m--> \u001b[39m\u001b[32m930\u001b[39m X = \u001b[43mvalidate_data\u001b[49m\u001b[43m(\u001b[49m\n\u001b[32m 931\u001b[39m \u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 932\u001b[39m \u001b[43m \u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 933\u001b[39m \u001b[43m \u001b[49m\u001b[43maccept_sparse\u001b[49m\u001b[43m=\u001b[49m\u001b[43m(\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mcsr\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mcsc\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 934\u001b[39m \u001b[43m \u001b[49m\u001b[43mdtype\u001b[49m\u001b[43m=\u001b[49m\u001b[43mFLOAT_DTYPES\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 935\u001b[39m \u001b[43m \u001b[49m\u001b[43mensure_all_finite\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mallow-nan\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[32m 936\u001b[39m \u001b[43m \u001b[49m\u001b[43mreset\u001b[49m\u001b[43m=\u001b[49m\u001b[43mfirst_call\u001b[49m\u001b[43m,\u001b[49m\n\u001b[32m 937\u001b[39m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 938\u001b[39m n_features = X.shape[\u001b[32m1\u001b[39m]\n\u001b[32m 940\u001b[39m \u001b[38;5;28;01mif\u001b[39;00m sample_weight \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Services/predictify/.venv/lib/python3.11/site-packages/sklearn/utils/validation.py:2944\u001b[39m, in \u001b[36mvalidate_data\u001b[39m\u001b[34m(_estimator, X, y, reset, validate_separately, skip_check_array, **check_params)\u001b[39m\n\u001b[32m 2942\u001b[39m out = X, y\n\u001b[32m 2943\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m no_val_X \u001b[38;5;129;01mand\u001b[39;00m no_val_y:\n\u001b[32m-> \u001b[39m\u001b[32m2944\u001b[39m out = \u001b[43mcheck_array\u001b[49m\u001b[43m(\u001b[49m\u001b[43mX\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43minput_name\u001b[49m\u001b[43m=\u001b[49m\u001b[33;43m\"\u001b[39;49m\u001b[33;43mX\u001b[39;49m\u001b[33;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43m*\u001b[49m\u001b[43m*\u001b[49m\u001b[43mcheck_params\u001b[49m\u001b[43m)\u001b[49m\n\u001b[32m 2945\u001b[39m \u001b[38;5;28;01melif\u001b[39;00m no_val_X \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m no_val_y:\n\u001b[32m 2946\u001b[39m out = _check_y(y, **check_params)\n", + "\u001b[36mFile \u001b[39m\u001b[32m~/Services/predictify/.venv/lib/python3.11/site-packages/sklearn/utils/validation.py:1057\u001b[39m, in \u001b[36mcheck_array\u001b[39m\u001b[34m(array, accept_sparse, accept_large_sparse, dtype, order, copy, force_writeable, force_all_finite, ensure_all_finite, ensure_non_negative, ensure_2d, allow_nd, ensure_min_samples, ensure_min_features, estimator, input_name)\u001b[39m\n\u001b[32m 1055\u001b[39m array = _asarray_with_order(array, order=order, dtype=dtype, xp=xp)\n\u001b[32m 1056\u001b[39m \u001b[38;5;28;01mexcept\u001b[39;00m ComplexWarning \u001b[38;5;28;01mas\u001b[39;00m complex_warning:\n\u001b[32m-> \u001b[39m\u001b[32m1057\u001b[39m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(\n\u001b[32m 1058\u001b[39m \u001b[33m\"\u001b[39m\u001b[33mComplex data not supported\u001b[39m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[38;5;132;01m{}\u001b[39;00m\u001b[38;5;130;01m\\n\u001b[39;00m\u001b[33m\"\u001b[39m.format(array)\n\u001b[32m 1059\u001b[39m ) \u001b[38;5;28;01mfrom\u001b[39;00m\u001b[38;5;250m \u001b[39m\u001b[34;01mcomplex_warning\u001b[39;00m\n\u001b[32m 1061\u001b[39m \u001b[38;5;66;03m# It is possible that the np.array(..) gave no warning. This happens\u001b[39;00m\n\u001b[32m 1062\u001b[39m \u001b[38;5;66;03m# when no dtype conversion happened, for example dtype = None. The\u001b[39;00m\n\u001b[32m 1063\u001b[39m \u001b[38;5;66;03m# result is that np.array(..) produces an array of complex dtype\u001b[39;00m\n\u001b[32m 1064\u001b[39m \u001b[38;5;66;03m# and we need to catch and raise exception for such cases.\u001b[39;00m\n\u001b[32m 1065\u001b[39m _ensure_no_complex_data(array)\n", + "\u001b[31mValueError\u001b[39m: Complex data not supported\n[array([-2.43607666e+02+0.j, 2.02283173e+02+0.j, -9.33068466e+00+0.j, ...,\n 3.39018144e-02+0.j, 1.07776299e-01+0.j, 1.20185320e+02+0.j])]\n" + ] + } + ], + "source": [ + "from sklearn.preprocessing import StandardScaler\n", "\n", - "print(audio_features_essentia)" + "scaler = StandardScaler()\n", + "\n", + "X_scaled = scaler.fit_transform(X)\n" ] } ], @@ -329,7 +184,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.11.7" + "version": "3.11.2" } }, "nbformat": 4,