{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# `mcsm-benchs`: Creating benchmarks of MCS Methods\n", "\n", "We introduce a public, open-source, Python-based toolbox for benchmarking multi-component signal analysis methods, implemented either in Python or Matlab.\n", "\n", "The goal of this toolbox is providing the signal-processing community with a common framework that allows researcher-independent comparisons between methods and favors reproducible research.\n", "\n", "With the purpose of making this toolbox more useful, the methods to compare, the tests, the signal generation code and the performance evaluation functions were conceived as different modules, so that one can modify them independently. The only restriction this pose is that the methods should satisfy some requirements regarding the shape of their input and output parameters.\n", "\n", "On the one hand, the tests and the performance evaluation functions, are encapsulated in the class `Benchmark`. On the other hand, the signals used in this benchmark are generated by the methods in the class `SignalBank`.\n", "\n", "In order to compare different methods with possibly different parameters, we need to set up a few things before running the benchmark. A `Benchmark` object receives some input parameters to configure the test:\n", "- `task`: This could be `'denoising'` or `'detection'`,`'component_denoising'` or `'inst_frequency'`. The first one compute the quality reconstruction factor (QRF) using the output of the method, whereas the second simply consist in detecting whether a signal is present or not. Finally, `'component_denoising'` compares the QRF component wise, and '`inst_frequency'` computes the mean squared error between estimations of the instantaneous frequency\n", "- `N`: The length of the simulation, i.e. how many samples should the signals have.\n", "- `methods`: A dictionary of methods. Each entry of this dictionary corresponds to the function that implements each of the desired methods.\n", "- `parameters`: A dictionary of parameters. Each entry of this dictionary corresponds to iterator with positional and/or keyword arguments. In order to know which parameters should be passed to each method, the keys of this dictionary should be the same as those corresponding to the individual methods in the corresponding dictionary. An example of this is showed in below.\n", "- `SNRin`: A list or tuple of values of SNR to test.\n", "- `repetitions`: The number of times the experiment should be repeated with different realizations of noise.\n", "- `signal_ids`: A list of signal ids (corresponding to the names of the signal in the class '`SignalBank`') can be passed here in order to test the methods on those signals. Optionally, the user can pass a dictionary where each key is used as an identifier, and the corresponding value can be a numpy array with a personalized signal." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## A dummy test \n", "First let us define a dummy method for testing. Methods should receive a numpy array with shape ```(N,)``` where `N` is the number of time samples of the signal. Additionally, they can receive any number of positional or keyword arguments to allow testing different combinations of input parameters. The shape of the output depends on the task (signal denoising or detection). So the recommended signature of a method should be the following:\n", "\n", " `output = a_method(noisy_signal, *args, **kwargs) `.\n", "\n", "If one set `task='denoising'`, `output` shoud be a `(N,)` numpy array, i.e. the same shape as the input parameter `noisy_signal`, whereas if `task='detection'`, the output should be boolean (`0` or `False` for no signal, and `1` or `True` otherwise).\n", "\n", "After this, we need to create a *dictionary of methods* to pass the `Benchmark` object at the moment of instantiation." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "from numpy import pi as pi\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 spectrogram_thresholding, get_stft" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Creating a dictionary of methods\n", "\n", "Let's create a dictionary of methods to benchmark. As as example, we will compare two strategies for spectrogram thresholding.\n", "The first one is hard thresholding, in which the thresholding function is defined as:\n", "The second one is soft thresholding, here defined as:\n", "\n", "These two approaches are implemented in the python function ```thresholding(signal, lam, fun='hard')``` function, which receives a signal to clean, a positional argument ```lam``` and a keyword argument ```fun``` that can be either ```hard``` or ```soft```.\n", " \n", "Our dictionary of methods will consist then in two methods: hard thresholding and soft thresholding.\n", "For both approaches, let's use a value of ```lam=1.0``` for now." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "\n", "def method_1(noisy_signal, *args, **kwargs):\n", " # If additional input parameters are needed, they can be passed in a tuple using \n", " # *args or **kwargs and then parsed.\n", " xr = spectrogram_thresholding(noisy_signal,1.0,fun='hard')\n", " return xr\n", "\n", "def method_2(noisy_signal, *args, **kwargs):\n", " # If additional input parameters are needed, they can be passed in a tuple using \n", " # *args or **kwargs and then parsed.\n", " xr = spectrogram_thresholding(noisy_signal,2.0,fun='soft') \n", " return xr\n", "\n", "# Create a dictionary of the methods to test.\n", "my_methods = {\n", " 'Method 1': method_1, \n", " 'Method 2': method_2,\n", " }" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The variable `params` in the example above allows us to pass some parameters to our method. This would be useful for testing a single method with several combination of input parameters. In order to do this, we should give the `Benchmark` object a *dictionary of parameters*. An example of this functionality is showed in the next section. For now, lets set the input parameter `parameters = None`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we are ready to instantiate a `Benchmark` object and run a test using the proposed methods and parameters. The benchmark constructor receives a name of a task (which defines the performance function of the test), a dictionary of the methods to test, the desired length of the signals used in the simulation, a dictionary of different parameters that should be passed to the methods, an array with different values of SNR to test, and the number of repetitions that should be used for each test. Once the object is created, use the class method `run_test()` to start the experiments.\n", "\n", "*Remark 1: You can use the ```verbosity``` parameter to show less or more messages during the progress of the experiments. There are 6 levels of verbosity, from ```verbosity=0``` (indicate just the start and the end of the experiments) to ```verbostiy = 5``` (show each method and parameter progress)*\n", "\n", "*Remark 2: Parallelize the experiments is also possible by passing the parameter ```parallelize = True```.*" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Method run_test() will be deprecated in newer versions. Use run() instead.\n", "Running benchmark...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 2/2 [00:00<00:00, 2.17it/s]\n", "100%|██████████| 2/2 [00:00<00:00, 2.19it/s]\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "benchmark = Benchmark(task = 'denoising',\n", " methods = my_methods,\n", " N = 256, \n", " SNRin = [10,20], \n", " repetitions = 1000,\n", " signal_ids=['LinearChirp', 'CosChirp',],\n", " verbosity=0, \n", " parallelize=False)\n", " \n", "benchmark.run_test() # Run the test. my_results is a dictionary with the results for each of the variables of the simulation.\n", "benchmark.save_to_file('saved_benchmark') # Save the benchmark to a file." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "same_benchmark = Benchmark.load_benchmark('saved_benchmark') # Load the benchmark from a file." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we have the results of the test in a nested dictionary called `my_results`. In order to get the results in a human-readable way using a `DataFrame`, and also for further analysis and reproducibility, we can use the class method `get_results_as_df()`." ] }, { "cell_type": "code", "execution_count": 8, "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": "10", "rawType": "float64", "type": "float" }, { "name": "20", "rawType": "float64", "type": "float" } ], "conversionMethod": "pd.DataFrame", "ref": "ae3b3c8c-34f0-457b-bc25-fd7cdf928093", "rows": [ [ "2000", "Method 1", "((), {})", "CosChirp", "0", "11.886835659114459", "22.37715108264989" ], [ "2001", "Method 1", "((), {})", "CosChirp", "1", "12.722812880140566", "22.764551803585363" ], [ "2002", "Method 1", "((), {})", "CosChirp", "2", "12.397019845144467", "22.36957426399826" ], [ "2003", "Method 1", "((), {})", "CosChirp", "3", "11.548921986599542", "22.221890113454723" ], [ "2004", "Method 1", "((), {})", "CosChirp", "4", "12.083445022222206", "22.151974820017728" ], [ "2005", "Method 1", "((), {})", "CosChirp", "5", "11.539915499209435", "22.53463399279379" ], [ "2006", "Method 1", "((), {})", "CosChirp", "6", "11.770607241799407", "21.407158778601953" ], [ "2007", "Method 1", "((), {})", "CosChirp", "7", "12.000421885788935", "22.195617040199814" ], [ "2008", "Method 1", "((), {})", "CosChirp", "8", "12.652924550241874", "21.951620063076483" ], [ "2009", "Method 1", "((), {})", "CosChirp", "9", "11.817618948427782", "21.88709345740556" ], [ "2010", "Method 1", "((), {})", "CosChirp", "10", "11.900853230162847", "21.977302024204427" ], [ "2011", "Method 1", "((), {})", "CosChirp", "11", "11.001221186309408", "21.35456323414907" ], [ "2012", "Method 1", "((), {})", "CosChirp", "12", "12.907874381154327", "21.957742911019867" ], [ "2013", "Method 1", "((), {})", "CosChirp", "13", "12.255905772305237", "21.983145390884744" ], [ "2014", "Method 1", "((), {})", "CosChirp", "14", "11.957253776232415", "21.674801583988533" ], [ "2015", "Method 1", "((), {})", "CosChirp", "15", "12.440681429480485", "22.41920624855024" ], [ "2016", "Method 1", "((), {})", "CosChirp", "16", "12.753937824574304", "22.37677643772023" ], [ "2017", "Method 1", "((), {})", "CosChirp", "17", "12.188847336244805", "22.456816318445924" ], [ "2018", "Method 1", "((), {})", "CosChirp", "18", "11.61633170042943", "21.38442048453278" ], [ "2019", "Method 1", "((), {})", "CosChirp", "19", "11.29460659033149", "21.617649342457348" ], [ "2020", "Method 1", "((), {})", "CosChirp", "20", "11.878664288767396", "21.949846904186717" ], [ "2021", "Method 1", "((), {})", "CosChirp", "21", "12.227231021522567", "22.16163076673108" ], [ "2022", "Method 1", "((), {})", "CosChirp", "22", "12.328159171861113", "21.810523267392924" ], [ "2023", "Method 1", "((), {})", "CosChirp", "23", "11.830928625729907", "22.043764377267667" ], [ "2024", "Method 1", "((), {})", "CosChirp", "24", "11.757553405878731", "22.086809518009606" ], [ "2025", "Method 1", "((), {})", "CosChirp", "25", "11.602778809406269", "22.162922728620664" ], [ "2026", "Method 1", "((), {})", "CosChirp", "26", "11.322351315128136", "21.229056573057733" ], [ "2027", "Method 1", "((), {})", "CosChirp", "27", "11.675910164139932", "21.705963888256747" ], [ "2028", "Method 1", "((), {})", "CosChirp", "28", "12.18074812360398", "21.468522364267073" ], [ "2029", "Method 1", "((), {})", "CosChirp", "29", "11.566105566657379", "22.51018186552017" ], [ "2030", "Method 1", "((), {})", "CosChirp", "30", "11.809897470131347", "21.943586972996563" ], [ "2031", "Method 1", "((), {})", "CosChirp", "31", "12.414582697613046", "22.23237944545984" ], [ "2032", "Method 1", "((), {})", "CosChirp", "32", "11.842205096048755", "21.8652492247759" ], [ "2033", "Method 1", "((), {})", "CosChirp", "33", "11.819630726493067", "22.317041509046298" ], [ "2034", "Method 1", "((), {})", "CosChirp", "34", "11.805780763174152", "22.167551829970776" ], [ "2035", "Method 1", "((), {})", "CosChirp", "35", "11.828109546201816", "21.91305629389603" ], [ "2036", "Method 1", "((), {})", "CosChirp", "36", "11.90839517056267", "22.852462761172365" ], [ "2037", "Method 1", "((), {})", "CosChirp", "37", "12.14548448227617", "22.38907315081512" ], [ "2038", "Method 1", "((), {})", "CosChirp", "38", "12.143874598997845", "22.10592604370714" ], [ "2039", "Method 1", "((), {})", "CosChirp", "39", "11.421471898983084", "21.69739089982094" ], [ "2040", "Method 1", "((), {})", "CosChirp", "40", "11.825547173046452", "22.010842237646063" ], [ "2041", "Method 1", "((), {})", "CosChirp", "41", "11.810841416294288", "21.746285428594998" ], [ "2042", "Method 1", "((), {})", "CosChirp", "42", "12.447061622080934", "21.73764559882136" ], [ "2043", "Method 1", "((), {})", "CosChirp", "43", "11.240800320186642", "22.14371900944532" ], [ "2044", "Method 1", "((), {})", "CosChirp", "44", "12.015941591158622", "21.774523385501507" ], [ "2045", "Method 1", "((), {})", "CosChirp", "45", "12.101558158573786", "22.66403378633359" ], [ "2046", "Method 1", "((), {})", "CosChirp", "46", "12.534344263609299", "22.24124872924367" ], [ "2047", "Method 1", "((), {})", "CosChirp", "47", "12.411271239591004", "21.9361978584311" ], [ "2048", "Method 1", "((), {})", "CosChirp", "48", "12.576631643326838", "22.208336530986283" ], [ "2049", "Method 1", "((), {})", "CosChirp", "49", "12.503972921230329", "21.93850644154994" ] ], "shape": { "columns": 6, "rows": 4000 } }, "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", "
MethodParameterSignal_idRepetition1020
2000Method 1((), {})CosChirp011.88683622.377151
2001Method 1((), {})CosChirp112.72281322.764552
2002Method 1((), {})CosChirp212.39702022.369574
2003Method 1((), {})CosChirp311.54892222.221890
2004Method 1((), {})CosChirp412.08344522.151975
.....................
1995Method 2((), {})LinearChirp9956.83822617.240144
1996Method 2((), {})LinearChirp9966.71369518.924030
1997Method 2((), {})LinearChirp9976.41876718.474438
1998Method 2((), {})LinearChirp9986.71186718.170891
1999Method 2((), {})LinearChirp9997.77364019.012253
\n", "

4000 rows × 6 columns

\n", "
" ], "text/plain": [ " Method Parameter Signal_id Repetition 10 20\n", "2000 Method 1 ((), {}) CosChirp 0 11.886836 22.377151\n", "2001 Method 1 ((), {}) CosChirp 1 12.722813 22.764552\n", "2002 Method 1 ((), {}) CosChirp 2 12.397020 22.369574\n", "2003 Method 1 ((), {}) CosChirp 3 11.548922 22.221890\n", "2004 Method 1 ((), {}) CosChirp 4 12.083445 22.151975\n", "... ... ... ... ... ... ...\n", "1995 Method 2 ((), {}) LinearChirp 995 6.838226 17.240144\n", "1996 Method 2 ((), {}) LinearChirp 996 6.713695 18.924030\n", "1997 Method 2 ((), {}) LinearChirp 997 6.418767 18.474438\n", "1998 Method 2 ((), {}) LinearChirp 998 6.711867 18.170891\n", "1999 Method 2 ((), {}) LinearChirp 999 7.773640 19.012253\n", "\n", "[4000 rows x 6 columns]" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "results_df = benchmark.get_results_as_df() # This formats the results on a DataFrame\n", "results_df" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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v/LMz8/HwYMH0d/fr/Sprq7G7Nmzg3LJCAC3So9GVVWVGAwG+eSTT+T48eOydu1aMZvNPrszaGRPPfWUxMbGynfffSdnz55VjkuXLil91q1bJzabTWpra6W5uVny8/MlPz9faR/eynv33XdLW1ubfPPNNzJ16lRu5f0/rt5tJMJ8J6KxsVF0Op2Ul5dLZ2enbN++XaKiouTTTz9V+lRWVorZbJYvvvhCjhw5IitWrBhx62l2drY0NDRIXV2dzJo166bdynu14uJimTZtmrJVeteuXZKYmCgvvPCC0of5jo3H45HW1lZpbW0VAPLmm29Ka2ur/PzzzyLinzxdLpdYLBZZvXq1OBwOqaqqkqioKG6VnozeeecdsdlsotfrZcGCBXL48OFQD0kVAIx4bNu2Telz+fJlefrppyUuLk6ioqLkwQcflLNnz/o8zqlTp2T58uViNBolMTFRnn/+eenv7w/ybNThr8UL852Yr776SjIzM8VgMEhGRoZ8+OGHPu1er1e2bNkiFotFDAaDLFu2TDo6Onz6nDt3TlatWiXR0dFiMpnkscceE4/HE8xpTEput1tKS0vFZrNJZGSk3HLLLbJ582afLbjMd2z2798/4mtucXGxiPgvz/b2dlmyZIkYDAaZNm2aVFZWBmuKIiKiEbnqowyJiIiIJjne80JERESqwuKFiIiIVIXFCxEREakKixciIiJSFRYvREREpCosXoiIiEhVWLwQERGRqrB4ISIiIlVh8UJERESqwuKFiIiIVIXFCxEREakKixciIiJSlf8BslzubBBM/50AAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "sb = SignalBank(N=1024)\n", "s = sb.signal_linear_chirp()\n", "noise = np.random.randn(1024)\n", "x = Benchmark.sigmerge(s, noise, 15)\n", "\n", "xr = spectrogram_thresholding(x,1.0,'hard')\n", "\n", "fig,ax = plt.subplots(1,1)\n", "ax.plot(s,label='Original Signal')\n", "ax.plot(xr,alpha=0.5,label='Recovered Signal')\n", "ax.legend()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As we can see, the DataFrame show the results ordered by columns. The first column corresponds to the method identification, and the values are taken from the keys of the dictionary of methods. The second column enumerates the parameters used (more on this on the next section). The third column corresponds to the signal identification, using the signal identification values from the `SignalBank` class. The next column shows the number of repetition of the experiment. Finally, the remaining columns show the results obtained for the SNR values used for each experiment. Since `task = 'denoising'`, these values correspond to the QRF computed as `QRF = 10*np.log10(E(s)/E(s-sr))`, where `E(x)` is the energy of `x`, and `s` and `sr` are the noiseless signal and the reconstructed signal respectively." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Passing different parameters to the methods.\n", "It is common that a method depends on certain input parameters (thresholds, multiplicative factors, etc). Therefore, it would be useful that the tests could also be repeated with different parameters, instead of creating multiple versions of one method. We can pass an array of parameters to a method provided it parses them internally. In order to indicate the benchmark which parameters combinations should be given to each method, a dictionary of parameters can be given. \n", "\n", "Let us now create this dictionary. The parameters combinations should be given in a tuple of tuples, so that each internal tuple is passed as the additional parameter (the corresponding method, of course, should implement how to deal with the variable number of input parameters). For this to work, **the keys of this dictionary should be the same as those of the methods dictionary**. \n", "\n", "We can now see more in detail how to pass different parameters to our methods. For instance, let's consider a function that depends on two thresholds `thr1` (a positional argument) and `thr2` (a keyword argument):" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now let us create a method that wraps the previous function and then define the dictionary of methods for our benchmark. Notice that the method should distribute the parameters in the tuple `params`. " ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "def method_1(noisy_signal, *args, **kwargs):\n", " # If additional input parameters are needed, they can be passed in a tuple using \n", " # *args or **kwargs and then parsed.\n", " xr = spectrogram_thresholding(noisy_signal,*args,**kwargs)\n", " return xr\n", " # aaa = np.random.rand()\n", " # if aaa>0.5:\n", " # return True\n", " # else:\n", " # return False\n", "\n", "\n", "def method_2(noisy_signal, *args, **kwargs):\n", " # If additional input parameters are needed, they can be passed in a tuple using \n", " # *args or **kwargs and then parsed.\n", " # print(np.std(noisy_signal))\n", " xr = spectrogram_thresholding(noisy_signal,*args,**kwargs)\n", " return xr\n", " # aaa = np.random.rand()\n", " # if aaa>0.2:\n", " # return True\n", " # else:\n", " # return False\n", "\n", "# Create a dictionary of the methods to test.\n", "my_methods = {\n", " 'Method 1': method_1, \n", " 'Method 2': method_2,\n", " }" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Having done this, we can define the different combinations of parameters using the corresponding dictionary:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[((1.0,), {'fun': 'hard'}), ((2.0,), {'fun': 'hard'}), ((3.0,), {'fun': 'hard'})]\n" ] } ], "source": [ "# Create a dictionary of the different combinations of thresholds to test.\n", "# Remember the keys of this dictionary should be same as the methods dictionary.\n", "my_parameters = {\n", " 'Method 1': [((thr,),{'fun': 'hard',}) for thr in np.arange(1.0,4.0,1.0)], \n", " 'Method 2': [((thr,),{'fun': 'soft',}) for thr in np.arange(1.0,4.0,1.0)],\n", "}\n", "\n", "print(my_parameters['Method 1'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "So now we have four combinations of input parameters for `another_method()`, that will be passed one by one to the method so that all the experiments will be carried out for each of the combinations. Let us set the benchmark and run a test using this new configuration of methods and parameters. After that, we can use the `Benchmark` class method `get_results_as_df()` to obtain a table with the results as before:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Running benchmark...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████| 3/3 [00:00<00:00, 41.75it/s]\n", "100%|██████████| 3/3 [00:00<00:00, 35.88it/s]\n" ] }, { "data": { "text/plain": [ "True" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "benchmark = Benchmark(task = 'denoising',\n", " methods = my_methods,\n", " parameters=my_parameters,\n", " N = 256, \n", " SNRin = [10,20,30], \n", " repetitions = 15,\n", " signal_ids=['LinearChirp', 'CosChirp',],\n", " verbosity=0, \n", " parallelize=False,\n", " write_log=True,\n", " )\n", " \n", "benchmark.run() # Run the benchmark.\n", "benchmark.save_to_file('saved_benchmark') # Save the benchmark to a file." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "benchmark = Benchmark.load_benchmark('saved_benchmark')\n", "benchmark.log" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The experiments have been repeated for every combination of parameters, listed in the second column of the table as `Parameter`." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "results_df = benchmark.get_results_as_df() # This formats the results on a DataFrame" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Generating plots with the Results Interpreter." ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "True" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Summary interactive plots with Plotly and a report.\n", "from plotly.offline import iplot\n", "interpreter = ResultsInterpreter(benchmark)\n", "interpreter.save_report(bars=True)\n" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "application/vnd.plotly.v1+json": { "config": { "linkText": "Export to plot.ly", "plotlyServerURL": "https://plot.ly", "showLink": false }, "data": [ { "alignmentgroup": "True", "error_x": { "array": [ "10", "20", "30" ] }, "error_y": { "array": [ 0.25533525339526264, 0.25532646139948056, 0.1781895750595055 ], "arrayminus": [ 0.24328108266999138, 0.22054015818010697, 0.21844332126035937 ] }, "hovertemplate": "Method + Param=Method 1((1.0,), {'fun': 'hard'})
SNRin=%{x}
QRF=%{y}", "legendgroup": "Method 1((1.0,), {'fun': 'hard'})", "marker": { "color": "#636efa", "pattern": { "shape": "" } }, "name": "Method 1((1.0,), {'fun': 'hard'})", "offsetgroup": "Method 1((1.0,), {'fun': 'hard'})", "orientation": "v", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ "10", "20", "30" ], "xaxis": "x", "y": [ 12.022224168060417, 22.366005275803822, 32.037044553468625 ], "yaxis": "y" }, { "alignmentgroup": "True", "error_x": { "array": [ "10", "20", "30" ] }, "error_y": { "array": [ 0.3880843614922078, 0.22204255688673058, 0.3439594283095815 ], "arrayminus": [ 0.45461206472486637, 0.22583701710987825, 0.3629904172291383 ] }, "hovertemplate": "Method + Param=Method 1((2.0,), {'fun': 'hard'})
SNRin=%{x}
QRF=%{y}", "legendgroup": "Method 1((2.0,), {'fun': 'hard'})", "marker": { "color": "#EF553B", "pattern": { "shape": "" } }, "name": "Method 1((2.0,), {'fun': 'hard'})", "offsetgroup": "Method 1((2.0,), {'fun': 'hard'})", "orientation": "v", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ "10", "20", "30" ], "xaxis": "x", "y": [ 11.809151767133331, 21.88482023930906, 31.286164876812563 ], "yaxis": "y" }, { "alignmentgroup": "True", "error_x": { "array": [ "10", "20", "30" ] }, "error_y": { "array": [ 0.6795066716361271, 0.4081097977582573, 0.3699560370633286 ], "arrayminus": [ 0.7980219765142662, 0.45582842730627604, 0.40144849473875155 ] }, "hovertemplate": "Method + Param=Method 1((3.0,), {'fun': 'hard'})
SNRin=%{x}
QRF=%{y}", "legendgroup": "Method 1((3.0,), {'fun': 'hard'})", "marker": { "color": "#00cc96", "pattern": { "shape": "" } }, "name": "Method 1((3.0,), {'fun': 'hard'})", "offsetgroup": "Method 1((3.0,), {'fun': 'hard'})", "orientation": "v", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ "10", "20", "30" ], "xaxis": "x", "y": [ 7.631642437132938, 20.18689647133827, 29.64186767304994 ], "yaxis": "y" }, { "alignmentgroup": "True", "error_x": { "array": [ "10", "20", "30" ] }, "error_y": { "array": [ 0.35523276540930837, 0.3236442764990173, 0.32131332674209645 ], "arrayminus": [ 0.42818561210567907, 0.337393624116185, 0.32659588399754824 ] }, "hovertemplate": "Method + Param=Method 2((1.0,), {'fun': 'soft'})
SNRin=%{x}
QRF=%{y}", "legendgroup": "Method 2((1.0,), {'fun': 'soft'})", "marker": { "color": "#ab63fa", "pattern": { "shape": "" } }, "name": "Method 2((1.0,), {'fun': 'soft'})", "offsetgroup": "Method 2((1.0,), {'fun': 'soft'})", "orientation": "v", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ "10", "20", "30" ], "xaxis": "x", "y": [ 12.433813927602749, 22.403468608411366, 31.838709903599106 ], "yaxis": "y" }, { "alignmentgroup": "True", "error_x": { "array": [ "10", "20", "30" ] }, "error_y": { "array": [ 0.5686171515637044, 0.5032318764489254, 0.3470399280468861 ], "arrayminus": [ 0.5498008038819329, 0.5271659041284451, 0.3703993951956548 ] }, "hovertemplate": "Method + Param=Method 2((2.0,), {'fun': 'soft'})
SNRin=%{x}
QRF=%{y}", "legendgroup": "Method 2((2.0,), {'fun': 'soft'})", "marker": { "color": "#FFA15A", "pattern": { "shape": "" } }, "name": "Method 2((2.0,), {'fun': 'soft'})", "offsetgroup": "Method 2((2.0,), {'fun': 'soft'})", "orientation": "v", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ "10", "20", "30" ], "xaxis": "x", "y": [ 7.449380854362533, 18.627364497570316, 28.99535931619229 ], "yaxis": "y" }, { "alignmentgroup": "True", "error_x": { "array": [ "10", "20", "30" ] }, "error_y": { "array": [ 0.46607212013737787, 0.6276696940149371, 0.337756888106032 ], "arrayminus": [ 0.43932410258376686, 0.6358555711425673, 0.40994052104286993 ] }, "hovertemplate": "Method + Param=Method 2((3.0,), {'fun': 'soft'})
SNRin=%{x}
QRF=%{y}", "legendgroup": "Method 2((3.0,), {'fun': 'soft'})", "marker": { "color": "#19d3f3", "pattern": { "shape": "" } }, "name": "Method 2((3.0,), {'fun': 'soft'})", "offsetgroup": "Method 2((3.0,), {'fun': 'soft'})", "orientation": "v", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ "10", "20", "30" ], "xaxis": "x", "y": [ 3.243596411989266, 14.038663200896034, 25.22933081419232 ], "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": "LinearChirp" }, "xaxis": { "anchor": "y", "domain": [ 0, 1 ], "title": { "text": "SNRin (dB)" } }, "yaxis": { "anchor": "x", "domain": [ 0, 1 ], "title": { "text": "QRF" } } } } }, "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": [ "10", "20", "30" ] }, "error_y": { "array": [ 0.33210337783922306, 0.24289563239050338, 0.2671600184934597 ], "arrayminus": [ 0.33097292880088247, 0.25683446260032383, 0.29942744914319164 ] }, "hovertemplate": "Method + Param=Method 1((1.0,), {'fun': 'hard'})
SNRin=%{x}
QRF=%{y}", "legendgroup": "Method 1((1.0,), {'fun': 'hard'})", "marker": { "color": "#636efa", "pattern": { "shape": "" } }, "name": "Method 1((1.0,), {'fun': 'hard'})", "offsetgroup": "Method 1((1.0,), {'fun': 'hard'})", "orientation": "v", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ "10", "20", "30" ], "xaxis": "x", "y": [ 12.02957545765686, 22.053921370668675, 30.90670006671201 ], "yaxis": "y" }, { "alignmentgroup": "True", "error_x": { "array": [ "10", "20", "30" ] }, "error_y": { "array": [ 0.36474534057151153, 0.36511071672864404, 0.5679254748475948 ], "arrayminus": [ 0.42143107230137034, 0.34730927418271307, 0.5784789002431019 ] }, "hovertemplate": "Method + Param=Method 1((2.0,), {'fun': 'hard'})
SNRin=%{x}
QRF=%{y}", "legendgroup": "Method 1((2.0,), {'fun': 'hard'})", "marker": { "color": "#EF553B", "pattern": { "shape": "" } }, "name": "Method 1((2.0,), {'fun': 'hard'})", "offsetgroup": "Method 1((2.0,), {'fun': 'hard'})", "orientation": "v", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ "10", "20", "30" ], "xaxis": "x", "y": [ 10.835101294749974, 20.189253828878567, 26.87102062802125 ], "yaxis": "y" }, { "alignmentgroup": "True", "error_x": { "array": [ "10", "20", "30" ] }, "error_y": { "array": [ 0.7063570269797008, 0.7167146478664073, 0.7625076182571533 ], "arrayminus": [ 0.8035321168830478, 0.7103027957130283, 0.6574205060006051 ] }, "hovertemplate": "Method + Param=Method 1((3.0,), {'fun': 'hard'})
SNRin=%{x}
QRF=%{y}", "legendgroup": "Method 1((3.0,), {'fun': 'hard'})", "marker": { "color": "#00cc96", "pattern": { "shape": "" } }, "name": "Method 1((3.0,), {'fun': 'hard'})", "offsetgroup": "Method 1((3.0,), {'fun': 'hard'})", "orientation": "v", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ "10", "20", "30" ], "xaxis": "x", "y": [ 7.044797485839855, 16.25730556830558, 22.411103417410345 ], "yaxis": "y" }, { "alignmentgroup": "True", "error_x": { "array": [ "10", "20", "30" ] }, "error_y": { "array": [ 0.3299345178584634, 0.33628156487533545, 0.45340603749250263 ], "arrayminus": [ 0.3426345189398461, 0.3445959547065911, 0.48339213510338297 ] }, "hovertemplate": "Method + Param=Method 2((1.0,), {'fun': 'soft'})
SNRin=%{x}
QRF=%{y}", "legendgroup": "Method 2((1.0,), {'fun': 'soft'})", "marker": { "color": "#ab63fa", "pattern": { "shape": "" } }, "name": "Method 2((1.0,), {'fun': 'soft'})", "offsetgroup": "Method 2((1.0,), {'fun': 'soft'})", "orientation": "v", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ "10", "20", "30" ], "xaxis": "x", "y": [ 12.082972056073094, 21.224288689432885, 28.448388275204003 ], "yaxis": "y" }, { "alignmentgroup": "True", "error_x": { "array": [ "10", "20", "30" ] }, "error_y": { "array": [ 0.4187736544768068, 0.6379221104439203, 0.7257333797543097 ], "arrayminus": [ 0.4355373541672476, 0.6108999343464774, 0.6763546704056651 ] }, "hovertemplate": "Method + Param=Method 2((2.0,), {'fun': 'soft'})
SNRin=%{x}
QRF=%{y}", "legendgroup": "Method 2((2.0,), {'fun': 'soft'})", "marker": { "color": "#FFA15A", "pattern": { "shape": "" } }, "name": "Method 2((2.0,), {'fun': 'soft'})", "offsetgroup": "Method 2((2.0,), {'fun': 'soft'})", "orientation": "v", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ "10", "20", "30" ], "xaxis": "x", "y": [ 6.866140917562047, 15.059095758802375, 20.92931002059847 ], "yaxis": "y" }, { "alignmentgroup": "True", "error_x": { "array": [ "10", "20", "30" ] }, "error_y": { "array": [ 0.404204520160623, 0.5903476013739599, 0.7034293647919707 ], "arrayminus": [ 0.3619457469753047, 0.5553824557930742, 0.6386410696752112 ] }, "hovertemplate": "Method + Param=Method 2((3.0,), {'fun': 'soft'})
SNRin=%{x}
QRF=%{y}", "legendgroup": "Method 2((3.0,), {'fun': 'soft'})", "marker": { "color": "#19d3f3", "pattern": { "shape": "" } }, "name": "Method 2((3.0,), {'fun': 'soft'})", "offsetgroup": "Method 2((3.0,), {'fun': 'soft'})", "orientation": "v", "showlegend": true, "textposition": "auto", "type": "bar", "x": [ "10", "20", "30" ], "xaxis": "x", "y": [ 3.3516456312953684, 10.325406677006223, 15.779133319069627 ], "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": "CosChirp" }, "xaxis": { "anchor": "y", "domain": [ 0, 1 ], "title": { "text": "SNRin (dB)" } }, "yaxis": { "anchor": "x", "domain": [ 0, 1 ], "title": { "text": "QRF" } } } } }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\n", "figs = interpreter.get_summary_plotlys(bars=True)\n", "for fig in figs:\n", " iplot(fig)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Checking elapsed time for each method" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "data": { "application/vnd.microsoft.datawrangler.viewer.v0+json": { "columns": [ { "name": "index", "rawType": "object", "type": "string" }, { "name": "Average time (s)", "rawType": "float64", "type": "float" }, { "name": "Std", "rawType": "float64", "type": "float" } ], "conversionMethod": "pd.DataFrame", "ref": "309d901b-828c-479a-8bb4-82276c21353f", "rows": [ [ "CosChirp-Method 1-((1.0,), {'fun': 'hard'})", "0.0002520402272542318", "0.0001057813151042305" ], [ "CosChirp-Method 1-((2.0,), {'fun': 'hard'})", "0.0001957416534423828", "1.4846159835194904e-05" ], [ "CosChirp-Method 1-((3.0,), {'fun': 'hard'})", "0.00019838015238444012", "1.8728527645949236e-05" ], [ "CosChirp-Method 2-((1.0,), {'fun': 'soft'})", "0.00020702679951985678", "1.5257712829570458e-05" ], [ "CosChirp-Method 2-((2.0,), {'fun': 'soft'})", "0.0001777331034342448", "6.846041416884378e-06" ], [ "CosChirp-Method 2-((3.0,), {'fun': 'soft'})", "0.000252691904703776", "2.4388852033917898e-05" ], [ "LinearChirp-Method 1-((1.0,), {'fun': 'hard'})", "0.00016884803771972657", "1.4946442785742649e-05" ], [ "LinearChirp-Method 1-((2.0,), {'fun': 'hard'})", "0.00023328463236490886", "8.734713887098984e-05" ], [ "LinearChirp-Method 1-((3.0,), {'fun': 'hard'})", "0.00022013982137044272", "5.38262820316306e-05" ], [ "LinearChirp-Method 2-((1.0,), {'fun': 'soft'})", "0.00020875930786132813", "1.4750847855365986e-05" ], [ "LinearChirp-Method 2-((2.0,), {'fun': 'soft'})", "0.0002098401387532552", "1.1094661698888454e-05" ], [ "LinearChirp-Method 2-((3.0,), {'fun': 'soft'})", "0.0002258777618408203", "3.5565339853728746e-05" ] ], "shape": { "columns": 2, "rows": 12 } }, "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", "
Average time (s)Std
CosChirp-Method 1-((1.0,), {'fun': 'hard'})0.0002520.000106
CosChirp-Method 1-((2.0,), {'fun': 'hard'})0.0001960.000015
CosChirp-Method 1-((3.0,), {'fun': 'hard'})0.0001980.000019
CosChirp-Method 2-((1.0,), {'fun': 'soft'})0.0002070.000015
CosChirp-Method 2-((2.0,), {'fun': 'soft'})0.0001780.000007
CosChirp-Method 2-((3.0,), {'fun': 'soft'})0.0002530.000024
LinearChirp-Method 1-((1.0,), {'fun': 'hard'})0.0001690.000015
LinearChirp-Method 1-((2.0,), {'fun': 'hard'})0.0002330.000087
LinearChirp-Method 1-((3.0,), {'fun': 'hard'})0.0002200.000054
LinearChirp-Method 2-((1.0,), {'fun': 'soft'})0.0002090.000015
LinearChirp-Method 2-((2.0,), {'fun': 'soft'})0.0002100.000011
LinearChirp-Method 2-((3.0,), {'fun': 'soft'})0.0002260.000036
\n", "
" ], "text/plain": [ " Average time (s) Std\n", "CosChirp-Method 1-((1.0,), {'fun': 'hard'}) 0.000252 0.000106\n", "CosChirp-Method 1-((2.0,), {'fun': 'hard'}) 0.000196 0.000015\n", "CosChirp-Method 1-((3.0,), {'fun': 'hard'}) 0.000198 0.000019\n", "CosChirp-Method 2-((1.0,), {'fun': 'soft'}) 0.000207 0.000015\n", "CosChirp-Method 2-((2.0,), {'fun': 'soft'}) 0.000178 0.000007\n", "CosChirp-Method 2-((3.0,), {'fun': 'soft'}) 0.000253 0.000024\n", "LinearChirp-Method 1-((1.0,), {'fun': 'hard'}) 0.000169 0.000015\n", "LinearChirp-Method 1-((2.0,), {'fun': 'hard'}) 0.000233 0.000087\n", "LinearChirp-Method 1-((3.0,), {'fun': 'hard'}) 0.000220 0.000054\n", "LinearChirp-Method 2-((1.0,), {'fun': 'soft'}) 0.000209 0.000015\n", "LinearChirp-Method 2-((2.0,), {'fun': 'soft'}) 0.000210 0.000011\n", "LinearChirp-Method 2-((3.0,), {'fun': 'soft'}) 0.000226 0.000036" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df = interpreter.elapsed_time_summary()\n", "df" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "application/vnd.microsoft.datawrangler.viewer.v0+json": { "columns": [ { "name": "index", "rawType": "int64", "type": "integer" }, { "name": "SNRin", "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": "QRF", "rawType": "float64", "type": "float" } ], "conversionMethod": "pd.DataFrame", "ref": "d836c9bd-1baa-4e76-9a55-37075e40b704", "rows": [ [ "0", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "CosChirp", "0", "11.886835659114459" ], [ "1", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "CosChirp", "1", "12.722812880140566" ], [ "2", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "CosChirp", "2", "12.397019845144467" ], [ "3", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "CosChirp", "3", "11.548921986599542" ], [ "4", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "CosChirp", "4", "12.083445022222206" ], [ "5", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "CosChirp", "5", "11.539915499209435" ], [ "6", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "CosChirp", "6", "11.770607241799407" ], [ "7", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "CosChirp", "7", "12.000421885788935" ], [ "8", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "CosChirp", "8", "12.652924550241874" ], [ "9", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "CosChirp", "9", "11.817618948427782" ], [ "10", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "CosChirp", "10", "11.900853230162847" ], [ "11", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "CosChirp", "11", "11.001221186309408" ], [ "12", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "CosChirp", "12", "12.907874381154327" ], [ "13", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "CosChirp", "13", "12.255905772305237" ], [ "14", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "CosChirp", "14", "11.957253776232415" ], [ "15", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "LinearChirp", "0", "12.20216117002511" ], [ "16", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "LinearChirp", "1", "12.76503767249529" ], [ "17", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "LinearChirp", "2", "12.237888143510068" ], [ "18", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "LinearChirp", "3", "11.742664365607958" ], [ "19", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "LinearChirp", "4", "11.495492228825377" ], [ "20", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "LinearChirp", "5", "11.873819113795907" ], [ "21", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "LinearChirp", "6", "11.409081817341889" ], [ "22", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "LinearChirp", "7", "12.493673162333586" ], [ "23", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "LinearChirp", "8", "11.915356102761711" ], [ "24", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "LinearChirp", "9", "12.305220517973723" ], [ "25", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "LinearChirp", "10", "12.258823320829029" ], [ "26", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "LinearChirp", "11", "11.685536970919193" ], [ "27", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "LinearChirp", "12", "12.17778913222083" ], [ "28", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "LinearChirp", "13", "12.115226297294965" ], [ "29", "10", "Method 1", "((1.0,), {'fun': 'hard'})", "LinearChirp", "14", "11.655592504971661" ], [ "30", "10", "Method 1", "((2.0,), {'fun': 'hard'})", "CosChirp", "0", "9.561175072630387" ], [ "31", "10", "Method 1", "((2.0,), {'fun': 'hard'})", "CosChirp", "1", "11.269130290168585" ], [ "32", "10", "Method 1", "((2.0,), {'fun': 'hard'})", "CosChirp", "2", "10.092591090099475" ], [ "33", "10", "Method 1", "((2.0,), {'fun': 'hard'})", "CosChirp", "3", "10.819378722953994" ], [ "34", "10", "Method 1", "((2.0,), {'fun': 'hard'})", "CosChirp", "4", "11.076254548847482" ], [ "35", "10", "Method 1", "((2.0,), {'fun': 'hard'})", "CosChirp", "5", "10.737653362585448" ], [ "36", "10", "Method 1", "((2.0,), {'fun': 'hard'})", "CosChirp", "6", "11.803498483011733" ], [ "37", "10", "Method 1", "((2.0,), {'fun': 'hard'})", "CosChirp", "7", "10.184236407296275" ], [ "38", "10", "Method 1", "((2.0,), {'fun': 'hard'})", "CosChirp", "8", "11.500399559587752" ], [ "39", "10", "Method 1", "((2.0,), {'fun': 'hard'})", "CosChirp", "9", "11.495303875098903" ], [ "40", "10", "Method 1", "((2.0,), {'fun': 'hard'})", "CosChirp", "10", "11.145443115617468" ], [ "41", "10", "Method 1", "((2.0,), {'fun': 'hard'})", "CosChirp", "11", "10.788586803844337" ], [ "42", "10", "Method 1", "((2.0,), {'fun': 'hard'})", "CosChirp", "12", "10.44825124512743" ], [ "43", "10", "Method 1", "((2.0,), {'fun': 'hard'})", "CosChirp", "13", "10.99206011165058" ], [ "44", "10", "Method 1", "((2.0,), {'fun': 'hard'})", "CosChirp", "14", "10.612556732729795" ], [ "45", "10", "Method 1", "((2.0,), {'fun': 'hard'})", "LinearChirp", "0", "11.098585601233754" ], [ "46", "10", "Method 1", "((2.0,), {'fun': 'hard'})", "LinearChirp", "1", "11.606211591389318" ], [ "47", "10", "Method 1", "((2.0,), {'fun': 'hard'})", "LinearChirp", "2", "12.394915937542777" ], [ "48", "10", "Method 1", "((2.0,), {'fun': 'hard'})", "LinearChirp", "3", "12.251312214520953" ], [ "49", "10", "Method 1", "((2.0,), {'fun': 'hard'})", "LinearChirp", "4", "10.595338659287169" ] ], "shape": { "columns": 6, "rows": 540 } }, "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", "
SNRinMethodParameterSignal_idRepetitionQRF
010Method 1((1.0,), {'fun': 'hard'})CosChirp011.886836
110Method 1((1.0,), {'fun': 'hard'})CosChirp112.722813
210Method 1((1.0,), {'fun': 'hard'})CosChirp212.397020
310Method 1((1.0,), {'fun': 'hard'})CosChirp311.548922
410Method 1((1.0,), {'fun': 'hard'})CosChirp412.083445
.....................
53530Method 2((3.0,), {'fun': 'soft'})LinearChirp1025.606940
53630Method 2((3.0,), {'fun': 'soft'})LinearChirp1125.779403
53730Method 2((3.0,), {'fun': 'soft'})LinearChirp1225.338387
53830Method 2((3.0,), {'fun': 'soft'})LinearChirp1323.843373
53930Method 2((3.0,), {'fun': 'soft'})LinearChirp1425.568327
\n", "

540 rows × 6 columns

\n", "
" ], "text/plain": [ " SNRin Method Parameter Signal_id Repetition \\\n", "0 10 Method 1 ((1.0,), {'fun': 'hard'}) CosChirp 0 \n", "1 10 Method 1 ((1.0,), {'fun': 'hard'}) CosChirp 1 \n", "2 10 Method 1 ((1.0,), {'fun': 'hard'}) CosChirp 2 \n", "3 10 Method 1 ((1.0,), {'fun': 'hard'}) CosChirp 3 \n", "4 10 Method 1 ((1.0,), {'fun': 'hard'}) CosChirp 4 \n", ".. ... ... ... ... ... \n", "535 30 Method 2 ((3.0,), {'fun': 'soft'}) LinearChirp 10 \n", "536 30 Method 2 ((3.0,), {'fun': 'soft'}) LinearChirp 11 \n", "537 30 Method 2 ((3.0,), {'fun': 'soft'}) LinearChirp 12 \n", "538 30 Method 2 ((3.0,), {'fun': 'soft'}) LinearChirp 13 \n", "539 30 Method 2 ((3.0,), {'fun': 'soft'}) LinearChirp 14 \n", "\n", " QRF \n", "0 11.886836 \n", "1 12.722813 \n", "2 12.397020 \n", "3 11.548922 \n", "4 12.083445 \n", ".. ... \n", "535 25.606940 \n", "536 25.779403 \n", "537 25.338387 \n", "538 23.843373 \n", "539 25.568327 \n", "\n", "[540 rows x 6 columns]" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "interpreter.rearrange_data_frame()" ] } ], "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.10.12" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }