{ "cells": [ { "cell_type": "markdown", "id": "43a219ed", "metadata": {}, "source": [ "# `mcsm-benchs`: Benchmarking methods for component retrieval" ] }, { "cell_type": "markdown", "id": "291d278b", "metadata": {}, "source": [] }, { "cell_type": "code", "execution_count": 1, "id": "04325818", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from numpy import pi as pi\n", "import scipy.signal as sg\n", "import pandas as pd\n", "from matplotlib import pyplot as plt\n", "from mcsm_benchs.Benchmark import Benchmark\n", "from mcsm_benchs.ResultsInterpreter import ResultsInterpreter\n", "from mcsm_benchs.SignalBank import SignalBank\n", "from utils import get_stft, invert_stft" ] }, { "cell_type": "markdown", "id": "dd2599c8", "metadata": {}, "source": [ "## Creating a dictionary of signals\n", "\n", "We can use the `SignalBank` class to generate a dictionary of signals to study. We are going to use a signal with two components: 1) a linear chirp, 2) a cosenoidal chirp. Below we can see how to generate the signal as well as its spectrogram.\n", "\n", "We use the option `return_signal=True`, so that the signals generated by the `SignalBank` are objects of the `Signal` class, which behave like a regular `numpy` array, but include additional information of the generated signals, such as the instantaneous frequency of each signal component." ] }, { "cell_type": "code", "execution_count": 2, "id": "5237de4f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, 'frequency')" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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QCCwCULgDAQCgUBgE4TAGQgEAoHAJtjRwPmFL3yB173udRw6dAghBJ/61KdG7hdCrHv7wAc+0DzmqU996pr73//+9488zwMPPMDLXvYyOp0Ol112GXfdddeFeHmBQCAQuAjZ0cC5urrKC17wAv7jf/yP695/+PDhkdtHP/pRhBDccMMNI4/7xV/8xZHH/dRP/VRz39LSEldffTVPecpT+PKXv8wHPvAB3vve9/Kbv/mb2/raAoFAIHBxEu3kL7/22mu59tprN7z/4MGDI1///u//Pq985Sv57u/+7pHvz8zMrHms5xOf+ARFUfDRj36UJEl4znOew/33388HP/hB3va2t53/iwgEAoHAE4pd0+M8evQof/iHf8hNN9205r73v//97N27l+/93u/lAx/4AFVVNffdd999vPzlLydJkuZ711xzDQ899BAnT55c93flec7S0tLILRAIBAIB2OGMczN8/OMfZ2Zmhuuvv37k+z/90z/Ni170IhYWFvjiF7/I7bffzuHDh/ngBz8IwJEjR7j88stHfubAgQPNfXv27Fnzu+68807uuOOObXolgUAgENjN7JrA+dGPfpQ3velNdDqdke/feuutzX8///nPJ0kSfvInf5I777yTNE3P6XfdfvvtI8+7tLTEZZdddm4HHggEAoGLil0ROP/sz/6Mhx56iN/+7d8+42Nf/OIXU1UV3/rWt7jiiis4ePAgR48eHXmM/3qjvmiapuccdHcMITa+z5gLdxyBQCBwkbMrepwf+chHuPLKK3nBC15wxsfef//9SCnZv38/AFdddRVf+MIXKMuyecy9997LFVdcsW6ZdtchhLvJ9W/txwQCgUDgvNnRwLmyssL999/P/fffD8A3v/lN7r//fh5++OHmMUtLS/zu7/4uP/ETP7Hm5++77z5+5Vd+hb/927/lG9/4Bp/4xCe45ZZb+JEf+ZEmKL7xjW8kSRJuuukmvvKVr/Dbv/3bfOhDHxopxe5afDAUEiGFvSk1vEmxNoAGAoFA4LzY0VLtl770JV75ylc2X/tgduONN3L33XcDcM8992CM4Q1veMOan0/TlHvuuYf3vve95HnO5Zdfzi233DISFOfm5vjMZz7DzTffzJVXXsm+fft4z3ves/tHUVyW2QRHac0f2hgjEMKA0RgtwWj7c6F0GwgEAueMMCZ8ip6JpaUl5ubmeAU/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2mn/Xbt24fnnn++0/SQO9dsxEhFR/2tsbER6evodvcaICM5E7dixA5s3b7a+r6urw/jx41FVVXXHJ5y619DQgLFjx+Krr75CWlraQB/OsMXznBw8z8nRm/MsImhsbERBQcEd/7wREZzZ2dlwOp24du2abfu1a9eQl5fXaX+v1wuv19tpe3p6On/5kyQtLY3nOgl4npOD5zk5ejrPfTXwGRGLgzweDx544AEcPXrU2qbrOo4ePYr58+cP4JEREdFQMyJGnACwefNmrF27Fg8++CDmzZuHV155Bc3NzVi/fv1AHxoREQ0hIyY4V61ahevXr+PZZ59FdXU15syZg8OHD3daMBSP1+vFzp07416+pb7Fc50cPM/JwfOcHMk+z4r0xdpcIiKiEWJEzHESERH1FQYnERFRAhicRERECWBwEhERJYDB2QtsR3ZnnnvuOSiKYnvcc8891vOhUAglJSXIyspCSkoKHn300U7FKqqqqrB8+XIEAgHk5ORg27ZtUFU12W9lUHnvvffwrW99CwUFBVAUBW+//bbteRHBs88+i/z8fPj9fhQVFeGzzz6z7VNbW4vVq1cjLS0NGRkZ+MEPfoCmpibbPufOncPChQvh8/kwduxYvPTSS/391gaVns7zunXrOv1+L1261LYPz3PPdu3ahblz5yI1NRU5OTlYsWIFKisrbfv01WdFWVkZ7r//fni9Xtx9993Yu3dvYgcr1K19+/aJx+ORN954Qy5cuCAbNmyQjIwMuXbt2kAf2pCxc+dOuffee+Xq1avW4/r169bzTz31lIwdO1aOHj0qH330kXzta1+Tr3/969bzqqrKjBkzpKioSM6cOSOHDh2S7Oxs2bFjx0C8nUHj0KFD8rOf/Uz2798vAOTAgQO253fv3i3p6eny9ttvy8cffyzf/va3ZeLEidLa2mrts3TpUpk9e7a8//778o9//EPuvvtuefzxx63n6+vrJTc3V1avXi0VFRXy1ltvid/vl9/+9rfJepsDrqfzvHbtWlm6dKnt97u2tta2D89zz4qLi6W0tFQqKirk7Nmz8vDDD8u4ceOkqanJ2qcvPis+//xzCQQCsnnzZrl48aK89tpr4nQ65fDhw70+VgZnD+bNmyclJSXW95qmSUFBgezatWsAj2po2blzp8yePTvuc3V1deJ2u+Uvf/mLte2TTz4RAFJeXi4ixgeX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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Create a dictionary of signals:\n", "N = 2048\n", "sb = SignalBank(N=N, return_signal=True)\n", "\n", "signal_1 = sb.signal_mc_damped_cos()\n", "\n", "# Create a dictionary of signals for later.\n", "signals = {'linear_chirp':signal_1,}\n", "\n", "# Display the spectrograms of the signals.\n", "stft1 = get_stft(signal_1)\n", "\n", "fig, axs = plt.subplots(1,1, sharey=True)\n", "axs.imshow(np.abs(stft1)**2, origin='lower')\n", "axs.set_xlabel('time'); axs.set_ylabel('frequency')" ] }, { "cell_type": "markdown", "id": "7270230c", "metadata": {}, "source": [ "## Creating a dictionary of methods\n", "\n", "We define a simple method that tracks two ridges in the spectrogram as a chain of maxima for each column. After detecting a ridge, the method sets to $0$ a number $L$ of pixes above and below the ridge, allowing to search for another ridge using the residual STFT. This is known as a *peeling scheme*. Finding a particular value of $L$ for a signal depends on the SNR of the component. $2L$ is also the width of the strip of the STFT used to recover the individual components.\n", "\n", "We will study the results for this only method but using different values of the parameter $L$, and evaluate the reconstruction of each component.\n", "\n", "The method should return a `list` of components, in any order. The benchmarking procedure takes care of matching the output of the method with the most similar component from the signal in order to compute the quality reconstruction factor (QRF) for each component." ] }, { "cell_type": "code", "execution_count": 3, "id": "3a58d32e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'Estimated Comp.')" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAj4AAADUCAYAAACccilhAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjkuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8ekN5oAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB9RUlEQVR4nO39e5zdVX3vjz/X57rve899kpAr4Q5CGwtG5aKmBFS0FrUgRUSqgtBTDlYtp1ZBbam0R60W0dNW7PkdLVW/aq0iiohSNVhBkJsglwRCkplJMrPve3+u6/fH2nvPnmQSZiaT66zn4zGPZPb+zP5c9vq8P+/1Xq/3+y2klBKNRqPRaDSaBYBxsA9Ao9FoNBqN5kChHR+NRqPRaDQLBu34aDQajUajWTBox0ej0Wg0Gs2CQTs+Go1Go9FoFgza8dFoNBqNRrNg0I6PRqPRaDSaBYN2fDQajUaj0SwYtOOj0Wg0Go1mwaAdnwPADTfcgBBiTn/7pS99CSEEmzZtmt+D6mLTpk0IIfjSl760z5+1L+e6PzjnnHM455xzDvZhHPIciddpPse15tBGj1/NbNCOz1547LHH+OM//mOWLFmC67osXryYSy65hMcee+xgH5pmgdB2fPf0c9999834sx5//HFuuOGG/epEz4XPfe5zh4RxHx0d5c///M85/vjjSaVSpNNp1qxZw8c//nGKxeLBPrzDEj1+Dxx6/M4c62AfwKHKN77xDS6++GJ6e3u54oorWLlyJZs2beJf/uVf+PrXv87tt9/Om970phl91oc+9CH+4i/+Yk7Hcemll3LRRRfhuu6c/v5Asy/nqtkzH/3oR1m5cuVur69evXrGn/H4449z4403cs4557BixYop7/3gBz/Y10OcM5/73Ofo7+/nHe94x0E7hl/+8pe89rWvpVqt8sd//MesWbMGgPvvv5+//du/5d577z2o1+hwR4/f/Ysev7NDOz7T8Mwzz3DppZeyatUq7r33XgYGBjrv/dmf/Rlnnnkml156KQ8//DCrVq3a4+fUajXS6TSWZWFZc7vUpmlimuac/vZgsC/nqtkz559/Pi996Uv32+c7jrPfPvtQp1gs8qY3vQnTNHnwwQc5/vjjp7z/13/91/zTP/3TQTq6IwM9fvcfevzOHr3UNQ1/93d/R71e5//8n/8zxekB6O/v5wtf+AK1Wo2bb76583pb2/L444/ztre9jZ6eHl75yldOea+bRqPB//gf/4P+/n6y2SxveMMb2LJlC0IIbrjhhs5202l8VqxYwetf/3p++tOfcvrpp5NIJFi1ahX/9//+3yn7GB8f58///M855ZRTyGQy5HI5zj//fH7961/P6boEQcCNN97IMcccQyKRoK+vj1e+8pXcddddu12HuZxr+2+ffvpp3vGOd1AoFMjn81x++eXU6/Upn3nbbbfx6le/msHBQVzX5cQTT+TWW2+d03kdKdx+++2sWbOGbDZLLpfjlFNO4R/+4R8ANY7e8pa3APCqV72qs9Tw4x//GNhdI/HjH/8YIQRf/epXufHGG1myZAnZbJY3v/nNlEolPM/j2muvZXBwkEwmw+WXX47neVOOZybf0YoVK3jsscf4yU9+0jmm7uMoFotce+21LF26FNd1Wb16NZ/4xCeI43jK5xSLRd7xjneQz+cpFApcdtllMw7vf+ELX2DLli188pOf3O2hATA0NMSHPvShKa997nOf46STTuosgV999dW77e+cc87h5JNP5uGHH+bss88mlUqxevVqvv71rwPwk5/8hDPOOINkMslxxx3HD3/4wyl/374fnnjiCd761reSy+Xo6+vjz/7sz2g2mzM6t8MJPX71+D1Q6Kn5NPznf/4nK1as4Mwzz5z2/bPOOosVK1bw3e9+d7f33vKWt3DMMcfwN3/zN0gp97iPd7zjHXz1q1/l0ksv5WUvexk/+clPeN3rXjfjY3z66ad585vfzBVXXMFll13GF7/4Rd7xjnewZs0aTjrpJACeffZZvvWtb/GWt7yFlStXMjo6yhe+8AXOPvtsHn/8cRYvXjzj/YEayDfddBN/8id/wumnn065XOb+++/nV7/6Fb//+78/b+f61re+lZUrV3LTTTfxq1/9in/+539mcHCQT3ziE51tbr31Vk466STe8IY3YFkW//mf/8l73/te4jjm6quvntV5HQ6USiV27Ngx5TUhBH19fQDcddddXHzxxbzmNa/pXKff/OY3/OxnP+PP/uzPOOuss/gf/+N/8JnPfIb/9b/+FyeccAJA5989cdNNN5FMJvmLv/gLnn76aT772c9i2zaGYTAxMcENN9zAfffdx5e+9CVWrlzJhz/84c7fzuQ7+vSnP82f/umfkslk+Mu//EtAGWqAer3O2WefzZYtW3jPe97DsmXL+PnPf87111/Ptm3b+PSnPw2AlJI3vvGN/PSnP+XKK6/khBNO4Jvf/CaXXXbZjK7tt7/9bZLJJG9+85tntP0NN9zAjTfeyLp167jqqqt48sknufXWW/nlL3/Jz372M2zb7mw7MTHB61//ei666CLe8pa3cOutt3LRRRfx5S9/mWuvvZYrr7ySt73tbfzd3/0db37zm9m8eTPZbHbK/t761reyYsUKbrrpJu677z4+85nPMDExsdtE51BGj189fg+p8Ss1UygWixKQb3zjG/e63Rve8AYJyHK5LKWU8iMf+YgE5MUXX7zbtu332jzwwAMSkNdee+2U7d7xjndIQH7kIx/pvHbbbbdJQG7cuLHz2vLlyyUg77333s5rY2Nj0nVd+b73va/zWrPZlFEUTdnHxo0bpeu68qMf/eiU1wB522237fWcTz31VPm6171ur9vsy7m2//ad73znlG3f9KY3yb6+vimv1ev13fa9fv16uWrVqimvnX322fLss8/e6zEfyrS//+l+XNftbPdnf/ZnMpfLyTAM9/hZX/va1yQg77nnnt3e2/U63XPPPRKQJ598svR9v/P6xRdfLIUQ8vzzz5/y92vXrpXLly+f8tpMv6OTTjpp2u/oYx/7mEyn0/K3v/3tlNf/4i/+QpqmKZ9//nkppZTf+ta3JCBvvvnmzjZhGMozzzxzRuO6p6dHnnrqqXvdps3Y2Jh0HEeee+65U+6tf/zHf5SA/OIXv9h57eyzz5aA/MpXvtJ57YknnpCANAxD3nfffZ3Xv//97+92rO374Q1veMOUY3jve98rAfnrX/96Rsd8MNHjV4/fQ3H86qWuXahUKgC7ea270n6/XC5Pef3KK6980X3ceeedALz3ve+d8vqf/umfzvg4TzzxxCkRqYGBAY477jieffbZzmuu62IY6iuOooidO3eSyWQ47rjj+NWvfjXjfbUpFAo89thjPPXUUzP+m7mc667X8Mwzz2Tnzp1TrnUymez8vz2bPPvss3n22WcplUozPr7DhVtuuYW77rprys/3vve9zvuFQoFarTZl2XE+ePvb3z5lBnjGGWcgpeSd73znlO3OOOMMNm/eTBiGndf29Tv62te+xplnnklPTw87duzo/Kxbt44oirj33nsBuOOOO7Asi6uuuqrzt6Zpzvh+KpfLL3q/t/nhD3+I7/tce+21nXsL4F3vehe5XG63KHAmk+Giiy7q/H7cccdRKBQ44YQTOOOMMzqvt//fff+22TWC2T6vO+64Y0bHfCigx68ev20OhfGrl7p2oT2A2g7QntiTgzRd5sKuPPfccxiGsdu2s8lwWLZs2W6v9fT0MDEx0fk9jmP+4R/+gc997nNs3LiRKIo677VDzLPhox/9KG984xs59thjOfnkkznvvPO49NJLeclLXrLHv5nLue56bj09PYAKu+ZyOQB+9rOf8ZGPfIQNGzbspv8plUrk8/lZnduhzumnn75Xceh73/tevvrVr3L++eezZMkSzj33XN761rdy3nnn7dN+d/0u2td16dKlu70exzGlUqkztvb1O3rqqad4+OGHd9PZtRkbGwPUGFu0aBGZTGbK+8cdd9yLnJ0il8u96P3e5rnnnpv2sx3HYdWqVZ332xx11FG7ad7y+fy01w+Ycv+2OeaYY6b8fvTRR2MYxiGX1r039PjdHT1+N83omPcH2vHZhXw+z6JFi3j44Yf3ut3DDz/MkiVLOg/iNt2zhP3JnjK9ZJeu6G/+5m/4q7/6K975znfysY99jN7eXgzD4Nprr91NXDcTzjrrLJ555hn+4z/+gx/84Af88z//M5/61Kf4/Oc/z5/8yZ/M+Vx25cXO7ZlnnuE1r3kNxx9/PJ/85CdZunQpjuNwxx138KlPfWpO53a4Mzg4yEMPPcT3v/99vve97/G9732P2267jbe//e3867/+65w/d0/fxYH4juI45vd///f5wAc+MO37xx577AzPYu8cf/zxPPTQQ/i+P+/ZQXO9fnvjUCoQOl/o8Tt39PidPdrxmYbXv/71/NM//RM//elPO5lZ3fzXf/0XmzZt4j3vec+cPn/58uXEcczGjRuneMNPP/30nI95Or7+9a/zqle9in/5l3+Z8nqxWKS/v39On9nb28vll1/O5ZdfTrVa5ayzzuKGG27Yo+OzP871P//zP/E8j29/+9tTZnT33HPPnD/zSMBxHC644AIuuOAC4jjmve99L1/4whf4q7/6K1avXn1ADc5svqM9HdfRRx9NtVpl3bp1e93X8uXLufvuu6lWq1NmzU8++eSMjvWCCy5gw4YN/H//3//HxRdf/KL7an92dykL3/fZuHHjix7rXHjqqaemREyffvpp4jjerZbN4Y4ev3r8Hii0xmca3v/+95NMJnnPe97D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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def get_ridge(stft, L=100):\n", " \"\"\" \n", " Get a ridge from the stft of a signal\n", " \"\"\"\n", " spectrogram = np.abs(stft)**2\n", " stft2 = stft.copy() \n", " mask = np.zeros_like(spectrogram)\n", " ridge = np.zeros((spectrogram.shape[1]))\n", " for i in range(spectrogram.shape[1]):\n", " ridge[i] = np.argmax(spectrogram[:,i])\n", " stft2[int(np.max([0,ridge[i]-L])):int(np.min([ridge[i]+L,stft.shape[0]])),i] = 0 # Erase current ridge from spectrogram.\n", " mask[int(np.max([0,ridge[i]-L])):int(np.min([ridge[i]+L,stft.shape[0]])),i] = 1 \n", " return ridge, stft2, mask\n", "\n", "def method_1(signal, L=100):\n", " # 1. Compute STFT\n", " stft = get_stft(signal)\n", " # 2. Get two ridges from spectrogram\n", " resid_stft = stft\n", " components = []\n", " for i in range(2):\n", " ridge, resid_stft, mask = get_ridge(resid_stft, L=L)\n", " component = invert_stft(stft,mask=mask)\n", " components.append(component)\n", " return components # List of estimated components, even if its only one.\n", "\n", "# Check results using one of the signals defined before.\n", "components = method_1(signal_1, L=100) # Output of the method for L=100\n", "fig, axs = plt.subplots(1,3, sharey=True)\n", "axs[0].imshow(np.abs(get_stft(signal_1)), origin='lower')\n", "axs[0].set_title('Original signal')\n", "axs[1].imshow(np.abs(get_stft(components[0])), origin='lower')\n", "axs[1].set_title('Estimated Comp.')\n", "axs[2].imshow(np.abs(get_stft(components[1])), origin='lower')\n", "axs[2].set_title('Estimated Comp.')" ] }, { "cell_type": "markdown", "id": "b9b014c0", "metadata": {}, "source": [ "Finally, we create a dictionary of methods to compare (with only one method here), and a dictionary of parameters to use with each method." ] }, { "cell_type": "code", "execution_count": 4, "id": "c1341a56", "metadata": {}, "outputs": [], "source": [ "methods = {'method_1':method_1,}\n", "parameters = {'method_1':[\n", " {'L':25},\n", " {'L':50},\n", " {'L':100},\n", " ]\n", " }" ] }, { "cell_type": "markdown", "id": "ccd49e72", "metadata": {}, "source": [ "## Instantiating a benchmark object\n", "\n", "We instantiate a benchmark object and run the tests." ] }, { "cell_type": "code", "execution_count": 5, "id": "ceb270d5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Running benchmark...\n", "- Signal linear_chirp\n", "-- SNR: 0 dB\n", "--- Method: method_1\n", "---- Parameters Combination: 0\n", "------ Inner loop. method_1: 0\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "------ Inner loop. method_1: 1\n", "------ Inner loop. method_1: 2\n", "------ Inner loop. method_1: 3\n", "------ Inner loop. method_1: 4\n", "Elapsed:1.598179817199707\n", "---- Parameters Combination: 1\n", "------ Inner loop. method_1: 0\n", "------ Inner loop. method_1: 1\n", "------ Inner loop. method_1: 2\n", "------ Inner loop. method_1: 3\n", "------ Inner loop. method_1: 4\n", "Elapsed:1.5431218147277832\n", "---- Parameters Combination: 2\n", "------ Inner loop. method_1: 0\n", "------ Inner loop. method_1: 1\n", "------ Inner loop. method_1: 2\n", "------ Inner loop. method_1: 3\n", "------ Inner loop. method_1: 4\n", "Elapsed:1.5588950157165526\n", "-- SNR: 10 dB\n", "--- Method: method_1\n", "---- Parameters Combination: 0\n", "------ Inner loop. method_1: 0\n", "------ Inner loop. method_1: 1\n", "------ Inner loop. method_1: 2\n", "------ Inner loop. method_1: 3\n", "------ Inner loop. method_1: 4\n", "Elapsed:1.5767138004302979\n", "---- Parameters Combination: 1\n", "------ Inner loop. method_1: 0\n", "------ Inner loop. method_1: 1\n", "------ Inner loop. method_1: 2\n", "------ Inner loop. method_1: 3\n", "------ Inner loop. method_1: 4\n", "Elapsed:1.5996645450592042\n", "---- Parameters Combination: 2\n", "------ Inner loop. method_1: 0\n", "------ Inner loop. method_1: 1\n", "------ Inner loop. method_1: 2\n", "------ Inner loop. method_1: 3\n", "------ Inner loop. method_1: 4\n", "Elapsed:1.5932747364044189\n", "-- SNR: 20 dB\n", "--- Method: method_1\n", "---- Parameters Combination: 0\n", "------ Inner loop. method_1: 0\n", "------ Inner loop. method_1: 1\n", "------ Inner loop. method_1: 2\n", "------ Inner loop. method_1: 3\n", "------ Inner loop. method_1: 4\n", "Elapsed:1.5435516834259033\n", "---- Parameters Combination: 1\n", "------ Inner loop. method_1: 0\n", "------ Inner loop. method_1: 1\n", "------ Inner loop. method_1: 2\n", "------ Inner loop. method_1: 3\n", "------ Inner loop. method_1: 4\n", "Elapsed:1.5798948764801026\n", "---- Parameters Combination: 2\n", "------ Inner loop. method_1: 0\n", "------ Inner loop. method_1: 1\n", "------ Inner loop. method_1: 2\n", "------ Inner loop. method_1: 3\n", "------ Inner loop. method_1: 4\n", "Elapsed:1.5917760848999023\n", "The test has finished.\n" ] }, { "data": { "text/plain": [ "{'perf_metric': {'linear_chirp': {0: {'method_1': {\"{'L': 25}\": {'Comp.0': [np.float64(1.9345058847705467),\n", " np.float64(1.1282311561428875),\n", " np.float64(0.9410921708666034),\n", " np.float64(1.1546533420250624),\n", " np.float64(1.4987758767200394)],\n", " 'Comp.1': [np.float64(5.175580885279313),\n", " np.float64(8.19876681693958),\n", " np.float64(5.286697485064469),\n", " np.float64(8.669357043621943),\n", " np.float64(7.650636930463604)]},\n", " \"{'L': 50}\": {'Comp.0': [np.float64(3.8208649938350403),\n", " np.float64(5.455134515150642),\n", " np.float64(3.607283581262556),\n", " np.float64(4.877066684972691),\n", " np.float64(4.666206191674506)],\n", " 'Comp.1': [np.float64(4.319067525652214),\n", " np.float64(7.062947898884301),\n", " np.float64(4.230686571236454),\n", " np.float64(7.25084716698017),\n", " np.float64(6.686451720468276)]},\n", " \"{'L': 100}\": {'Comp.0': [np.float64(4.371009198299424),\n", " np.float64(6.050561048363743),\n", " np.float64(4.196274908796927),\n", " np.float64(5.666757338103646),\n", " np.float64(5.5084936329620735)],\n", " 'Comp.1': [np.float64(3.2591057879819734),\n", " np.float64(5.345952599845003),\n", " np.float64(3.1022914571998377),\n", " np.float64(5.678273229334579),\n", " np.float64(5.222835953629762)]}}},\n", " 10: {'method_1': {\"{'L': 25}\": {'Comp.0': [np.float64(3.1794853875344935),\n", " np.float64(2.4683056726803674),\n", " np.float64(2.282625013370526),\n", " np.float64(2.3343049140289445),\n", " np.float64(2.248433656167679)],\n", " 'Comp.1': [np.float64(12.254898141264105),\n", " np.float64(14.77843208626979),\n", " np.float64(11.114214314875817),\n", " np.float64(14.938372153944979),\n", " np.float64(12.979656547432782)]},\n", " \"{'L': 50}\": {'Comp.0': [np.float64(9.041697553874679),\n", " np.float64(9.498485790327019),\n", " np.float64(8.185426251990938),\n", " np.float64(9.414451523075533),\n", " np.float64(8.903311988710318)],\n", " 'Comp.1': [np.float64(15.100606969203373),\n", " np.float64(21.178905645081784),\n", " np.float64(12.579658650599498),\n", " np.float64(19.702890059788228),\n", " np.float64(15.907363628079459)]},\n", " \"{'L': 100}\": {'Comp.0': [np.float64(13.434171592022269),\n", " np.float64(15.220317449623126),\n", " np.float64(11.54238727037582),\n", " np.float64(15.254464616987079),\n", " np.float64(13.654549142188904)],\n", " 'Comp.1': [np.float64(13.991942242839325),\n", " np.float64(17.74604283758289),\n", " np.float64(11.78177462908232),\n", " np.float64(17.230117982698566),\n", " np.float64(14.503241668406856)]}}},\n", " 20: {'method_1': {\"{'L': 25}\": {'Comp.0': [np.float64(2.7916975519316036),\n", " np.float64(2.6709074018981456),\n", " np.float64(2.662176305585389),\n", " np.float64(2.5725156138052876),\n", " np.float64(2.542967232627133)],\n", " 'Comp.1': [np.float64(14.87383862686157),\n", " np.float64(15.038587595103653),\n", " np.float64(14.904783776444251),\n", " np.float64(15.259010046466255),\n", " np.float64(15.074281252614457)]},\n", " \"{'L': 50}\": {'Comp.0': [np.float64(10.16005721906393),\n", " np.float64(10.017593755138872),\n", " np.float64(10.105618437252435),\n", " np.float64(10.013835257391541),\n", " np.float64(9.998069963273092)],\n", " 'Comp.1': [np.float64(29.46580652383519),\n", " np.float64(30.68537702951093),\n", " np.float64(30.37218617952931),\n", " np.float64(30.902228088645174),\n", " np.float64(30.82719628692924)]},\n", " \"{'L': 100}\": {'Comp.0': [np.float64(18.88766168596554),\n", " np.float64(18.451550246682388),\n", " np.float64(18.70504935446653),\n", " np.float64(18.643398021731063),\n", " np.float64(18.526666568942503)],\n", " 'Comp.1': [np.float64(27.156250258386887),\n", " np.float64(27.559718333920642),\n", " np.float64(27.21948425588033),\n", " np.float64(27.873369246766018),\n", " np.float64(27.636428429525353)]}}}}}}" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "benchmark = Benchmark(task='component_denoising',\n", " methods=methods,\n", " parameters=parameters,\n", " signal_ids=signals,\n", " SNRin=[0,10,20],\n", " repetitions=5,\n", " N = N,\n", " verbosity=5)\n", "benchmark.run()" ] }, { "cell_type": "markdown", "id": "d395e85a", "metadata": {}, "source": [ "## Displaying results." ] }, { "cell_type": "code", "execution_count": 6, "id": "806505f3", "metadata": {}, "outputs": [ { "data": { "application/vnd.microsoft.datawrangler.viewer.v0+json": { "columns": [ { "name": "index", "rawType": "int64", "type": "integer" }, { "name": "level_0", "rawType": "object", "type": "string" }, { "name": "level_1", "rawType": "object", "type": "string" }, { "name": "level_2", "rawType": "int64", "type": "integer" }, { "name": "level_3", "rawType": "object", "type": "string" }, { "name": "level_4", "rawType": "object", "type": "string" }, { "name": "level_5", "rawType": "int64", "type": "integer" }, { "name": "Comp.0", "rawType": "float64", "type": "float" }, { "name": "Comp.1", "rawType": "float64", "type": "float" } ], "ref": "b2b61e76-2f67-4c1d-aa3b-a47c02400bb0", "rows": [ [ "0", "perf_metric", "linear_chirp", "0", "method_1", "{'L': 25}", "0", "1.9345058847705467", "5.175580885279313" ], [ "1", "perf_metric", "linear_chirp", "0", "method_1", "{'L': 25}", "1", "1.1282311561428875", "8.19876681693958" ], [ "2", "perf_metric", "linear_chirp", "0", "method_1", "{'L': 25}", "2", "0.9410921708666034", "5.286697485064469" ], [ "3", "perf_metric", "linear_chirp", "0", "method_1", "{'L': 25}", "3", "1.1546533420250624", "8.669357043621943" ], [ "4", "perf_metric", "linear_chirp", "0", "method_1", "{'L': 25}", "4", "1.4987758767200394", "7.650636930463604" ], [ "5", "perf_metric", "linear_chirp", "0", "method_1", "{'L': 50}", "0", "3.8208649938350403", "4.319067525652214" ], [ "6", "perf_metric", "linear_chirp", "0", "method_1", "{'L': 50}", "1", "5.455134515150642", "7.062947898884301" ], [ "7", "perf_metric", "linear_chirp", "0", "method_1", "{'L': 50}", "2", "3.607283581262556", "4.230686571236454" ], [ "8", "perf_metric", "linear_chirp", "0", "method_1", "{'L': 50}", "3", "4.877066684972691", "7.25084716698017" ], [ "9", "perf_metric", "linear_chirp", "0", "method_1", "{'L': 50}", "4", "4.666206191674506", "6.686451720468276" ], [ "10", "perf_metric", "linear_chirp", "0", "method_1", "{'L': 100}", "0", "4.371009198299424", "3.2591057879819734" ], [ "11", "perf_metric", "linear_chirp", "0", "method_1", "{'L': 100}", "1", "6.050561048363743", "5.345952599845003" ], [ "12", "perf_metric", "linear_chirp", "0", "method_1", "{'L': 100}", "2", "4.196274908796927", "3.1022914571998377" ], [ "13", "perf_metric", "linear_chirp", "0", "method_1", "{'L': 100}", "3", "5.666757338103646", "5.678273229334579" ], [ "14", "perf_metric", "linear_chirp", "0", "method_1", "{'L': 100}", "4", "5.5084936329620735", "5.222835953629762" ], [ "15", "perf_metric", "linear_chirp", "10", "method_1", "{'L': 25}", "0", "3.1794853875344935", "12.254898141264105" ], [ "16", "perf_metric", "linear_chirp", "10", "method_1", "{'L': 25}", "1", "2.4683056726803674", "14.77843208626979" ], [ "17", "perf_metric", "linear_chirp", "10", "method_1", "{'L': 25}", "2", "2.282625013370526", "11.114214314875817" ], [ "18", "perf_metric", "linear_chirp", "10", "method_1", "{'L': 25}", "3", "2.3343049140289445", "14.938372153944979" ], [ "19", "perf_metric", "linear_chirp", "10", "method_1", "{'L': 25}", "4", "2.248433656167679", "12.979656547432782" ], [ "20", "perf_metric", "linear_chirp", "10", "method_1", "{'L': 50}", "0", "9.041697553874679", "15.100606969203373" ], [ "21", "perf_metric", "linear_chirp", "10", "method_1", "{'L': 50}", "1", "9.498485790327019", "21.178905645081784" ], [ "22", "perf_metric", "linear_chirp", "10", "method_1", "{'L': 50}", "2", "8.185426251990938", "12.579658650599498" ], [ "23", "perf_metric", "linear_chirp", "10", "method_1", "{'L': 50}", "3", "9.414451523075533", "19.702890059788228" ], [ "24", "perf_metric", "linear_chirp", "10", "method_1", "{'L': 50}", "4", "8.903311988710318", "15.907363628079459" ], [ "25", "perf_metric", "linear_chirp", "10", "method_1", "{'L': 100}", "0", "13.434171592022269", "13.991942242839325" ], [ "26", "perf_metric", "linear_chirp", "10", "method_1", "{'L': 100}", "1", "15.220317449623126", "17.74604283758289" ], [ "27", "perf_metric", "linear_chirp", "10", "method_1", "{'L': 100}", "2", "11.54238727037582", "11.78177462908232" ], [ "28", "perf_metric", "linear_chirp", "10", "method_1", "{'L': 100}", "3", "15.254464616987079", "17.230117982698566" ], [ "29", "perf_metric", "linear_chirp", "10", "method_1", "{'L': 100}", "4", "13.654549142188904", "14.503241668406856" ], [ "30", "perf_metric", "linear_chirp", "20", "method_1", "{'L': 25}", "0", "2.7916975519316036", "14.87383862686157" ], [ "31", "perf_metric", "linear_chirp", "20", "method_1", "{'L': 25}", "1", "2.6709074018981456", "15.038587595103653" ], [ "32", "perf_metric", "linear_chirp", "20", "method_1", "{'L': 25}", "2", "2.662176305585389", "14.904783776444251" ], [ "33", "perf_metric", "linear_chirp", "20", "method_1", "{'L': 25}", "3", "2.5725156138052876", "15.259010046466255" ], [ "34", "perf_metric", "linear_chirp", "20", "method_1", "{'L': 25}", "4", "2.542967232627133", "15.074281252614457" ], [ "35", "perf_metric", "linear_chirp", "20", "method_1", "{'L': 50}", "0", "10.16005721906393", "29.46580652383519" ], [ "36", "perf_metric", "linear_chirp", "20", "method_1", "{'L': 50}", "1", "10.017593755138872", "30.68537702951093" ], [ "37", "perf_metric", "linear_chirp", "20", "method_1", "{'L': 50}", "2", "10.105618437252435", "30.37218617952931" ], [ "38", "perf_metric", "linear_chirp", "20", "method_1", "{'L': 50}", "3", "10.013835257391541", "30.902228088645174" ], [ "39", "perf_metric", "linear_chirp", "20", "method_1", "{'L': 50}", "4", "9.998069963273092", "30.82719628692924" ], [ "40", "perf_metric", "linear_chirp", "20", "method_1", "{'L': 100}", "0", "18.88766168596554", "27.156250258386887" ], [ "41", "perf_metric", "linear_chirp", "20", "method_1", "{'L': 100}", "1", "18.451550246682388", "27.559718333920642" ], [ "42", "perf_metric", "linear_chirp", "20", "method_1", "{'L': 100}", "2", "18.70504935446653", "27.21948425588033" ], [ "43", "perf_metric", "linear_chirp", "20", "method_1", "{'L': 100}", "3", "18.643398021731063", "27.873369246766018" ], [ "44", "perf_metric", "linear_chirp", "20", "method_1", "{'L': 100}", "4", "18.526666568942503", "27.636428429525353" ] ], "shape": { "columns": 8, "rows": 45 } }, "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
level_0level_1level_2level_3level_4level_5Comp.0Comp.1
0perf_metriclinear_chirp0method_1{'L': 25}01.9345065.175581
1perf_metriclinear_chirp0method_1{'L': 25}11.1282318.198767
2perf_metriclinear_chirp0method_1{'L': 25}20.9410925.286697
3perf_metriclinear_chirp0method_1{'L': 25}31.1546538.669357
4perf_metriclinear_chirp0method_1{'L': 25}41.4987767.650637
5perf_metriclinear_chirp0method_1{'L': 50}03.8208654.319068
6perf_metriclinear_chirp0method_1{'L': 50}15.4551357.062948
7perf_metriclinear_chirp0method_1{'L': 50}23.6072844.230687
8perf_metriclinear_chirp0method_1{'L': 50}34.8770677.250847
9perf_metriclinear_chirp0method_1{'L': 50}44.6662066.686452
10perf_metriclinear_chirp0method_1{'L': 100}04.3710093.259106
11perf_metriclinear_chirp0method_1{'L': 100}16.0505615.345953
12perf_metriclinear_chirp0method_1{'L': 100}24.1962753.102291
13perf_metriclinear_chirp0method_1{'L': 100}35.6667575.678273
14perf_metriclinear_chirp0method_1{'L': 100}45.5084945.222836
15perf_metriclinear_chirp10method_1{'L': 25}03.17948512.254898
16perf_metriclinear_chirp10method_1{'L': 25}12.46830614.778432
17perf_metriclinear_chirp10method_1{'L': 25}22.28262511.114214
18perf_metriclinear_chirp10method_1{'L': 25}32.33430514.938372
19perf_metriclinear_chirp10method_1{'L': 25}42.24843412.979657
20perf_metriclinear_chirp10method_1{'L': 50}09.04169815.100607
21perf_metriclinear_chirp10method_1{'L': 50}19.49848621.178906
22perf_metriclinear_chirp10method_1{'L': 50}28.18542612.579659
23perf_metriclinear_chirp10method_1{'L': 50}39.41445219.702890
24perf_metriclinear_chirp10method_1{'L': 50}48.90331215.907364
25perf_metriclinear_chirp10method_1{'L': 100}013.43417213.991942
26perf_metriclinear_chirp10method_1{'L': 100}115.22031717.746043
27perf_metriclinear_chirp10method_1{'L': 100}211.54238711.781775
28perf_metriclinear_chirp10method_1{'L': 100}315.25446517.230118
29perf_metriclinear_chirp10method_1{'L': 100}413.65454914.503242
30perf_metriclinear_chirp20method_1{'L': 25}02.79169814.873839
31perf_metriclinear_chirp20method_1{'L': 25}12.67090715.038588
32perf_metriclinear_chirp20method_1{'L': 25}22.66217614.904784
33perf_metriclinear_chirp20method_1{'L': 25}32.57251615.259010
34perf_metriclinear_chirp20method_1{'L': 25}42.54296715.074281
35perf_metriclinear_chirp20method_1{'L': 50}010.16005729.465807
36perf_metriclinear_chirp20method_1{'L': 50}110.01759430.685377
37perf_metriclinear_chirp20method_1{'L': 50}210.10561830.372186
38perf_metriclinear_chirp20method_1{'L': 50}310.01383530.902228
39perf_metriclinear_chirp20method_1{'L': 50}49.99807030.827196
40perf_metriclinear_chirp20method_1{'L': 100}018.88766227.156250
41perf_metriclinear_chirp20method_1{'L': 100}118.45155027.559718
42perf_metriclinear_chirp20method_1{'L': 100}218.70504927.219484
43perf_metriclinear_chirp20method_1{'L': 100}318.64339827.873369
44perf_metriclinear_chirp20method_1{'L': 100}418.52666727.636428
\n", "
" ], "text/plain": [ " level_0 level_1 level_2 level_3 level_4 level_5 \\\n", "0 perf_metric linear_chirp 0 method_1 {'L': 25} 0 \n", "1 perf_metric linear_chirp 0 method_1 {'L': 25} 1 \n", "2 perf_metric linear_chirp 0 method_1 {'L': 25} 2 \n", "3 perf_metric linear_chirp 0 method_1 {'L': 25} 3 \n", "4 perf_metric linear_chirp 0 method_1 {'L': 25} 4 \n", "5 perf_metric linear_chirp 0 method_1 {'L': 50} 0 \n", "6 perf_metric linear_chirp 0 method_1 {'L': 50} 1 \n", "7 perf_metric linear_chirp 0 method_1 {'L': 50} 2 \n", "8 perf_metric linear_chirp 0 method_1 {'L': 50} 3 \n", "9 perf_metric linear_chirp 0 method_1 {'L': 50} 4 \n", "10 perf_metric linear_chirp 0 method_1 {'L': 100} 0 \n", "11 perf_metric linear_chirp 0 method_1 {'L': 100} 1 \n", "12 perf_metric linear_chirp 0 method_1 {'L': 100} 2 \n", "13 perf_metric linear_chirp 0 method_1 {'L': 100} 3 \n", "14 perf_metric linear_chirp 0 method_1 {'L': 100} 4 \n", "15 perf_metric linear_chirp 10 method_1 {'L': 25} 0 \n", "16 perf_metric linear_chirp 10 method_1 {'L': 25} 1 \n", "17 perf_metric linear_chirp 10 method_1 {'L': 25} 2 \n", "18 perf_metric linear_chirp 10 method_1 {'L': 25} 3 \n", "19 perf_metric linear_chirp 10 method_1 {'L': 25} 4 \n", "20 perf_metric linear_chirp 10 method_1 {'L': 50} 0 \n", "21 perf_metric linear_chirp 10 method_1 {'L': 50} 1 \n", "22 perf_metric linear_chirp 10 method_1 {'L': 50} 2 \n", "23 perf_metric linear_chirp 10 method_1 {'L': 50} 3 \n", "24 perf_metric linear_chirp 10 method_1 {'L': 50} 4 \n", "25 perf_metric linear_chirp 10 method_1 {'L': 100} 0 \n", "26 perf_metric linear_chirp 10 method_1 {'L': 100} 1 \n", "27 perf_metric linear_chirp 10 method_1 {'L': 100} 2 \n", "28 perf_metric linear_chirp 10 method_1 {'L': 100} 3 \n", "29 perf_metric linear_chirp 10 method_1 {'L': 100} 4 \n", "30 perf_metric linear_chirp 20 method_1 {'L': 25} 0 \n", "31 perf_metric linear_chirp 20 method_1 {'L': 25} 1 \n", "32 perf_metric linear_chirp 20 method_1 {'L': 25} 2 \n", "33 perf_metric linear_chirp 20 method_1 {'L': 25} 3 \n", "34 perf_metric linear_chirp 20 method_1 {'L': 25} 4 \n", "35 perf_metric linear_chirp 20 method_1 {'L': 50} 0 \n", "36 perf_metric linear_chirp 20 method_1 {'L': 50} 1 \n", "37 perf_metric linear_chirp 20 method_1 {'L': 50} 2 \n", "38 perf_metric linear_chirp 20 method_1 {'L': 50} 3 \n", "39 perf_metric linear_chirp 20 method_1 {'L': 50} 4 \n", "40 perf_metric linear_chirp 20 method_1 {'L': 100} 0 \n", "41 perf_metric linear_chirp 20 method_1 {'L': 100} 1 \n", "42 perf_metric linear_chirp 20 method_1 {'L': 100} 2 \n", "43 perf_metric linear_chirp 20 method_1 {'L': 100} 3 \n", "44 perf_metric linear_chirp 20 method_1 {'L': 100} 4 \n", "\n", " Comp.0 Comp.1 \n", "0 1.934506 5.175581 \n", "1 1.128231 8.198767 \n", "2 0.941092 5.286697 \n", "3 1.154653 8.669357 \n", "4 1.498776 7.650637 \n", "5 3.820865 4.319068 \n", "6 5.455135 7.062948 \n", "7 3.607284 4.230687 \n", "8 4.877067 7.250847 \n", "9 4.666206 6.686452 \n", "10 4.371009 3.259106 \n", "11 6.050561 5.345953 \n", "12 4.196275 3.102291 \n", "13 5.666757 5.678273 \n", "14 5.508494 5.222836 \n", "15 3.179485 12.254898 \n", "16 2.468306 14.778432 \n", "17 2.282625 11.114214 \n", "18 2.334305 14.938372 \n", "19 2.248434 12.979657 \n", "20 9.041698 15.100607 \n", "21 9.498486 21.178906 \n", "22 8.185426 12.579659 \n", "23 9.414452 19.702890 \n", "24 8.903312 15.907364 \n", "25 13.434172 13.991942 \n", "26 15.220317 17.746043 \n", "27 11.542387 11.781775 \n", "28 15.254465 17.230118 \n", "29 13.654549 14.503242 \n", "30 2.791698 14.873839 \n", "31 2.670907 15.038588 \n", "32 2.662176 14.904784 \n", "33 2.572516 15.259010 \n", "34 2.542967 15.074281 \n", "35 10.160057 29.465807 \n", "36 10.017594 30.685377 \n", "37 10.105618 30.372186 \n", "38 10.013835 30.902228 \n", "39 9.998070 30.827196 \n", "40 18.887662 27.156250 \n", "41 18.451550 27.559718 \n", "42 18.705049 27.219484 \n", "43 18.643398 27.873369 \n", "44 18.526667 27.636428 " ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results = benchmark.results # Get dictionary with the results.\n", "df = benchmark.dic2df(results) # Transform dictionary to DataFrame\n", "df = df.reset_index()\n", "df" ] }, { "cell_type": "markdown", "id": "9e03b16b", "metadata": {}, "source": [ "Before displaying the results, we need to format the `DataFrame` in the correct way:" ] }, { "cell_type": "code", "execution_count": 7, "id": "e5278c0d", "metadata": {}, "outputs": [ { "data": { "application/vnd.microsoft.datawrangler.viewer.v0+json": { "columns": [ { "name": "index", "rawType": "int64", "type": "integer" }, { "name": "Method", "rawType": "object", "type": "string" }, { "name": "Parameter", "rawType": "object", "type": "string" }, { "name": "Signal_id", "rawType": "object", "type": "string" }, { "name": "Repetition", "rawType": "int64", "type": "integer" }, { "name": "0", "rawType": "float64", "type": "float" }, { "name": "10", "rawType": "float64", "type": "float" }, { "name": "20", "rawType": "float64", "type": "float" } ], "ref": "dce06c3f-462a-494f-b9a1-caa013e97c02", "rows": [ [ "0", "method_1", "{'L': 100}", "linear_chirp", "0", "4.371009198299424", "13.434171592022269", "18.88766168596554" ], [ "1", "method_1", "{'L': 100}", "linear_chirp", "1", "6.050561048363743", "15.220317449623126", "18.451550246682388" ], [ "2", "method_1", "{'L': 100}", "linear_chirp", "2", "4.196274908796927", "11.54238727037582", "18.70504935446653" ], [ "3", "method_1", "{'L': 100}", "linear_chirp", "3", "5.666757338103646", "15.254464616987079", "18.643398021731063" ], [ "4", "method_1", "{'L': 100}", "linear_chirp", "4", "5.5084936329620735", "13.654549142188904", "18.526666568942503" ], [ "5", "method_1", "{'L': 25}", "linear_chirp", "0", "1.9345058847705467", "3.1794853875344935", "2.7916975519316036" ], [ "6", "method_1", "{'L': 25}", "linear_chirp", "1", "1.1282311561428875", "2.4683056726803674", "2.6709074018981456" ], [ "7", "method_1", "{'L': 25}", "linear_chirp", "2", "0.9410921708666034", "2.282625013370526", "2.662176305585389" ], [ "8", "method_1", "{'L': 25}", "linear_chirp", "3", "1.1546533420250624", "2.3343049140289445", "2.5725156138052876" ], [ "9", "method_1", "{'L': 25}", "linear_chirp", "4", "1.4987758767200394", "2.248433656167679", "2.542967232627133" ], [ "10", "method_1", "{'L': 50}", "linear_chirp", "0", "3.8208649938350403", "9.041697553874679", "10.16005721906393" ], [ "11", "method_1", "{'L': 50}", "linear_chirp", "1", "5.455134515150642", "9.498485790327019", "10.017593755138872" ], [ "12", "method_1", "{'L': 50}", "linear_chirp", "2", "3.607283581262556", "8.185426251990938", "10.105618437252435" ], [ "13", "method_1", "{'L': 50}", "linear_chirp", "3", "4.877066684972691", "9.414451523075533", "10.013835257391541" ], [ "14", "method_1", "{'L': 50}", "linear_chirp", "4", "4.666206191674506", "8.903311988710318", "9.998069963273092" ] ], "shape": { "columns": 7, "rows": 15 } }, "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SNRMethodParameterSignal_idRepetition01020
0method_1{'L': 100}linear_chirp04.37100913.43417218.887662
1method_1{'L': 100}linear_chirp16.05056115.22031718.451550
2method_1{'L': 100}linear_chirp24.19627511.54238718.705049
3method_1{'L': 100}linear_chirp35.66675715.25446518.643398
4method_1{'L': 100}linear_chirp45.50849413.65454918.526667
5method_1{'L': 25}linear_chirp01.9345063.1794852.791698
6method_1{'L': 25}linear_chirp11.1282312.4683062.670907
7method_1{'L': 25}linear_chirp20.9410922.2826252.662176
8method_1{'L': 25}linear_chirp31.1546532.3343052.572516
9method_1{'L': 25}linear_chirp41.4987762.2484342.542967
10method_1{'L': 50}linear_chirp03.8208659.04169810.160057
11method_1{'L': 50}linear_chirp15.4551359.49848610.017594
12method_1{'L': 50}linear_chirp23.6072848.18542610.105618
13method_1{'L': 50}linear_chirp34.8770679.41445210.013835
14method_1{'L': 50}linear_chirp44.6662068.9033129.998070
\n", "
" ], "text/plain": [ "SNR Method Parameter Signal_id Repetition 0 10 \\\n", "0 method_1 {'L': 100} linear_chirp 0 4.371009 13.434172 \n", "1 method_1 {'L': 100} linear_chirp 1 6.050561 15.220317 \n", "2 method_1 {'L': 100} linear_chirp 2 4.196275 11.542387 \n", "3 method_1 {'L': 100} linear_chirp 3 5.666757 15.254465 \n", "4 method_1 {'L': 100} linear_chirp 4 5.508494 13.654549 \n", "5 method_1 {'L': 25} linear_chirp 0 1.934506 3.179485 \n", "6 method_1 {'L': 25} linear_chirp 1 1.128231 2.468306 \n", "7 method_1 {'L': 25} linear_chirp 2 0.941092 2.282625 \n", "8 method_1 {'L': 25} linear_chirp 3 1.154653 2.334305 \n", "9 method_1 {'L': 25} linear_chirp 4 1.498776 2.248434 \n", "10 method_1 {'L': 50} linear_chirp 0 3.820865 9.041698 \n", "11 method_1 {'L': 50} linear_chirp 1 5.455135 9.498486 \n", "12 method_1 {'L': 50} linear_chirp 2 3.607284 8.185426 \n", "13 method_1 {'L': 50} linear_chirp 3 4.877067 9.414452 \n", "14 method_1 {'L': 50} linear_chirp 4 4.666206 8.903312 \n", "\n", "SNR 20 \n", "0 18.887662 \n", "1 18.451550 \n", "2 18.705049 \n", "3 18.643398 \n", "4 18.526667 \n", "5 2.791698 \n", "6 2.670907 \n", "7 2.662176 \n", "8 2.572516 \n", "9 2.542967 \n", "10 10.160057 \n", "11 10.017594 \n", "12 10.105618 \n", "13 10.013835 \n", "14 9.998070 " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# For the first Component:\n", "df = df.iloc[:,[3,4,1,5,2,6]]\n", "col_names = list(df.columns)\n", "col_names[0:6] = ['Method','Parameter', 'Signal_id','Repetition','SNR','QRF']\n", "df.columns = col_names\n", "df = df.pivot_table(index= ['Method','Parameter', 'Signal_id','Repetition'], columns='SNR', values='QRF')\n", "df = df.reset_index()\n", "df" ] }, { "cell_type": "markdown", "id": "d9baf321", "metadata": {}, "source": [ "Finally, we can use the functionality from the `ResultsInterpreter` class to display the result on interactive plots (using `plotly`)." ] }, { "cell_type": "code", "execution_count": 8, "id": "f9eabe9f", "metadata": {}, "outputs": [ { "data": { "text/html": [ " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.plotly.v1+json": { "config": { "linkText": "Export to plot.ly", "plotlyServerURL": "https://plot.ly", "showLink": false }, "data": [ { "alignmentgroup": "True", "error_x": { "array": [ "0", "10", "20" ] }, "error_y": { "array": [ 0.40437145588473, 0.39238257283644096, 0.09389866690119764 ], "arrayminus": [ 0.3102194839514758, 0.23368245826701495, 0.08144688359985519 ] }, "hovertemplate": "Method + Param=method_1{'L': 25}
SNRin=%{x}
QRF=%{y}", "legendgroup": "method_1{'L': 25}", "marker": { "color": "#636efa", "pattern": { "shape": "" } }, "name": "method_1{'L': 25}", "offsetgroup": "method_1{'L': 25}", "orientation": "v", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ "0", "10", "20" ], "xaxis": "x", "y": [ 1.3314516861050278, 2.502630928756402, 2.648052821169512 ], "yaxis": "y" }, { "alignmentgroup": "True", "error_x": { "array": [ "0", "10", "20" ] }, "error_y": { "array": [ 0.7385961897003748, 0.43939060838043, 0.07252959985494556 ], "arrayminus": [ 0.7071624820585436, 0.536094074917008, 0.05390714595403523 ] }, "hovertemplate": "Method + Param=method_1{'L': 50}
SNRin=%{x}
QRF=%{y}", "legendgroup": "method_1{'L': 50}", "marker": { "color": "#EF553B", "pattern": { "shape": "" } }, "name": "method_1{'L': 50}", "offsetgroup": "method_1{'L': 50}", "orientation": "v", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ "0", "10", "20" ], "xaxis": "x", "y": [ 4.485311193379087, 9.008674621595697, 10.059034926423973 ], "yaxis": "y" }, { "alignmentgroup": "True", "error_x": { "array": [ "0", "10", "20" ] }, "error_y": { "array": [ 0.706767597926226, 1.412798302329266, 0.16774424118051456 ], "arrayminus": [ 0.8575037428067374, 1.522077015205042, 0.1462451355191483 ] }, "hovertemplate": "Method + Param=method_1{'L': 100}
SNRin=%{x}
QRF=%{y}", "legendgroup": "method_1{'L': 100}", "marker": { "color": "#00cc96", "pattern": { "shape": "" } }, "name": "method_1{'L': 100}", "offsetgroup": "method_1{'L': 100}", "orientation": "v", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ "0", "10", "20" ], "xaxis": "x", "y": [ 5.158619225305164, 13.82117801423944, 18.642865175557606 ], "yaxis": "y" } ], "layout": { "barmode": "group", "legend": { "title": { "text": "Method + Param" }, "tracegroupgap": 0 }, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "fillpattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "title": { "text": "linear_chirp" }, "xaxis": { "anchor": "y", "domain": [ 0, 1 ], "title": { "text": "SNRin (dB)" } }, "yaxis": { "anchor": "x", "domain": [ 0, 1 ], "title": { "text": "QRF" } } } }, "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Summary interactive plots with Plotly and a report.\n", "from plotly.offline import iplot\n", "import plotly.io as pio\n", "pio.renderers.default = \"plotly_mimetype+notebook\"\n", "interpreter = ResultsInterpreter(benchmark)\n", "figs = interpreter.get_summary_plotlys(df, bars=True,)\n", "for fig in figs:\n", " iplot(fig)\n" ] }, { "cell_type": "code", "execution_count": 9, "id": "1ac1952c", "metadata": {}, "outputs": [], "source": [ "results = benchmark.results # Get dictionary with the results.\n", "df = benchmark.dic2df(results) # Transform dictionary to DataFrame\n", "df = df.reset_index()" ] }, { "cell_type": "code", "execution_count": 10, "id": "c82bb9af", "metadata": {}, "outputs": [ { "data": { "application/vnd.microsoft.datawrangler.viewer.v0+json": { "columns": [ { "name": "index", "rawType": "int64", "type": "integer" }, { "name": "Method", "rawType": "object", "type": "string" }, { "name": "Parameter", "rawType": "object", "type": "string" }, { "name": "Signal_id", "rawType": "object", "type": "string" }, { "name": "Repetition", "rawType": "int64", "type": "integer" }, { "name": "0", "rawType": "float64", "type": "float" }, { "name": "10", "rawType": "float64", "type": "float" }, { "name": "20", "rawType": "float64", "type": "float" } ], "ref": "0ddc3a7e-171b-4659-a201-ebcbbbfde260", "rows": [ [ "0", "method_1", "{'L': 100}", "linear_chirp", "0", "3.2591057879819734", "13.991942242839325", "27.156250258386887" ], [ "1", "method_1", "{'L': 100}", "linear_chirp", "1", "5.345952599845003", "17.74604283758289", "27.559718333920642" ], [ "2", "method_1", "{'L': 100}", "linear_chirp", "2", "3.1022914571998377", "11.78177462908232", "27.21948425588033" ], [ "3", "method_1", "{'L': 100}", "linear_chirp", "3", "5.678273229334579", "17.230117982698566", "27.873369246766018" ], [ "4", "method_1", "{'L': 100}", "linear_chirp", "4", "5.222835953629762", "14.503241668406856", "27.636428429525353" ], [ "5", "method_1", "{'L': 25}", "linear_chirp", "0", "5.175580885279313", "12.254898141264105", "14.87383862686157" ], [ "6", "method_1", "{'L': 25}", "linear_chirp", "1", "8.19876681693958", "14.77843208626979", "15.038587595103653" ], [ "7", "method_1", "{'L': 25}", "linear_chirp", "2", "5.286697485064469", "11.114214314875817", "14.904783776444251" ], [ "8", "method_1", "{'L': 25}", "linear_chirp", "3", "8.669357043621943", "14.938372153944979", "15.259010046466255" ], [ "9", "method_1", "{'L': 25}", "linear_chirp", "4", "7.650636930463604", "12.979656547432782", "15.074281252614457" ], [ "10", "method_1", "{'L': 50}", "linear_chirp", "0", "4.319067525652214", "15.100606969203373", "29.46580652383519" ], [ "11", "method_1", "{'L': 50}", "linear_chirp", "1", "7.062947898884301", "21.178905645081784", "30.68537702951093" ], [ "12", "method_1", "{'L': 50}", "linear_chirp", "2", "4.230686571236454", "12.579658650599498", "30.37218617952931" ], [ "13", "method_1", "{'L': 50}", "linear_chirp", "3", "7.25084716698017", "19.702890059788228", "30.902228088645174" ], [ "14", "method_1", "{'L': 50}", "linear_chirp", "4", "6.686451720468276", "15.907363628079459", "30.82719628692924" ] ], "shape": { "columns": 7, "rows": 15 } }, "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
SNRMethodParameterSignal_idRepetition01020
0method_1{'L': 100}linear_chirp03.25910613.99194227.156250
1method_1{'L': 100}linear_chirp15.34595317.74604327.559718
2method_1{'L': 100}linear_chirp23.10229111.78177527.219484
3method_1{'L': 100}linear_chirp35.67827317.23011827.873369
4method_1{'L': 100}linear_chirp45.22283614.50324227.636428
5method_1{'L': 25}linear_chirp05.17558112.25489814.873839
6method_1{'L': 25}linear_chirp18.19876714.77843215.038588
7method_1{'L': 25}linear_chirp25.28669711.11421414.904784
8method_1{'L': 25}linear_chirp38.66935714.93837215.259010
9method_1{'L': 25}linear_chirp47.65063712.97965715.074281
10method_1{'L': 50}linear_chirp04.31906815.10060729.465807
11method_1{'L': 50}linear_chirp17.06294821.17890630.685377
12method_1{'L': 50}linear_chirp24.23068712.57965930.372186
13method_1{'L': 50}linear_chirp37.25084719.70289030.902228
14method_1{'L': 50}linear_chirp46.68645215.90736430.827196
\n", "
" ], "text/plain": [ "SNR Method Parameter Signal_id Repetition 0 10 \\\n", "0 method_1 {'L': 100} linear_chirp 0 3.259106 13.991942 \n", "1 method_1 {'L': 100} linear_chirp 1 5.345953 17.746043 \n", "2 method_1 {'L': 100} linear_chirp 2 3.102291 11.781775 \n", "3 method_1 {'L': 100} linear_chirp 3 5.678273 17.230118 \n", "4 method_1 {'L': 100} linear_chirp 4 5.222836 14.503242 \n", "5 method_1 {'L': 25} linear_chirp 0 5.175581 12.254898 \n", "6 method_1 {'L': 25} linear_chirp 1 8.198767 14.778432 \n", "7 method_1 {'L': 25} linear_chirp 2 5.286697 11.114214 \n", "8 method_1 {'L': 25} linear_chirp 3 8.669357 14.938372 \n", "9 method_1 {'L': 25} linear_chirp 4 7.650637 12.979657 \n", "10 method_1 {'L': 50} linear_chirp 0 4.319068 15.100607 \n", "11 method_1 {'L': 50} linear_chirp 1 7.062948 21.178906 \n", "12 method_1 {'L': 50} linear_chirp 2 4.230687 12.579659 \n", "13 method_1 {'L': 50} linear_chirp 3 7.250847 19.702890 \n", "14 method_1 {'L': 50} linear_chirp 4 6.686452 15.907364 \n", "\n", "SNR 20 \n", "0 27.156250 \n", "1 27.559718 \n", "2 27.219484 \n", "3 27.873369 \n", "4 27.636428 \n", "5 14.873839 \n", "6 15.038588 \n", "7 14.904784 \n", "8 15.259010 \n", "9 15.074281 \n", "10 29.465807 \n", "11 30.685377 \n", "12 30.372186 \n", "13 30.902228 \n", "14 30.827196 " ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# For the second component:\n", "df = df.iloc[:,[3,4,1,5,2,7]]\n", "col_names = list(df.columns)\n", "col_names[0:6] = ['Method','Parameter', 'Signal_id','Repetition','SNR','QRF']\n", "df.columns = col_names\n", "df = df.pivot_table(index= ['Method','Parameter', 'Signal_id','Repetition'], columns='SNR', values='QRF')\n", "df = df.reset_index()\n", "df" ] }, { "cell_type": "code", "execution_count": 11, "id": "585eb378", "metadata": {}, "outputs": [ { "data": { "text/html": [ " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "application/vnd.plotly.v1+json": { "config": { "linkText": "Export to plot.ly", "plotlyServerURL": "https://plot.ly", "showLink": false }, "data": [ { "alignmentgroup": "True", "error_x": { "array": [ "0", "10", "20" ] }, "error_y": { "array": [ 1.3907950753387421, 1.5973054510473332, 0.1518755030472807 ], "arrayminus": [ 1.7539569871233756, 1.497675122092625, 0.1356831081639811 ] }, "hovertemplate": "Method + Param=method_1{'L': 25}
SNRin=%{x}
QRF=%{y}", "legendgroup": "method_1{'L': 25}", "marker": { "color": "#636efa", "pattern": { "shape": "" } }, "name": "method_1{'L': 25}", "offsetgroup": "method_1{'L': 25}", "orientation": "v", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ "0", "10", "20" ], "xaxis": "x", "y": [ 6.996207832273782, 13.213114648757493, 15.030100259498036 ], "yaxis": "y" }, { "alignmentgroup": "True", "error_x": { "array": [ "0", "10", "20" ] }, "error_y": { "array": [ 1.2279679010335087, 3.104208186296475, 0.4066501859256384 ], "arrayminus": [ 1.6086088418752214, 3.144495680734206, 0.6222004355771276 ] }, "hovertemplate": "Method + Param=method_1{'L': 50}
SNRin=%{x}
QRF=%{y}", "legendgroup": "method_1{'L': 50}", "marker": { "color": "#EF553B", "pattern": { "shape": "" } }, "name": "method_1{'L': 50}", "offsetgroup": "method_1{'L': 50}", "orientation": "v", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ "0", "10", "20" ], "xaxis": "x", "y": [ 5.910000176644283, 16.893884990550468, 30.45055882168997 ], "yaxis": "y" }, { "alignmentgroup": "True", "error_x": { "array": [ "0", "10", "20" ] }, "error_y": { "array": [ 0.9990298426974693, 2.282679081553443, 0.2742007958529662 ], "arrayminus": [ 1.3253117499291114, 2.282522312423362, 0.29485944801288966 ] }, "hovertemplate": "Method + Param=method_1{'L': 100}
SNRin=%{x}
QRF=%{y}", "legendgroup": "method_1{'L': 100}", "marker": { "color": "#00cc96", "pattern": { "shape": "" } }, "name": "method_1{'L': 100}", "offsetgroup": "method_1{'L': 100}", "orientation": "v", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ "0", "10", "20" ], "xaxis": "x", "y": [ 4.5216918055982305, 15.050623872121992, 27.489050104895846 ], "yaxis": "y" } ], "layout": { "barmode": "group", "legend": { "title": { "text": "Method + Param" }, "tracegroupgap": 0 }, "template": { "data": { "bar": [ { "error_x": { "color": "#2a3f5f" }, "error_y": { "color": "#2a3f5f" }, "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "bar" } ], "barpolar": [ { "marker": { "line": { "color": "#E5ECF6", "width": 0.5 }, "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "barpolar" } ], "carpet": [ { "aaxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "baxis": { "endlinecolor": "#2a3f5f", "gridcolor": "white", "linecolor": "white", "minorgridcolor": "white", "startlinecolor": "#2a3f5f" }, "type": "carpet" } ], "choropleth": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "choropleth" } ], "contour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "contour" } ], "contourcarpet": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "contourcarpet" } ], "heatmap": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmap" } ], "heatmapgl": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "heatmapgl" } ], "histogram": [ { "marker": { "pattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 } }, "type": "histogram" } ], "histogram2d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2d" } ], "histogram2dcontour": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "histogram2dcontour" } ], "mesh3d": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "type": "mesh3d" } ], "parcoords": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "parcoords" } ], "pie": [ { "automargin": true, "type": "pie" } ], "scatter": [ { "fillpattern": { "fillmode": "overlay", "size": 10, "solidity": 0.2 }, "type": "scatter" } ], "scatter3d": [ { "line": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatter3d" } ], "scattercarpet": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattercarpet" } ], "scattergeo": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergeo" } ], "scattergl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattergl" } ], "scattermapbox": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scattermapbox" } ], "scatterpolar": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolar" } ], "scatterpolargl": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterpolargl" } ], "scatterternary": [ { "marker": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "type": "scatterternary" } ], "surface": [ { "colorbar": { "outlinewidth": 0, "ticks": "" }, "colorscale": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "type": "surface" } ], "table": [ { "cells": { "fill": { "color": "#EBF0F8" }, "line": { "color": "white" } }, "header": { "fill": { "color": "#C8D4E3" }, "line": { "color": "white" } }, "type": "table" } ] }, "layout": { "annotationdefaults": { "arrowcolor": "#2a3f5f", "arrowhead": 0, "arrowwidth": 1 }, "autotypenumbers": "strict", "coloraxis": { "colorbar": { "outlinewidth": 0, "ticks": "" } }, "colorscale": { "diverging": [ [ 0, "#8e0152" ], [ 0.1, "#c51b7d" ], [ 0.2, "#de77ae" ], [ 0.3, "#f1b6da" ], [ 0.4, "#fde0ef" ], [ 0.5, "#f7f7f7" ], [ 0.6, "#e6f5d0" ], [ 0.7, "#b8e186" ], [ 0.8, "#7fbc41" ], [ 0.9, "#4d9221" ], [ 1, "#276419" ] ], "sequential": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ], "sequentialminus": [ [ 0, "#0d0887" ], [ 0.1111111111111111, "#46039f" ], [ 0.2222222222222222, "#7201a8" ], [ 0.3333333333333333, "#9c179e" ], [ 0.4444444444444444, "#bd3786" ], [ 0.5555555555555556, "#d8576b" ], [ 0.6666666666666666, "#ed7953" ], [ 0.7777777777777778, "#fb9f3a" ], [ 0.8888888888888888, "#fdca26" ], [ 1, "#f0f921" ] ] }, "colorway": [ "#636efa", "#EF553B", "#00cc96", "#ab63fa", "#FFA15A", "#19d3f3", "#FF6692", "#B6E880", "#FF97FF", "#FECB52" ], "font": { "color": "#2a3f5f" }, "geo": { "bgcolor": "white", "lakecolor": "white", "landcolor": "#E5ECF6", "showlakes": true, "showland": true, "subunitcolor": "white" }, "hoverlabel": { "align": "left" }, "hovermode": "closest", "mapbox": { "style": "light" }, "paper_bgcolor": "white", "plot_bgcolor": "#E5ECF6", "polar": { "angularaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "radialaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "scene": { "xaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "yaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" }, "zaxis": { "backgroundcolor": "#E5ECF6", "gridcolor": "white", "gridwidth": 2, "linecolor": "white", "showbackground": true, "ticks": "", "zerolinecolor": "white" } }, "shapedefaults": { "line": { "color": "#2a3f5f" } }, "ternary": { "aaxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "baxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" }, "bgcolor": "#E5ECF6", "caxis": { "gridcolor": "white", "linecolor": "white", "ticks": "" } }, "title": { "x": 0.05 }, "xaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 }, "yaxis": { "automargin": true, "gridcolor": "white", "linecolor": "white", "ticks": "", "title": { "standoff": 15 }, "zerolinecolor": "white", "zerolinewidth": 2 } } }, "title": { "text": "linear_chirp" }, "xaxis": { "anchor": "y", "domain": [ 0, 1 ], "title": { "text": "SNRin (dB)" } }, "yaxis": { "anchor": "x", "domain": [ 0, 1 ], "title": { "text": "QRF" } } } }, "text/html": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Summary interactive plots with Plotly and a report.\n", "from plotly.offline import iplot\n", "import plotly.io as pio\n", "pio.renderers.default = \"plotly_mimetype+notebook\"\n", "interpreter = ResultsInterpreter(benchmark)\n", "figs = interpreter.get_summary_plotlys(df, bars=True,)\n", "for fig in figs:\n", " iplot(fig)\n" ] } ], "metadata": { "kernelspec": { "display_name": ".venv", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.2" } }, "nbformat": 4, "nbformat_minor": 5 }