{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "(notebooks)=\n", "\n", "# Jupyter Notebooks\n", "\n", "[NPF](https://github.com/tbarbette/npf/) can generate a Jupyter Notebook that contains code to plot graphs from the data of the experiments. This is a great starting point for your final graphs, or to adjust the output to your likings. Instead of playing with the settings of NPF, this allows you to configure your graphs in _Python_. The resulting notebook is adapted from a _Jinja_ template, depending on the type of graph that has to be generated.\n", "\n", "## Command line parameters\n", "\n", "NPF takes multiple command line parameters to generate the ready-to-tweak Jupyter notebook.\n", "\n", "| parameter | description |\n", "| ------------------------------------------------ | ------------------------------------------------------------ |\n", "| [`--notebook ` / `--nb `](#notebook) | Generate a Jupyter Notebook at the provided path. |\n", "| [`--update-nb`](#update) | Replace only the data if a notebook already exists. |\n", "| [`--force-nb`](#force) | Overwrite the file if a notebook already exists. |\n", "| [`--disable-nb-exec`](#exec) | Prevent the generated notebook from being executed. |\n", "| [`--template-nb `](#template) | Use a custom Jupyter Notebook as template. |\n", "| [`--nb-kernel `](#kernel) | Specify which kernel should be used to execute the notebook. |\n", "\n", "(notebook)=\n", "\n", "### `--notebook ` / `--nb `\n", "\n", "Main argument to generate a notebook by providing the desired output path. A new _\\*.ipynb_ file will be created but if one exists, the user gets prompted to know if it should be kept or overwritten (answer by typing _yes_ or _no_). The default action can be configured with [`--update-nb`](#update), or [`--force-nb`](#force).\n", "\n", "(update)=\n", "\n", "### `--update-nb`\n", "\n", "This option defines the behavior when the provided path for the notebook points to an existing notebook. Instead of asking what to do, NPF will try to replace the data in the notebook with the most recent measurements. This is done, by replacing the cells that have the _data_ tag with `data = [...]` where `[...]` contains the results. No code will be lost, as long as no changes were made to any cell that has the _data_ tag.\n", "\n", "(force)=\n", "\n", "### `--force-nb`\n", "\n", "This option defines the behavior when the provided path for the notebook points to an existing notebook. This is a way to force NPF to overwrite the existing file with a newly created one. Changes made to the existing file will be lost forever with this operation. Make sure the file doesn't contain any important changes.\n", "\n", ":::{warning}\n", "Any existing notebook at the given path will be overwritten and data may be lost.\n", ":::\n", "\n", "(exec)=\n", "\n", "### `--disable-nb-exec`\n", "\n", "By default, the generated notebook gets executed making it ready for analysis by providing cell outputs and displaying graphs. This behavior can be disabled using this parameter. The resulting notebook now has to be executed by the user.\n", "\n", "(template)=\n", "\n", "### `--template-nb `\n", "\n", "A template is used and converted into the final notebook generated by NPF. This template contains code for many types of graphs. With this parameter, you can provide a new template that will be used instead. The default path is located in the NPF project at [_npf/types/notebook/template.ipynb_](https://github.com/tbarbette/npf/blob/main/npf/output/notebook/template.ipynb) and this file can be used as starter for a custom one.\n", "\n", "When creating a template, you are free to add whatever you like to it. Certain measures are required for a good processing of the template by NPF. The metadata tags of each cell are used to specify the cells that should be kept to plot a certain type of graph. Here is the list of string tags that get recognized by NPF : _all_, _data_, _line_, _simple_bar_, _barh_, _boxplot_, _cdf_, and _heatmap_. The _all_ tag will keep the cell whatever the chosen graph type is, and the _data_ tag identifies the cell that should only contain the data in `data = [...]` format (if the [`--update-nb`](#update) option is used, any other content of this cell will be erased).\n", "\n", "[Jinja](https://jinja.palletsprojects.com) templating can be used to add some logic depending on the input data. Variables placed between double curly brackets (e.g., `{{ name }}`) get replaced by the corresponding values. Here's a list of the variables that are accessible inside the template:\n", "\n", "| variable | type | description |\n", "| --------- | ---------- | ---------------------------------------------------------------------------- |\n", "| name | str | The title of the experiment. |\n", "| var_names | dict | Dictionary of variables and their pretty name. |\n", "| x_vars | list[str] | X-axis variables. |\n", "| x_names | list[str] | X-axis variables' pretty names. |\n", "| y_vars | list[str] | Y-axis variables. |\n", "| y_names | list[str] | Y-axis variables' pretty names. |\n", "| data | list[dict] | Experiment measurements in a Pandas dataframe format. |\n", "| dir_name | str | Output directory of the notebook (e.g., _npf/result_notebooks_). |\n", "| file_path | str | Path of the file with no extension (e.g., _npf/result_notebooks/iperf2_nb_). |\n", "| file_name | str | Name of the file with no extension (e.g., _iperf2_nb_). |\n", "\n", "(kernel)=\n", "\n", "### `--nb-kernel `\n", "\n", "By default, the produced notebook gets executed (can be changed with [`--disable-nb-exec`](#exec)). The kernel used for the execution is by default, set to _python3_, but with this option you can specify the one that should be used.\n", "\n", "## How to generate a notebook\n", "\n", "When running NPF, set the `--notebook ` parameter where `` is the path for the \\*_.ipynb_ file. The created notebook contains code to plot simple graphs that can be adapted manually and also the data of the experiment. This code depends on the graph type which can be forced using `--config graph_type=` where `` can be _line_, _simple_bar_, _barh_ (horizontal bar), _boxplot_, _cdf_, or _heatmap_.\n", "\n", "The following [Jupyter Notebook](#example) can be obtained by running the example _iperf_ test of NPF with the following command:\n", "\n", "```\n", "npf --test tests/tcp/01-iperf.npf --notebook iperf-nb.ipynb --config graph_type=bar\n", "```\n", "\n", "Once the experiment data has been collected by NPF, the notebook will be created and saved at the provided file path.\n", "\n", "---\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "(example)=\n", "\n", "## Example notebook of IPerf 2 Throughput Experiment\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "execution": { "iopub.execute_input": "2024-08-26T16:11:22.509766Z", "iopub.status.busy": "2024-08-26T16:11:22.506171Z", "iopub.status.idle": "2024-08-26T16:11:22.595128Z", "shell.execute_reply": "2024-08-26T16:11:22.593336Z" }, "tags": [ "data" ] }, "outputs": [], "source": [ "data = [{\"build\": \"2.0.9\", \"test_index\": 0, \"PARALLEL\": 1, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 15461882265.6, \"run_index\": 0}, {\"build\": \"2.0.9\", \"test_index\": 0, \"PARALLEL\": 1, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 15461882265.6, \"run_index\": 1}, {\"build\": \"2.0.9\", \"test_index\": 0, \"PARALLEL\": 1, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 15247133900.8, \"run_index\": 2}, {\"build\": \"2.0.9\", \"test_index\": 0, \"PARALLEL\": 1, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 15139759718.4, \"run_index\": 3}, {\"build\": \"2.0.9\", \"test_index\": 0, \"PARALLEL\": 1, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 16106127360.0, \"run_index\": 4}, {\"build\": \"2.0.9\", \"test_index\": 1, \"PARALLEL\": 2, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 27165668147.2, \"run_index\": 0}, {\"build\": \"2.0.9\", \"test_index\": 1, \"PARALLEL\": 2, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 24588687769.6, \"run_index\": 1}, {\"build\": \"2.0.9\", \"test_index\": 1, \"PARALLEL\": 2, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 24803436134.4, \"run_index\": 2}, {\"build\": \"2.0.9\", \"test_index\": 1, \"PARALLEL\": 2, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 25232932864.0, \"run_index\": 3}, {\"build\": \"2.0.9\", \"test_index\": 1, \"PARALLEL\": 2, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 26628797235.2, \"run_index\": 4}, {\"build\": \"2.0.9\", \"test_index\": 2, \"PARALLEL\": 3, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 32641751449.6, \"run_index\": 0}, {\"build\": \"2.0.9\", \"test_index\": 2, \"PARALLEL\": 3, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 33393370726.4, \"run_index\": 1}, {\"build\": \"2.0.9\", \"test_index\": 2, \"PARALLEL\": 3, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 32963873996.8, \"run_index\": 2}, {\"build\": \"2.0.9\", \"test_index\": 2, \"PARALLEL\": 3, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 33071248179.2, \"run_index\": 3}, {\"build\": \"2.0.9\", \"test_index\": 2, \"PARALLEL\": 3, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 33178622361.6, \"run_index\": 4}, {\"build\": \"2.0.9\", \"test_index\": 3, \"PARALLEL\": 4, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 41124311859.2, \"run_index\": 0}, {\"build\": \"2.0.9\", \"test_index\": 3, \"PARALLEL\": 4, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 39513699123.2, \"run_index\": 1}, {\"build\": \"2.0.9\", \"test_index\": 3, \"PARALLEL\": 4, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 42949672960.0, \"run_index\": 2}, {\"build\": \"2.0.9\", \"test_index\": 3, \"PARALLEL\": 4, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 43916040601.6, \"run_index\": 3}, {\"build\": \"2.0.9\", \"test_index\": 3, \"PARALLEL\": 4, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 45097156608.0, \"run_index\": 4}, {\"build\": \"2.0.9\", \"test_index\": 4, \"PARALLEL\": 5, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 46922517708.8, \"run_index\": 0}, {\"build\": \"2.0.9\", \"test_index\": 4, \"PARALLEL\": 5, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 49606872268.8, \"run_index\": 1}, {\"build\": \"2.0.9\", \"test_index\": 4, \"PARALLEL\": 5, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 50573239910.4, \"run_index\": 2}, {\"build\": \"2.0.9\", \"test_index\": 4, \"PARALLEL\": 5, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 52398601011.2, \"run_index\": 3}, {\"build\": \"2.0.9\", \"test_index\": 4, \"PARALLEL\": 5, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 56693568307.2, \"run_index\": 4}, {\"build\": \"2.0.9\", \"test_index\": 5, \"PARALLEL\": 6, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 77953656422.4, \"run_index\": 0}, {\"build\": \"2.0.9\", \"test_index\": 5, \"PARALLEL\": 6, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 78275778969.6, \"run_index\": 1}, {\"build\": \"2.0.9\", \"test_index\": 5, \"PARALLEL\": 6, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 79349520793.6, \"run_index\": 2}, {\"build\": \"2.0.9\", \"test_index\": 5, \"PARALLEL\": 6, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 81604378624.0, \"run_index\": 3}, {\"build\": \"2.0.9\", \"test_index\": 5, \"PARALLEL\": 6, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 81926501171.2, \"run_index\": 4}, {\"build\": \"2.0.9\", \"test_index\": 6, \"PARALLEL\": 7, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 127775277056.0, \"run_index\": 0}, {\"build\": \"2.0.9\", \"test_index\": 6, \"PARALLEL\": 7, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 120259084288.0, \"run_index\": 1}, {\"build\": \"2.0.9\", \"test_index\": 6, \"PARALLEL\": 7, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 132070244352.0, \"run_index\": 2}, {\"build\": \"2.0.9\", \"test_index\": 6, \"PARALLEL\": 7, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 129922760704.0, \"run_index\": 3}, {\"build\": \"2.0.9\", \"test_index\": 6, \"PARALLEL\": 7, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 126701535232.0, \"run_index\": 4}, {\"build\": \"2.0.9\", \"test_index\": 7, \"PARALLEL\": 8, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 141733920768.0, \"run_index\": 0}, {\"build\": \"2.0.9\", \"test_index\": 7, \"PARALLEL\": 8, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 136365211648.0, \"run_index\": 1}, {\"build\": \"2.0.9\", \"test_index\": 7, \"PARALLEL\": 8, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 141733920768.0, \"run_index\": 2}, {\"build\": \"2.0.9\", \"test_index\": 7, \"PARALLEL\": 8, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 151397597184.0, \"run_index\": 3}, {\"build\": \"2.0.9\", \"test_index\": 7, \"PARALLEL\": 8, \"WINDOW\": 64, \"TIME\": 2, \"THROUGHPUT\": 147102629888.0, \"run_index\": 4}, {\"build\": \"2.0.9\", \"test_index\": 8, \"PARALLEL\": 1, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 61418032332.8, \"run_index\": 0}, {\"build\": \"2.0.9\", \"test_index\": 8, \"PARALLEL\": 1, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 54760833024.0, \"run_index\": 1}, {\"build\": \"2.0.9\", \"test_index\": 8, \"PARALLEL\": 1, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 61418032332.8, \"run_index\": 2}, {\"build\": \"2.0.9\", \"test_index\": 8, \"PARALLEL\": 1, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 57552561766.4, \"run_index\": 3}, {\"build\": \"2.0.9\", \"test_index\": 8, \"PARALLEL\": 1, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 43271795507.2, \"run_index\": 4}, {\"build\": \"2.0.9\", \"test_index\": 9, \"PARALLEL\": 2, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 67430986547.2, \"run_index\": 0}, {\"build\": \"2.0.9\", \"test_index\": 9, \"PARALLEL\": 2, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 60129542144.0, \"run_index\": 1}, {\"build\": \"2.0.9\", \"test_index\": 9, \"PARALLEL\": 2, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 65283502899.2, \"run_index\": 2}, {\"build\": \"2.0.9\", \"test_index\": 9, \"PARALLEL\": 2, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 61632780697.6, \"run_index\": 3}, {\"build\": \"2.0.9\", \"test_index\": 9, \"PARALLEL\": 2, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 64854006169.6, \"run_index\": 4}, {\"build\": \"2.0.9\", \"test_index\": 10, \"PARALLEL\": 3, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 86221468467.2, \"run_index\": 0}, {\"build\": \"2.0.9\", \"test_index\": 10, \"PARALLEL\": 3, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 73443940761.6, \"run_index\": 1}, {\"build\": \"2.0.9\", \"test_index\": 10, \"PARALLEL\": 3, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 83000242995.2, \"run_index\": 2}, {\"build\": \"2.0.9\", \"test_index\": 10, \"PARALLEL\": 3, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 73121818214.4, \"run_index\": 3}, {\"build\": \"2.0.9\", \"test_index\": 10, \"PARALLEL\": 3, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 67001489817.6, \"run_index\": 4}, {\"build\": \"2.0.9\", \"test_index\": 11, \"PARALLEL\": 4, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 101039105638.4, \"run_index\": 0}, {\"build\": \"2.0.9\", \"test_index\": 11, \"PARALLEL\": 4, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 114890375168.0, \"run_index\": 1}, {\"build\": \"2.0.9\", \"test_index\": 11, \"PARALLEL\": 4, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 123480309760.0, \"run_index\": 2}, {\"build\": \"2.0.9\", \"test_index\": 11, \"PARALLEL\": 4, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 108447924224.0, \"run_index\": 3}, {\"build\": \"2.0.9\", \"test_index\": 11, \"PARALLEL\": 4, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 101039105638.4, \"run_index\": 4}, {\"build\": \"2.0.9\", \"test_index\": 12, \"PARALLEL\": 5, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 127775277056.0, \"run_index\": 0}, {\"build\": \"2.0.9\", \"test_index\": 12, \"PARALLEL\": 5, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 109521666048.0, \"run_index\": 1}, {\"build\": \"2.0.9\", \"test_index\": 12, \"PARALLEL\": 5, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 135291469824.0, \"run_index\": 2}, {\"build\": \"2.0.9\", \"test_index\": 12, \"PARALLEL\": 5, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 139586437120.0, \"run_index\": 3}, {\"build\": \"2.0.9\", \"test_index\": 12, \"PARALLEL\": 5, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 120259084288.0, \"run_index\": 4}, {\"build\": \"2.0.9\", \"test_index\": 13, \"PARALLEL\": 6, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 144955146240.0, \"run_index\": 0}, {\"build\": \"2.0.9\", \"test_index\": 13, \"PARALLEL\": 6, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 139586437120.0, \"run_index\": 1}, {\"build\": \"2.0.9\", \"test_index\": 13, \"PARALLEL\": 6, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 126701535232.0, \"run_index\": 2}, {\"build\": \"2.0.9\", \"test_index\": 13, \"PARALLEL\": 6, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 140660178944.0, \"run_index\": 3}, {\"build\": \"2.0.9\", \"test_index\": 13, \"PARALLEL\": 6, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 144955146240.0, \"run_index\": 4}, {\"build\": \"2.0.9\", \"test_index\": 14, \"PARALLEL\": 7, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 123480309760.0, \"run_index\": 0}, {\"build\": \"2.0.9\", \"test_index\": 14, \"PARALLEL\": 7, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 147102629888.0, \"run_index\": 1}, {\"build\": \"2.0.9\", \"test_index\": 14, \"PARALLEL\": 7, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 144955146240.0, \"run_index\": 2}, {\"build\": \"2.0.9\", \"test_index\": 14, \"PARALLEL\": 7, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 111669149696.0, \"run_index\": 3}, {\"build\": \"2.0.9\", \"test_index\": 14, \"PARALLEL\": 7, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 138512695296.0, \"run_index\": 4}, {\"build\": \"2.0.9\", \"test_index\": 15, \"PARALLEL\": 8, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 115964116992.0, \"run_index\": 0}, {\"build\": \"2.0.9\", \"test_index\": 15, \"PARALLEL\": 8, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 67430986547.2, \"run_index\": 1}, {\"build\": \"2.0.9\", \"test_index\": 15, \"PARALLEL\": 8, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 127775277056.0, \"run_index\": 2}, {\"build\": \"2.0.9\", \"test_index\": 15, \"PARALLEL\": 8, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 115964116992.0, \"run_index\": 3}, {\"build\": \"2.0.9\", \"test_index\": 15, \"PARALLEL\": 8, \"WINDOW\": 512, \"TIME\": 2, \"THROUGHPUT\": 114890375168.0, \"run_index\": 4}]" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "execution": { "iopub.execute_input": "2024-08-26T16:11:22.599950Z", "iopub.status.busy": "2024-08-26T16:11:22.599432Z", "iopub.status.idle": "2024-08-26T16:11:24.026114Z", "shell.execute_reply": "2024-08-26T16:11:24.024785Z" } }, "outputs": [ { "data": { "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", "
buildtest_indexPARALLELWINDOWTIMETHROUGHPUTrun_index
02.0.9016421.546188e+100
12.0.9016421.546188e+101
22.0.9016421.524713e+102
32.0.9016421.513976e+103
42.0.9016421.610613e+104
........................
752.0.915851221.159641e+110
762.0.915851226.743099e+101
772.0.915851221.277753e+112
782.0.915851221.159641e+113
792.0.915851221.148904e+114
\n", "

80 rows × 7 columns

\n", "
" ], "text/plain": [ " build test_index PARALLEL WINDOW TIME THROUGHPUT run_index\n", "0 2.0.9 0 1 64 2 1.546188e+10 0\n", "1 2.0.9 0 1 64 2 1.546188e+10 1\n", "2 2.0.9 0 1 64 2 1.524713e+10 2\n", "3 2.0.9 0 1 64 2 1.513976e+10 3\n", "4 2.0.9 0 1 64 2 1.610613e+10 4\n", ".. ... ... ... ... ... ... ...\n", "75 2.0.9 15 8 512 2 1.159641e+11 0\n", "76 2.0.9 15 8 512 2 6.743099e+10 1\n", "77 2.0.9 15 8 512 2 1.277753e+11 2\n", "78 2.0.9 15 8 512 2 1.159641e+11 3\n", "79 2.0.9 15 8 512 2 1.148904e+11 4\n", "\n", "[80 rows x 7 columns]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import seaborn as sns\n", "\n", "df = pd.DataFrame(data)\n", "\n", "var_names = {'PARALLEL': 'Number of parallel connections', 'WINDOW': 'Window size (kB)', 'THROUGHPUT': 'Throughput'}\n", "x_vars = ['PARALLEL', 'WINDOW']\n", "y_vars = ['THROUGHPUT']\n", "\n", "display(df)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "execution": { "iopub.execute_input": "2024-08-26T16:11:24.065124Z", "iopub.status.busy": "2024-08-26T16:11:24.064729Z", "iopub.status.idle": "2024-08-26T16:11:24.070673Z", "shell.execute_reply": "2024-08-26T16:11:24.069488Z" } }, "outputs": [], "source": [ "def get_name(var):\n", " return var_names[var] if var in var_names else var" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "execution": { "iopub.execute_input": "2024-08-26T16:11:24.074114Z", "iopub.status.busy": "2024-08-26T16:11:24.073758Z", "iopub.status.idle": "2024-08-26T16:11:24.399231Z", "shell.execute_reply": "2024-08-26T16:11:24.395762Z" } }, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAHCCAYAAAATn+iZAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABebElEQVR4nO3deVhUZfsH8O8Z9kVEdAAXBJdUMBcENbfAwtC3eLVNU3Mh883dJDfKRK0ESw0z07TcejVt0xZLcwFXcsfUxEQxS0FwBQYB4Ty/P/xxXsYZlBlmGBi+n+ua65rznOecc98zw8zNOc85RxJCCBARERFZCZWlAyAiIiIyJRY3REREZFVY3BAREZFVYXFDREREVoXFDREREVkVFjdERERkVVjcEBERkVVhcUNERERWhcUNERERWRUWN0RmUFRUhKlTp8LHxwcqlQr9+vWzdEgIDQ3Fo48+aukwjDZ8+HC4urpaOowaYfXq1ZAkCRcvXrR0KERGYXFDVqnky/nIkSNK26xZsyBJkvJwdnZGQEAAZsyYgezsbJNuf+XKlfjggw/wwgsvYM2aNZg0aZLefrIsY/Xq1fj3v/8NHx8fuLi44NFHH8W7776L/Pz8B27j/nzKeoSGhpo0t5ooLy8Ps2bNQmJiYrn6JyYmPvA92bBhg3kDriE++eQTrF692tJhUBVka+kAiCrb0qVL4erqitzcXPz666947733sGvXLuzfvx+SJJlkG7t27ULDhg3x4YcfPrBfXl4eIiMj8dhjj2HUqFHw9PREUlISYmJisHPnTuzatavMmJ577jk0b95cmc7NzcXo0aPx7LPP4rnnnlPavby8TJJTTZaXl4fZs2cDgEHF4oQJE9CxY0ed9i5dupgqNLMYMmQIXnrpJTg4OFg6lAf65JNPUK9ePQwfPtzSoVAVw+KGapwXXngB9erVAwCMGjUKzz//PL777jv89ttvFfrREUIgPz8fTk5OyMzMhLu7+0OXsbe3x/79+9G1a1elbeTIkfDz81MKnLCwML3Ltm3bFm3btlWmr127htGjR6Nt27Z4+eWXjc5Dn/z8fNjb20Ol4s5eQ/To0QMvvPCCpcMoN41GAxcXF9jY2MDGxsbS4RAZjd9UVOM98cQTAIC0tDQA9w4VxcfHo3Xr1nB0dISXlxdee+013Lx5U2s5Pz8/PPPMM9i2bRuCg4Ph5OSETz/9FJIkISEhAadPn1YOQ5R1OMPe3l6rsCnx7LPPAgDOnDljwkzv+eOPP9CzZ084OzujYcOGeP/997XmlxxS2bBhA2bMmIGGDRvC2dlZOXT39ddfIygoCE5OTqhXrx5efvllXL58WWsdoaGhevdwDB8+HH5+flpt169fx5AhQ+Dm5gZ3d3cMGzYMJ06cgCRJeg85XL58Gf369YOrqyvUajUmT56M4uJiZf7FixchSRLmz5+PDz/8EL6+vnByckJISAhOnTplcJwXL16EWq0GAMyePVt5T2fNmqXn1TXMqlWrIEkSVq5cqdU+d+5cSJKEn3/+2eCcACAlJQUvvPACPDw84OjoiODgYPzwww9afUoO3e7evRtjxoyBp6cnGjVqpDWv9Jibks97YmKi8nlv06aN8tn+7rvv0KZNGzg6OiIoKAjHjx+vUFz79+9HVFQU1Go1XFxc8OyzzyIrK0srntOnT2P37t08BEs6uOeGarzz588DAOrWrQsAeO2117B69WpERkZiwoQJSEtLw8cff4zjx49j//79sLOzU5Y9e/YsBg4ciNdeew0jR45Eo0aN8MUXX+C9995Dbm4uYmNjAQD+/v4GxZSRkQEAyh4mU7l58yZ69+6N5557Dv3798c333yDadOmoU2bNujTp49W33feeQf29vaYPHkyCgoKYG9vr7wuHTt2RGxsLK5evYpFixZh//79OH78eLn2VpUmyzIiIiJw6NAhjB49Gq1atcL333+PYcOG6e1fXFyM8PBwdO7cGfPnz8eOHTuwYMECNGvWDKNHj9bqu3btWuTk5GDs2LHIz8/HokWL8MQTT+DkyZMGHapTq9VYunSpziG/0nvNypKTk4Nr167ptNetWxeSJCEyMhLfffcdoqKi0KtXL/j4+ODkyZOYPXs2RowYgX/9618G53T69Gl069YNDRs2xPTp0+Hi4oKvvvoK/fr1w7fffqsUziXGjBkDtVqNmTNnQqPRPDCf1NRUDBo0CK+99hpefvllzJ8/HxEREVi2bBnefPNNjBkzBgAQGxuL/v374+zZs8rePkPjGj9+POrUqYOYmBhcvHgR8fHxGDduHDZu3AgAiI+Px/jx4+Hq6oq33noLAA/BUimCyAqtWrVKABCHDx9W2mJiYgQAcfbsWZGVlSXS0tLEp59+KhwcHISXl5fQaDRi7969AoBYt26d1vq2bt2q0+7r6ysAiK1bt+psPyQkRLRu3dro+MPCwoSbm5u4efNmuZfJysoSAERMTIze+SEhIQKAWLt2rdJWUFAgvL29xfPPP6+0JSQkCACiadOmIi8vT2kvLCwUnp6e4tFHHxV37txR2n/66ScBQMycOVNrWyEhIToxDBs2TPj6+irT3377rQAg4uPjlbbi4mLxxBNPCABi1apVWssCEHPmzNFaZ2BgoAgKClKm09LSBADh5OQk/vnnH6X94MGDAoCYNGmSwXE+7LW9X8lrWNYjPT1d6Zueni48PDxEr169REFBgQgMDBSNGzcWt2/fNiqnJ598UrRp00bk5+crbbIsi65du4pHHnlEaSv5G+nevbsoKirSir9kXlpamtJW8nk/cOCA0rZt2zYlrr/++ktp//TTTwUAkZCQYHRcYWFhQpZlpX3SpEnCxsZG3Lp1S2lr3bq13vePiIelqMZp2bIl1Go1mjRpgtdeew3NmzfHli1b4OzsjK+//hq1a9dGr169cO3aNeURFBQEV1dXJCQkaK2rSZMmCA8PN2l8c+fOxY4dOxAXF2fwnpCHcXV11RqPY29vj06dOuHChQs6fYcNGwYnJydl+siRI8jMzMSYMWPg6OiotD/99NNo1aoVtmzZYnA8W7duhZ2dHUaOHKm0qVQqjB07tsxlRo0apTXdo0cPvfH369cPDRs2VKY7deqEzp07K4d6KsPMmTOxfft2nYeHh4fSx9vbG0uWLMH27dvRo0cPJCcnY+XKlXBzc9NZ38NyunHjBnbt2oX+/fsre42uXbuG69evIzw8HOfOndM5hDhy5Mhyj68JCAjQGpfWuXNnAPcO7TZu3FinveR9MSau//znP1qD6Xv06IHi4mL89ddf5YqVarYaXdzs2bMHERERaNCgASRJwubNmw1aPj8/H8OHD0ebNm1ga2ur91om6enpGDRoEFq0aAGVSoXXX3/dJLGT8b799lts374diYmJSE1NxalTpxAUFAQAOHfuHG7fvg1PT0+o1WqtR25uLjIzM7XW1aRJE5PGtnHjRsyYMQMjRozQOcxiCo0aNdI5+6pOnTo644kA3dxKflRatmyp07dVq1ZG/ej89ddfqF+/PpydnbXaS58FVpqjo6My/qVEWfE/8sgjOm0tWrSo1Gu3tGnTBmFhYToPe3t7rX4vvfQSnn76aRw6dAgjR47Ek08+qXd9D8spNTUVQgi8/fbbOp/fmJgYAKjQZ7h0AQMAtWvXBgD4+PjobS95X4yJ6/5t1alTR2udRA9So8fcaDQatGvXDq+88orWqbPlVVxcDCcnJ0yYMAHffvut3j4FBQVQq9WYMWPGQ08Lpsrx+OOPlzmWRZZleHp6Yt26dXrn3//DWnrPRkVt374dQ4cOxdNPP41ly5aZbL2llfUfuhBCp60iuUmSpHedpQf+GsPUZ/CYK05DXb9+Xbkm0x9//AFZlo06M02WZQDA5MmTy9yjeH/haMj7XNbr/7DPlTFxGfJZJbpfjS5u+vTpozOIsrSCggK89dZb+PLLL3Hr1i08+uijmDdvnjIi38XFBUuXLgUA7N+/H7du3dJZh5+fHxYtWgQAOmdEUNXTrFkz7NixA926dTNp4fIwBw8exLPPPovg4GB89dVXsLWten+avr6+AO4Noi45w6zE2bNnlfnAvf+y9R0qun/vjq+vLxISEpCXl6e19yY1NbXC8Z47d06n7c8//9Q6W6u8cZrq+kdlGTt2LHJychAbG4vo6GjEx8cjKipKp9/DcmratCkAwM7OrsxLCFiCueIy9/tC1VeNPiz1MOPGjUNSUhI2bNiA33//HS+++CJ69+6t9wuGrEP//v1RXFyMd955R2deUVGR3gK2os6cOYOnn34afn5++Omnnyq1qDJEcHAwPD09sWzZMhQUFCjtv/zyi5JDiWbNmiElJUXr1N0TJ05g//79WusMDw/H3bt3sWLFCqVNlmUsWbKkwvFu3rxZaxzHoUOHcPDgQa1/aMobZ0nhZY73/5tvvsHGjRsRFxeH6dOn46WXXsKMGTPw559/6vR9WE6enp4IDQ3Fp59+ivT0dJ3lS+dZmcwVl4uLi1neE6r+qt6/h1XEpUuXsGrVKly6dAkNGjQAcG+X6tatW7Fq1SrMnTvXwhGSOYSEhOC1115DbGwskpOT8dRTT8HOzg7nzp3D119/jUWLFpn0omw5OTkIDw/HzZs3MWXKFJ1Buc2aNasyV7O1s7PDvHnzEBkZiZCQEAwcOFA5FdzPz0/rFhOvvPIKFi5ciPDwcIwYMQKZmZlYtmwZWrdurXWri379+qFTp0544403kJqailatWuGHH37AjRs3AFTsP/PmzZuje/fuGD16NAoKChAfH4+6deti6tSpBsfp5OSEgIAAbNy4ES1atICHhwceffTRh96ra+/evXpvo1FyAcbMzEyMHj0aPXv2xLhx4wAAH3/8MRISEjB8+HDs27dP6/BUeXJasmQJunfvjjZt2mDkyJFo2rQprl69iqSkJPzzzz84ceKE0a9pRZgjrqCgICxduhTvvvsumjdvDk9PT529ilQzsbgpw8mTJ1FcXIwWLVpotRcUFCjXQyHrtGzZMgQFBeHTTz/Fm2++CVtbW/j5+eHll19Gt27dTLqt69ev4++//wYATJ8+XWf+sGHDqkxxA9y7uJ2zszPi4uIwbdo05eJq8+bN0zqzy9/fH2vXrsXMmTMRFRWFgIAAfPHFF1i/fr3WBQ1tbGywZcsWTJw4EWvWrIFKpcKzzz6LmJgYdOvWTeusLEMNHToUKpUK8fHxyMzMRKdOnfDxxx+jfv36BscJAJ999hnGjx+PSZMmobCwEDExMQ8tbj766CO97TExMWjbtq1SpJRczA+4dw2c5cuXo2/fvpg/f75W4VKenAICAnDkyBHMnj0bq1evxvXr1+Hp6YnAwEDMnDnT0JfRZMwR18yZM/HXX3/h/fffR05ODkJCQljcEABAEhydBeDef4ibNm1SznjauHEjBg8ejNOnT+sMbHN1dYW3t7dW2/Dhw3Hr1q0HnnEVGhqK9u3bIz4+3sTRE1mXzZs349lnn8W+ffsMLigvXryIJk2a4IMPPsDkyZPNFGHlssaciMyJe27KEBgYiOLiYmRmZqJHjx6WDofIat25c0drnFFxcTEWL14MNzc3dOjQwYKREVF1VaOLm9zcXK2zMtLS0pCcnAwPDw+0aNECgwcPxtChQ7FgwQIEBgYiKysLO3fuRNu2bZXBk3/88QcKCwtx48YN5OTkIDk5GQDQvn17Zb0lbbm5ucjKykJycjLs7e0REBBQWakSVVnjx4/HnTt30KVLFxQUFOC7777DgQMHMHfu3Co7uJqIqrYaXdwcOXIEPXv2VKZLTr0cNmwYVq9ejVWrVuHdd9/FG2+8gcuXL6NevXp47LHH8MwzzyjL/Otf/9I6bTQwMBCA9rUYStoA4OjRo1i/fj18fX0r9WJiRFXVE088gQULFuCnn35Cfn4+mjdvjsWLFysDbImIDMUxN0RERGRVeJ0bIiIisiosboiIiMiq1LgxN7Is48qVK6hVqxYv3U1ERFRNCCGQk5ODBg0aPPTeazWuuLly5YrOHWyJiIioevj777/RqFGjB/apccVNrVq1ANx7cdzc3Cp127IsIysrC2q12qg7/lZXzJt51wTMm3nXBJbMOzs7Gz4+Psrv+IPUuOKm5FCUm5ubRYqb/Px8uLm51bg/BubNvK0d82beNUFVyLs8Q0pqzjtCRERENQKLGyIiIrIqLG6IiIjIqtS4MTflVVxcjLt375p0nbIs4+7du8jPz69xx2irU9729vbVIk4iItKPxc19hBDIyMjArVu3zLJuWZaRk5NTo66xU93yVqlUaNKkCezt7S0dChERGYHFzX1KChtPT084Ozub9MdYCIGioiLY2tpWix95U6lOeZdc5DE9PR2NGzeu8vESEZEuFjelFBcXK4VN3bp1Tb7+6vQjb0rVLW+1Wo0rV66gqKgIdnZ2lg6HiIgMxIEFpZSMsXF2drZwJGRJJYejiouLLRwJEREZg8WNHtVh7wKZD99/IqLqjcUNERERWRUWN2aWmJgISZIqfPbV8OHD0a9fP5PEVFGrV6+Gu7u72bfz9ttv4z//+Y8yHRoaitdff71C6ywsLISfnx+OHDlSweiIiKiqYnFTTsuWLUOtWrVQVFSktOXm5sLOzg6hoaFafUsKmvPnz6Nr165IT09H7dq1Kzli8xkwYAD+/PNPs24jIyMDixYtwltvvVXuZWbNmgVJkpRH7dq10aNHD+zevVvpY29vj8mTJ2PatGnmCJuIiKoAFjfl1LNnT+Tm5mr9x7937154e3vj4MGDyM/PV9oTEhLQuHFjNGvWDPb29vD29raqcRxOTk7w9PQ06zY+++wzdO3aFb6+vgYt17p1a6SnpyM9PR1JSUl45JFH8Mwzz+D27dtKn8GDB2Pfvn04ffq0qcMmIqIqgMVNObVs2RL169dHYmKi0paYmIi+ffuiSZMm+O2337Tae/bsqTwvfVhq7dq1qFOnDrZt2wZ/f3+4urqid+/eSE9PV5YvLi5GVFQU3N3dUbduXUydOhVCCK14CgoKMGHCBHh6esLR0RHdu3fH4cOHlfnBwcGYP3++Mt2vXz/Y2dkhNzcXAPDPP/9AkiSkpqbqzffEiRPo2bMnatWqBTc3NwQFBSmF3f2Hpfz8/LT2mJQ8Svz9998YOHAg6tSpAw8PD/Tt2xcXL1584Ou9YcMGREREPLDPli1bULt2baxbt05ps7W1hbe3N7y9vREQEIA5c+YgNzdXa09TnTp10K1bN2zYsOGB6yciouqJxY0BevbsiYSEBGU6ISEBoaGhCAkJUdrv3LmDgwcPKsWNPnl5eZg/fz6++OIL7NmzB5cuXcLkyZOV+QsWLMDq1auxcuVK7Nu3Dzdu3MCmTZu01jF16lR8++23WLNmDY4dO4bmzZsjPDwcN27cAACEhIQohZgQAnv37oW7uzv27dsHANi9ezcaNmyI5s2b641x8ODBaNSoEQ4fPoyjR49i+vTpZV7z5fDhw8rekn/++QePPfYYevToAeDe6fW9e/dGrVq1sGfPHuzfv18p6AoLC/Wu78aNG/jjjz8QHBxc5mu4fv16DBw4EOvWrcPgwYP19ikoKMCqVavg7u6Oli1bas3r1KkT9u7dW+b6iYio+uJF/AzQs2dPvP766ygqKsKdO3dw/PhxhISE4O7du1i2bBkAICkpCQUFBQ8sbkr6N2vWDAAwbtw4zJkzR5kfHx+P6OhoPPfccwDujffZtm2bMl+j0WDp0qVYvXo1+vTpAwBYsWIFtm/fjs8//xxTpkxBaGgoPv/8cxQXF+PUqVOwt7fHgAEDkJiYiN69eyMxMREhISFlxnjp0iVMmTIFrVq1AgA88sgjZfZVq9XK84kTJyI9PV3Zi7Rx40bIsoxPP/0UdnZ2kCRJKTgSExPx1FNP6d22EAINGjTQu70lS5bgrbfewo8//qiTw8mTJ+Hq6grgXhFZq1YtbNy4EW5ublr9GjRogL/++qvMnIiIaiKNRqN8h+bm5sLFxcXCERmHxY0BQkNDodFocPjwYdy8eRMtWrSAWq1GSEgIIiMjkZ+fj8TERDRt2hSNGzcucz3Ozs5KYQMA9evXR2ZmJgDg9u3bSE9PR+fOnZX5tra2CA4OVg5NnT9/Hnfv3kW3bt2UPnZ2dujUqRPOnDkDAOjRowdycnJw/PhxHDhwACEhIQgNDUVcXByAe3tupkyZUmaMUVFRePXVV/HFF18gLCwML774olbM+ixfvhyff/45Dhw4oBQ8J06cQGpqKjw8PLT65ufn4/z583rXc+fOHQCAo6OjzrxvvvkGmZmZ2L9/Pzp27Kgzv2XLlvjhhx8AADk5Odi4cSNefPFFJCQkaO0JcnJyQl5e3gPzISKi6omHpQzQvHlzNGrUCAkJCUhISFD2GjRo0AA+Pj44cOAAEhIS8MQTTzxwPfcf3pEkSWdMTUW5u7ujXbt2SExMxO7duxEaGorHH38cx48fx59//olz5849cM/NrFmzcPr0aTz99NPYtWsXAgICdA6NlZaQkIDx48dj7dq1aNu2rdKem5uLoKAgHD58GMePH0dycjKSk5Px559/YtCgQXrXVa9ePQDAzZs3deYFBgZCrVZj5cqVel8ze3t7NG/eHM2bN0dgYCDi4uLQsGFDxMfHa/W7ceOG1h4nIiKyHixuDNSzZ08kJiYiMTFR6xTwxx9/HL/88gsOHTr0wENSD1O7dm3Ur18fBw8eVNqKiopw9OhRZbrkLKz9+/crbXfv3sXhw4cREBCgtJWMBdqzZw9CQ0Ph4eEBf39/vPfee6hfvz5atGjxwFhatGiBSZMm4ddff8Vzzz2HVatW6e2XmpqKF154AW+++aZyKK1Ehw4dcO7cOXh6eipFR8mjrNPjmzVrBjc3N/zxxx965yUkJOD777/H+PHjHxh/CRsbG2VvUIlTp04hMDCwXMsTERlCo9EoJ1ZoNBpLh1MjsbgxUM+ePbFv3z4kJydr7fkICQnBp59+isLCwgoVN8C9cStxcXHYvHkzUlJSMGbMGK2LALq4uGD06NGYMmUKtm7dij/++AMjR45EXl4eRowYofQLDQ3Ftm3bYGtrq4ydCQ0Nxbp16x641+bOnTsYN24cEhMT8ddff2H//v04fPgw/P399faNiIhAYGAg/vOf/yAjI0N5APcGJterVw/PP/889u7di7S0NCQmJmLChAn4559/9G5fpVIhLCxMGfx8vxYtWiAhIQHffvutzkX9ioqKlO2fO3cO7777Lv744w/07dtXq9/evXv1jvchIqLqj2NuDNSzZ0/cuXMHrVq1gpeXl9IeEhKCnJwc5ZTxinjjjTeQnp6OYcOGQaVS4ZVXXsGzzz6rda2WuLg4yLKMIUOGICcnB8HBwdi2bRvq1Kmj9OnRowdkWdYqZEJDQ7Fo0SKdCw+WZmNjg+vXr2Po0KG4evUq6tWrh+eeew6zZ8/W6Xv16lWkpKQgJSVFZwCwEALOzs7YvXs3pk6diueffx45OTlo2LAhnnzySZ1BvqW9+uqrGDlyJN5//32oVLo1eMuWLbFr1y6EhobCxsYGCxYsAACcPn1aef1LxjYtXboUQ4cOVZZNSkrC7du38cILL5S5fSIiqr4kYerBHlVcdnY2ateujdu3b+v8uObn5yMtLQ1NmjTRO5i1ooQQKCoqgq2trVVd1O9hjMlbCIHOnTtj0qRJGDhwoEnjGTBgANq1a4c333xT73xTfQ5kWUZmZiY8PT31FmjWinkz7xLWcuaNPtaa98Nit+Tn/EG/3/erOX+BVK1IkoTly5dr3e7CFAoLC9GmTRtMmjTJpOslIqKqg4elqMpq37492rdvb9J12tvbY8aMGSZdJxERVS3cc0NERERWhcUNERERWRUWN0RERGRVWNwQERGRVeGAYiIiohrGb/oWve1yYb7y3P/trVDZa18OQwWBA68H379YlcM9N0RERGRVWNwQERGRVWFxQ0RERFaFY26qoLKOhZrDxbinjVru8uXLmDZtGn755Rfk5eWhefPmWLVqFYKDdY/Fjho1CsuXL8fChQt5ZWAiIjI7i+652bNnDyIiItCgQQNIkoTNmzeXe9n9+/fD1tbW5FewpYe7efMmunXrBjs7O/zyyy/4448/sGDBAq2bdpbYtGkTDh48qHNTTSIiInOx6J4bjUaDdu3a4ZVXXsFzzz1X7uVu3bqFoUOH4sknn8TVq1fNGCHpM2/ePPj4+GDVqlVKW5MmTXT6Xb58GePHj8fWrVvxzDPPVGaIRERUg1l0z02fPn3w7rvv4tlnnzVouVGjRmHQoEHo0qWLmSKjB/nhhx8QHByMF198EZ6enggMDMSKFSu0+siyjCFDhmDKlClo3bq1hSIlIqKaqNqNuVm1ahUuXLiA//73v3j33Xcf2r+goAAFBQXKdHZ2NoB7P76yLGv1lWUZQgjlYQ4l6zXX+g1lTBwXLlzA0qVLMWnSJERHR+Pw4cOYMGEC7OzsMGzYMABAXFwcbG1tMX78+Apvr7KVvP/6PiOGKPk8VWQd1RHzZt6l55V+bk2vTXXPW4WyvouFVp/7+6kgLPY5N2Sb1aq4OXfuHKZPn469e/fC1rZ8ocfGxmL27Nk67VlZWcjPz9dqu3v3LmRZRlFREYqKikwSc2lCCBQXFwMAJEky+fqNYUyesiwjKCgIc+bMAQC0adMGJ0+exLJlyzB48GAcO3YMH330EQ4ePIji4mKlWCguLjbL62pqRUVFkGUZ169fh52dndHrkWUZt2/fhhACKlXNOTGReTPvEnl5ecrzrKwsaDSayg7PbKp73v519Bc3RYUCf/3/85Z1BGzt7y9u7g0NscTnPCcnp9x9q01xU1xcjEGDBmH27Nlo0aJFuZeLjo5GVFSUMp2dnQ0fHx+o1Wq4ublp9c3Pz0dOTg5sbW3LXTwZoyI/mKZmTJ7169dHQECA1rIBAQHYtGkTbG1tceDAAWRmZqJZs2bK/OLiYkybNg0ff/wx0tLSTBK7udja2kKlUqFu3bpwdHR8+AJlkGUZkiRBrVbXuB875s28AWj9qKvVari4uFR2eGZT3fM+c1P/P9hy4f/az96UoLLX7qeCgLu7u0U+54Z8H1eb4iYnJwdHjhzB8ePHMW7cOAD/2y1oa2uLX3/9FU888YTOcg4ODnBwcNBpV6lUOm+MSqWCJEnKw9SEEMp6q8qeG2Pi6NatG/7880+tZc+dOwdfX19IkoShQ4eiV69eyjwhBHr37o2XX34Zr7zySpXJvSwl77++z4gx6zLFeqob5l3D8v7yJaiyf4cK2ocNVIWlDnHENtT5oVTMum3O8MymrPe79HRV/TzIKKO4KdV+77luP0t9zg3ZXrUpbtzc3HDy5Emttk8++QS7du3CN998o/dsHTKPSZMmoWvXrpg7dy769++PQ4cOYfny5Vi+fDkAoG7duqhbt67SXwgBOzs7eHt7o2XLlpYKm4iIagiLFje5ublITU1VptPS0pCcnAwPDw80btwY0dHRuHz5MtauXQuVSoVHH31Ua3lPT084OjrqtJN5dezYEZs2bUJ0dDTmzJmDJk2aID4+HoMHD7Z0aERVkkajgaurK4B733tV8TAFkTWxaHFz5MgR9OzZU5kuGRszbNgwrF69Gunp6bh06ZKlwrMYY68aXJmeeeYZg65dc+7cObOOYyIioopT2TvCd9pPlg6jwiz6axMaGvrAU4NXr179wOVnzZqFWbNmmTYoIiIiqtaq3ignIiIiogpgcUNERERWhcUNERERWRUWN0RERGRVWNwQERGRVWFxQ0RERFaFxQ0RERFZFRY3REREZFVY3BAREZFV4fXwq6JZtStxW4bfjXfWrFmYPXu2VlvLli2RkpICAFi+fDnWr1+PY8eOIScnBzdu3FDuqwMAFy9exDvvvINdu3YhIyMDDRo0wMsvv4y33noL9vb2FcuHiKiyrB8AZP8O3Hc3dJS6Gzreqw9Y2d3QqwMWN2SU1q1bY8eOHcp06ftG5eXloXfv3ujduzeio6N1lk1JSYEsy/j000/RvHlznDp1CiNHjoRGo8H8+fMrJX4iIrJeLG7IKLa2tvD29tY77/XXXwcAJCYm6p1fUviUaNq0Kc6ePYulS5eyuCEiogrjmBsyyrlz59CgQQM0bdoUgwcPrvDd22/fvg0PDw8TRUdEVYGLvQQR4wYR4waXsg7NVFEajQaSJEGSJGg0GkuHUy1UpdeMxQ0ZrHPnzli9ejW2bt2KpUuXIi0tDT169EBOTo5R60tNTcXixYvx2muvmThSIiKqiXhYigzWp08f5Xnbtm3RuXNn+Pr64quvvsKIESMMWtfly5fRu3dvvPjiixg5cqSpQyUiohqIe26owtzd3dGiRQukpqYatNyVK1fQs2dPdO3aFcuXLzdTdEREVNOwuKEKy83Nxfnz51G/fv1yL3P58mWEhoYiKCgIq1atgkrFjyIREZkGD0uRwSZPnoyIiAj4+vriypUriImJgY2NDQYOHAgAyMjIQEZGhrIn5+TJk3ByckLTpk1Rt25dpbDx9fXF/PnzkZWVpay7rDOwiIiIyovFDRnsn3/+wcCBA3H9+nWo1Wp0794dv/32G9RqNQBg2bJlWhf5CwkJAQCsXLkSkZGR2L59O1JTU5GamopGjRpprVsIASIioopgcVMVVfGrVm7YsOGB82fNmoVZs2Yp00IIFBUVKRf6Gz58OIYPH27GCImIqCbjQAciIiKyKixuiIiIyKqwuCEiIiKrwjE3RERUY/lN36K3XS7MV577v70VKntHrfkqCBzwNGtoVAHcc6MHz9ip2fj+ExFVb9xzU4qdnR0AIC8vD05OThaOhiylsLAQAGBjY2PhSKjaWT8AyP4dgKzdXliqYH6vPlDWTSSr+JmSRNUFi5tSbGxs4O7ujszMTACAs7MzJMl0d7ItfUq0Kddb1VWnvGVZRlZWFpydnZVT14mIqHrht/d9Sq6QW1LgmJIQArIsQ6VSVfkfeVOqbnmrVCo0bty4WsRKRES6WNzcR5Ik1K9fH56enrh7965J1y3LMq5fv466devWqHspVbe87e3tq0WcRESkH4ubMtjY2Jh8zIUsy7Czs4Ojo2ON+vGsqXkTEZFl8JeGiIiIrAqLGyIiIrIqLG6IiIjIqnDMDRER0X1U9o7wnfaTpcMgI3HPDREREVkVFjdERERkVSxa3OzZswcRERFo0KABJEnC5s2bH9j/u+++Q69evaBWq+Hm5oYuXbpg27ZtlRMsERERVQsWLW40Gg3atWuHJUuWlKv/nj170KtXL/z88884evQoevbsiYiICBw/ftzMkRIREVF1YdEBxX369EGfPn3K3T8+Pl5reu7cufj+++/x448/IjAw0MTRERERUXVUrc+WkmUZOTk58PDwKLNPQUEBCgoKlOns7GxlWVmWy1rMLGRZVu6zVJMwb+ZdE8iyDAEJsp4d4jJEqecqyCjjvmXV8DV7UN4GrMR0ARlIVeq9MXS56vx+VyjvMv6+S7eZ4zfWkPVV6+Jm/vz5yM3NRf/+/cvsExsbi9mzZ+u0Z2VlIT8/35zh6ZBlGbdv34YQokbdhoB5M++aQJZl3HZuAgEJKmh/CecVFAPYDwDIqvUoNA5l3NrFDDfsNbcH5V1uFszbv46xP/LArWr8flco71u39P595+XlKc+zsrKg0WgqEqKOnJyccvettsXN+vXrMXv2bHz//ffw9PQss190dDSioqKU6ezsbPj4+CiDkiuTLMuQJAlqtbrGfekzb+Zt7WRZhpSXBnX2SZ0fO03h/35I1Dmn4FJQxn/yD/guq6oelHe5WTDvMzfLeC8eQgUBd7vq+35XKG93d71/36WLGbVaDRcXlwrFeD9HR8dy962Wxc2GDRvw6quv4uuvv0ZYWNgD+zo4OMDBwUGnXaVSWeSLV5Iki23bkpg38wbuffm5uroCAHJzc03+5WdpEgRU/38gorTShwDuzS/jh6Wafk7KyrvcLJh3mYeMyqE6v98VyruMv+/S0+b43jNkfdXuL+nLL79EZGQkvvzySzz99NOWDoeIiIiqGIvuucnNzUVqaqoynZaWhuTkZHh4eKBx48aIjo7G5cuXsXbtWgD3DkUNGzYMixYtQufOnZGRkQEAcHJyQu3atS2SAxEREVUtFt1zc+TIEQQGBiqncUdFRSEwMBAzZ84EAKSnp+PSpUtK/+XLl6OoqAhjx45F/fr1lcfEiRMtEj8REdH9XOwliBg3iBg3uNgbf/iHjGfRPTehoaEQouwR26tXr9aaTkxMNG9AREREVO1VuzE3RERERA/C4oaIiIisCosbIiIisiosboiIiMiqsLghIiIiq8LihoiIiKxKtbz9AhFRdVJy3RMiqhzcc0NERERWhcUNERERWRUWN0RERGRVWNwQERGRVWFxQ0RERFaFxQ0RERFZFRY3REREZFVY3BAREZFVYXFDREREVoXFDREREVkV3n6BiExv/QAg+3cAsnZ7ofjf8/fqA/aS/uVn3TZbaERk/bjnhoiIiKwKixsiIiKyKjwsRUREROVXDQ47c88NERERWRUWN0RERGRVWNwQERGRVWFxQ0RERFaFxQ0RERFZFRY3REREZFVY3BAREZFVYXFDREREVoXFDREREVkVFjdERERkVVjcEBERkVVhcUNERERWhcUNERERWRUWN0RERGRVWNwQERGRVbFocbNnzx5ERESgQYMGkCQJmzdvfugyiYmJ6NChAxwcHNC8eXOsXr3a7HESERFR9WHR4kaj0aBdu3ZYsmRJufqnpaXh6aefRs+ePZGcnIzXX38dr776KrZt22bmSImIiKi6sLXkxvv06YM+ffqUu/+yZcvQpEkTLFiwAADg7++Pffv24cMPP0R4eLi5wiQiIqJqxKLFjaGSkpIQFham1RYeHo7XX3+9zGUKCgpQUFCgTGdnZwMAZFmGLMtmibMssixDCFHp27U05l0D84YEWc+OYRmi1HMVZEhlrcRc4ZnNg/I2YCWmC6iSVPe8VaU+k4Yux7y1mfvv25Dv0mpV3GRkZMDLy0urzcvLC9nZ2bhz5w6cnJx0lomNjcXs2bN12rOyspCfn2+2WPWRZRm3b9+GEAIqVc0Zy828a2Dezk0gIEEF3S+j9Hs7XqH5/4demZnmCs9sHpZ3uTDvSudfx9gfeeAW89aal1dQDGA/ACCr1qPQONjoX4mReefk5JS7b7UqbowRHR2NqKgoZTo7Oxs+Pj5Qq9Vwc3Or1FhkWYYkSVCr1TXux45517C889Kgzj5p/Je+p6dpg6oEzLt65n3mZhl7Fx5CBQF3O+ZdmqbwfwWTOucUXArK2IaReTs6Opa7b7Uqbry9vXH16lWttqtXr8LNzU3vXhsAcHBwgIODg067SqWyyA+OJEkW27YlMe8aljcEVP+/Y9oo1fT1Yt7VL+8yD52UA/PWzrv0oa5788vYhpF5G/I9Wq3+krp06YKdO3dqtW3fvh1dunSxUERERERU1Vi0uMnNzUVycjKSk5MB3DvVOzk5GZcuXQJw75DS0KFDlf6jRo3ChQsXMHXqVKSkpOCTTz7BV199hUmTJlkifCIiIqqCLFrcHDlyBIGBgQgMDAQAREVFITAwEDNnzgQApKenK4UOADRp0gRbtmzB9u3b0a5dOyxYsACfffYZTwMnIiIihUXH3ISGhkKIskds67v6cGhoKI4fP27GqIiIiKg6q1ZjboiIiIgehsUNERERWRUWN0RERGRVWNwQERGRVWFxQ0RERFbF4OJm7dq1WjeiLFFYWIi1a9eaJCgiIiIiYxlc3ERGRuL27ds67Tk5OYiMjDRJUERERETGMri4EUJAknTvF/HPP/+gdu3aJgmKiIiIyFjlvohfYGAgJEmCJEl48sknYWv7v0WLi4uRlpaG3r17myVIIiIiovIqd3HTr18/AEBycjLCw8Ph6uqqzLO3t4efnx+ef/55kwdIREREZIhyFzcxMTEAAD8/PwwYMACOjo5mC4qIiIjIWAbfW2rYsGHmiIOIiIjIJAwublQqld4BxSWKi4srFBARERFRRRhc3Hz33Xdaxc3du3dx/PhxrFmzBrNnzzZpcERERESGMri4KRlYXNoLL7yA1q1bY+PGjRgxYoQp4iIiIiIyisluv/DYY49h586dplodERERkVFMUtzcuXMHH330ERo2bGiK1REREREZzeDDUnXq1NEacyOEQE5ODpydnfHf//7XpMERERERGcrg4iY+Pl5rWqVSQa1Wo3PnzqhTp46p4iIiIiIyCq9zQ0RERFbF4OIGAG7evInPP/8cZ86cAQAEBAQgMjISHh4eJg2OiIiIyFAGDyjes2cP/Pz88NFHH+HmzZu4efMmPvroIzRp0gR79uwxR4xERERE5WbwnpuxY8diwIABWLp0KWxsbADcuyrxmDFjMHbsWJw8edLkQRIRERGVl8F7blJTU/HGG28ohQ0A2NjYICoqCqmpqSYNjoiIiMhQBhc3HTp0UMbalHbmzBm0a9fOJEERERERGcvgw1ITJkzAxIkTkZqaisceewwA8Ntvv2HJkiWIi4vD77//rvRt27at6SIlIiIiKgeDi5uBAwcCAKZOnap3niRJEEJAkiTeIZyIiIgqncHFTVpamjniICIiIjIJg4sbX19fc8RBREREZBJGXcTv3LlzSEhIQGZmJmRZ1po3c+ZMkwRGRERE1YeLvQQR42bpMAAYUdysWLECo0ePRr169eDt7a11E01JkljcEJWDRqOBq6srACA3NxcuLi4WjoiIyHoYXNy8++67eO+99zBt2jRzxENERERUIQZf5+bmzZt48cUXzRELERERUYUZXNy8+OKL+PXXX80RCxEREVGFleuw1EcffaQ8b968Od5+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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# BAR\n", "\n", "for y_var in y_vars:\n", " values = df.groupby(['PARALLEL', 'WINDOW'])[y_var]\n", " values.mean().unstack().plot.bar(yerr=values.std().unstack())\n", "\n", " plt.xlabel('Number of parallel connections')\n", " plt.ylabel(get_name(y_var))\n", " plt.legend(title='Window size (kB)')\n", " plt.title('IPerf 2 Throughput Experiment')\n", " plt.grid(alpha=0.3)\n", "\n", " # plt.savefig(f'iperf-nb_{y_var}.pdf')\n", " plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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" } }, "nbformat": 4, "nbformat_minor": 2 }