From 8b1e712d87ab725364ca701a4015e26ed25f25ac Mon Sep 17 00:00:00 2001 From: Erik Tjong Kim Sang Date: Thu, 25 Mar 2021 23:10:52 +0100 Subject: [PATCH 1/3] refactored notebook --- test_mvp.ipynb | 289 +++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 244 insertions(+), 45 deletions(-) diff --git a/test_mvp.ipynb b/test_mvp.ipynb index 64ba8ad..5841d54 100644 --- a/test_mvp.ipynb +++ b/test_mvp.ipynb @@ -2,56 +2,157 @@ "cells": [ { "cell_type": "markdown", + "id": "settled-retro", "metadata": {}, "source": [ - "# `sequgen` demo" + "# `sequgen` demo\n", + "\n", + "This demo shows how to create a timeseries with sequgen. Before we can run the software, we first need to to load a few packages." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "engaging-liabilities", + "metadata": {}, + "outputs": [], + "source": [ + "from matplotlib import pyplot as plt\n", + "import numpy\n", + "from sequgen.deterministic.triangular_peak import triangular_peak\n", + "from sequgen.parameter_space import ParameterSpace\n", + "from sequgen.dimension import Dimension" ] }, { "cell_type": "markdown", + "id": "stuck-current", "metadata": {}, "source": [ - "Print the version of the library as used in this demonstration:" + "The time series will consist of two parts: the time points and the data points. For the time points we want to use space between the numbers 0 and 20. We want to divide that space in 100 equal sections so we need 101 points: 100 at the beginning of each section and 1 and the end of the final section. We can define these time points with this command:" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, + "id": "precise-dublin", + "metadata": {}, + "outputs": [], + "source": [ + "time_points = numpy.linspace(start=0, stop=20, num=101)" + ] + }, + { + "cell_type": "markdown", + "id": "stable-highway", + "metadata": {}, + "source": [ + "We can verify that this process has worked by checking the contents of the variable `time_points`:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "academic-relief", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "'0.1.0'" + "array([ 0. , 0.2, 0.4, 0.6, 0.8, 1. , 1.2, 1.4, 1.6, 1.8, 2. ,\n", + " 2.2, 2.4, 2.6, 2.8, 3. , 3.2, 3.4, 3.6, 3.8, 4. , 4.2,\n", + " 4.4, 4.6, 4.8, 5. , 5.2, 5.4, 5.6, 5.8, 6. , 6.2, 6.4,\n", + " 6.6, 6.8, 7. , 7.2, 7.4, 7.6, 7.8, 8. , 8.2, 8.4, 8.6,\n", + " 8.8, 9. , 9.2, 9.4, 9.6, 9.8, 10. , 10.2, 10.4, 10.6, 10.8,\n", + " 11. , 11.2, 11.4, 11.6, 11.8, 12. , 12.2, 12.4, 12.6, 12.8, 13. ,\n", + " 13.2, 13.4, 13.6, 13.8, 14. , 14.2, 14.4, 14.6, 14.8, 15. , 15.2,\n", + " 15.4, 15.6, 15.8, 16. , 16.2, 16.4, 16.6, 16.8, 17. , 17.2, 17.4,\n", + " 17.6, 17.8, 18. , 18.2, 18.4, 18.6, 18.8, 19. , 19.2, 19.4, 19.6,\n", + " 19.8, 20. ])" ] }, - "execution_count": 1, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "from sequgen.__version__ import __version__\n", - "\n", - "\n", - "__version__" + "time_points" ] }, { "cell_type": "markdown", + "id": "adverse-bunny", "metadata": {}, "source": [ - "Import core classes and run `sequgen`'s minimum viable product:" + "In this time space, we want to create a triangulary shaped signal starting at time point 5 at value 0, rising to value 1 at time point 6 and dropping back to value 0 at time point 10. The following command can achieve this:" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, + "id": "concrete-collar", + "metadata": {}, + "outputs": [], + "source": [ + "data_points = triangular_peak(time_points, **{'height': 1, 'placement': 6, 'width_base_left': 1, 'width_base_right': 4})" + ] + }, + { + "cell_type": "markdown", + "id": "analyzed-truth", + "metadata": {}, + "source": [ + "So we have asked for a triangular peak with height 1, placed at time position 6, where the left part of the triangle has width 1 (so it starts at 5) and the right part has width 4 (so it ends at time point 10). We can check the contents of the variable `data_points` to verify that the command has worked:" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "pregnant-tracy", "metadata": {}, "outputs": [ { "data": { - "image/png": "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\n", + "text/plain": [ + "array([0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0.2 , 0.4 ,\n", + " 0.6 , 0.8 , 1. , 0.95, 0.9 , 0.85, 0.8 , 0.75, 0.7 , 0.65, 0.6 ,\n", + " 0.55, 0.5 , 0.45, 0.4 , 0.35, 0.3 , 0.25, 0.2 , 0.15, 0.1 , 0.05,\n", + " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,\n", + " 0. , 0. ])" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "data_points" + ] + }, + { + "cell_type": "markdown", + "id": "arbitrary-value", + "metadata": {}, + "source": [ + "We notice that the standard value of the data points is zero. Only at the triangle that we have defined the values are non-zero. A graph provides a better view of the shape:" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "acknowledged-world", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", "text/plain": [ "
" ] @@ -63,48 +164,146 @@ } ], "source": [ - "from matplotlib import pyplot as plt\n", - "import numpy\n", - "from sequgen.deterministic.triangular_peak import triangular_peak\n", - "from sequgen.parameter_space import ParameterSpace\n", - "from sequgen.dimension import Dimension\n", - "\n", - "\n", - "def test_mvp():\n", - "\n", - " # where I want the model to predict values\n", - " t_predict = numpy.linspace(-2, 20, 100)\n", - "\n", - " parameter_space = ParameterSpace([\n", - " Dimension(\"height\", 1, 2),\n", - " Dimension(\"placement\", 3, 10),\n", - " Dimension(\"width_base_left\", 0.5),\n", - " Dimension(\"width_base_right\", 2.0, 3.0),\n", - " ])\n", - "\n", - " # draw a sample of the parameter space for each space\n", - " parameters = parameter_space.sample()\n", - "\n", - " # generate predictions of y at t_predict using the model and the parameterization\n", - " y_predict = triangular_peak(t_predict, **parameters)\n", - "\n", - " # plot to verify\n", + "def plot(time_points, data_points, title):\n", " plt.figure()\n", - " plt.plot(t_predict, y_predict, \".b-\")\n", - " plt.title(parameter_space.format_str().format(**parameters))\n", + " plt.plot(time_points, data_points, \".b-\")\n", + " plt.title(title)\n", " plt.show()\n", "\n", - "\n", - "if __name__ == \"__main__\":\n", - " test_mvp()\n" + "title = \"triangular graph\"\n", + "plot(time_points, data_points, title)" + ] + }, + { + "cell_type": "markdown", + "id": "endless-thinking", + "metadata": {}, + "source": [ + "Often, we want to to allow for some variance in the signal. For example, we could have the height of the peak vary between 1 and 2, the peak position could vary between 3 and 10, the left width of the triangle could vary between 0.5 and 1, and the right width of the triangle could vary between 4 and 6. We can define these variations in a parameter space:" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "minute-minister", + "metadata": {}, + "outputs": [], + "source": [ + "parameter_space = ParameterSpace([\n", + " Dimension(\"height\", 1, 2),\n", + " Dimension(\"placement\", 3, 10),\n", + " Dimension(\"width_base_left\", 0.5, 1),\n", + " Dimension(\"width_base_right\", 4, 6),\n", + "])" + ] + }, + { + "cell_type": "markdown", + "id": "infinite-yield", + "metadata": {}, + "source": [ + "Next, we generate a set of arbitrary values based on this parameter space:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "fluid-narrow", + "metadata": {}, + "outputs": [], + "source": [ + "parameters = parameter_space.sample()" + ] + }, + { + "cell_type": "markdown", + "id": "compact-device", + "metadata": {}, + "source": [ + "We can verify that the parameter value generation was successful by checking the value of the `parameters` variable:" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "cordless-lover", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "{'height': 1.0918637838415952,\n", + " 'placement': 4.6254030311596175,\n", + " 'width_base_left': 0.6145108647446988,\n", + " 'width_base_right': 5.594328900386932}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "parameters" + ] + }, + { + "cell_type": "markdown", + "id": "wireless-mentor", + "metadata": {}, + "source": [ + "Each time you run the `sample` command, you will get a different set of values. The parameters can be used to create new data points:" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, + "id": "historic-waste", "metadata": {}, "outputs": [], - "source": [] + "source": [ + "variable_data_points = triangular_peak(time_points, **parameters)" + ] + }, + { + "cell_type": "markdown", + "id": "negative-treasury", + "metadata": {}, + "source": [ + "And the graph that corresponds with these data points can then be plotted. This time we mention the parameter values in the title of the graph:" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "constant-patch", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "title = parameter_space.format_str().format(**parameters)\n", + "plot(time_points, variable_data_points, title)" + ] + }, + { + "cell_type": "markdown", + "id": "victorian-connection", + "metadata": {}, + "source": [ + "Notice that this graph might have a slightly different shape than the previous one. This depends on the position of the peak. Only when the position of the peak (parameter `placement`) coincides with a time point, will the signal shape be perfectly triangular. But since the peak position now is an arbitrary value, this is usually not the case. And when the peak position does not match a time point, the triangle can be slightly irregular at the top." + ] } ], "metadata": { From 12ff16589fec0d83b6e96d6b3c03b2c98719c4c4 Mon Sep 17 00:00:00 2001 From: Erik Tjong Kim Sang Date: Thu, 25 Mar 2021 23:10:58 +0100 Subject: [PATCH 2/3] added jupyter environment import --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index d988207..6f9d181 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,9 @@ pip install --upgrade pip wheel # (from the repository root directory) # install sequgen + jupyter pip install --requirement requirements.txt + +# add the new local environment to jupyter +ipython kernel install --name sequgen-demo --user ``` Start the notebook server: @@ -43,4 +46,4 @@ Start the notebook server: jupyter lab ``` -It will open a web browser with the Jupyter Lab environment, in file-browser on left side bar open the notebook (*.ipynb files) of interest. +It will open a web browser with the Jupyter Lab environment, in file-browser on left side bar open the notebook (\*.ipynb files) of interest. Select the kernel `sequgen-demo` to run the notebook. From fa9876b74d5799733c682196ee9d281792a47846 Mon Sep 17 00:00:00 2001 From: Erik Tjong Kim Sang Date: Tue, 30 Mar 2021 14:27:42 +0200 Subject: [PATCH 3/3] added headings --- test_mvp.ipynb | 27 ++++----------------------- 1 file changed, 4 insertions(+), 23 deletions(-) diff --git a/test_mvp.ipynb b/test_mvp.ipynb index 5841d54..08fe4b6 100644 --- a/test_mvp.ipynb +++ b/test_mvp.ipynb @@ -2,7 +2,6 @@ "cells": [ { "cell_type": "markdown", - "id": "settled-retro", "metadata": {}, "source": [ "# `sequgen` demo\n", @@ -13,7 +12,6 @@ { "cell_type": "code", "execution_count": 1, - "id": "engaging-liabilities", "metadata": {}, "outputs": [], "source": [ @@ -26,16 +24,16 @@ }, { "cell_type": "markdown", - "id": "stuck-current", "metadata": {}, "source": [ + "## Time series with static parameters\n", + "\n", "The time series will consist of two parts: the time points and the data points. For the time points we want to use space between the numbers 0 and 20. We want to divide that space in 100 equal sections so we need 101 points: 100 at the beginning of each section and 1 and the end of the final section. We can define these time points with this command:" ] }, { "cell_type": "code", "execution_count": 2, - "id": "precise-dublin", "metadata": {}, "outputs": [], "source": [ @@ -44,7 +42,6 @@ }, { "cell_type": "markdown", - "id": "stable-highway", "metadata": {}, "source": [ "We can verify that this process has worked by checking the contents of the variable `time_points`:" @@ -53,7 +50,6 @@ { "cell_type": "code", "execution_count": 3, - "id": "academic-relief", "metadata": {}, "outputs": [ { @@ -82,7 +78,6 @@ }, { "cell_type": "markdown", - "id": "adverse-bunny", "metadata": {}, "source": [ "In this time space, we want to create a triangulary shaped signal starting at time point 5 at value 0, rising to value 1 at time point 6 and dropping back to value 0 at time point 10. The following command can achieve this:" @@ -91,7 +86,6 @@ { "cell_type": "code", "execution_count": 4, - "id": "concrete-collar", "metadata": {}, "outputs": [], "source": [ @@ -100,7 +94,6 @@ }, { "cell_type": "markdown", - "id": "analyzed-truth", "metadata": {}, "source": [ "So we have asked for a triangular peak with height 1, placed at time position 6, where the left part of the triangle has width 1 (so it starts at 5) and the right part has width 4 (so it ends at time point 10). We can check the contents of the variable `data_points` to verify that the command has worked:" @@ -109,7 +102,6 @@ { "cell_type": "code", "execution_count": 5, - "id": "pregnant-tracy", "metadata": {}, "outputs": [ { @@ -138,7 +130,6 @@ }, { "cell_type": "markdown", - "id": "arbitrary-value", "metadata": {}, "source": [ "We notice that the standard value of the data points is zero. Only at the triangle that we have defined the values are non-zero. A graph provides a better view of the shape:" @@ -147,7 +138,6 @@ { "cell_type": "code", "execution_count": 6, - "id": "acknowledged-world", "metadata": {}, "outputs": [ { @@ -176,16 +166,16 @@ }, { "cell_type": "markdown", - "id": "endless-thinking", "metadata": {}, "source": [ + "## Time series with random parameters\n", + "\n", "Often, we want to to allow for some variance in the signal. For example, we could have the height of the peak vary between 1 and 2, the peak position could vary between 3 and 10, the left width of the triangle could vary between 0.5 and 1, and the right width of the triangle could vary between 4 and 6. We can define these variations in a parameter space:" ] }, { "cell_type": "code", "execution_count": 7, - "id": "minute-minister", "metadata": {}, "outputs": [], "source": [ @@ -199,7 +189,6 @@ }, { "cell_type": "markdown", - "id": "infinite-yield", "metadata": {}, "source": [ "Next, we generate a set of arbitrary values based on this parameter space:" @@ -208,7 +197,6 @@ { "cell_type": "code", "execution_count": 8, - "id": "fluid-narrow", "metadata": {}, "outputs": [], "source": [ @@ -217,7 +205,6 @@ }, { "cell_type": "markdown", - "id": "compact-device", "metadata": {}, "source": [ "We can verify that the parameter value generation was successful by checking the value of the `parameters` variable:" @@ -226,7 +213,6 @@ { "cell_type": "code", "execution_count": 9, - "id": "cordless-lover", "metadata": {}, "outputs": [ { @@ -249,7 +235,6 @@ }, { "cell_type": "markdown", - "id": "wireless-mentor", "metadata": {}, "source": [ "Each time you run the `sample` command, you will get a different set of values. The parameters can be used to create new data points:" @@ -258,7 +243,6 @@ { "cell_type": "code", "execution_count": 10, - "id": "historic-waste", "metadata": {}, "outputs": [], "source": [ @@ -267,7 +251,6 @@ }, { "cell_type": "markdown", - "id": "negative-treasury", "metadata": {}, "source": [ "And the graph that corresponds with these data points can then be plotted. This time we mention the parameter values in the title of the graph:" @@ -276,7 +259,6 @@ { "cell_type": "code", "execution_count": 11, - "id": "constant-patch", "metadata": {}, "outputs": [ { @@ -299,7 +281,6 @@ }, { "cell_type": "markdown", - "id": "victorian-connection", "metadata": {}, "source": [ "Notice that this graph might have a slightly different shape than the previous one. This depends on the position of the peak. Only when the position of the peak (parameter `placement`) coincides with a time point, will the signal shape be perfectly triangular. But since the peak position now is an arbitrary value, this is usually not the case. And when the peak position does not match a time point, the triangle can be slightly irregular at the top."