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. diff --git a/test_mvp.ipynb b/test_mvp.ipynb index 64ba8ad..08fe4b6 100644 --- a/test_mvp.ipynb +++ b/test_mvp.ipynb @@ -4,54 +4,145 @@ "cell_type": "markdown", "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, + "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", "metadata": {}, "source": [ - "Print the version of the library as used in this demonstration:" + "## 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": 1, + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "time_points = numpy.linspace(start=0, stop=20, num=101)" + ] + }, + { + "cell_type": "markdown", + "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, "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", "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, + "metadata": {}, + "outputs": [], + "source": [ + "data_points = triangular_peak(time_points, **{'height': 1, 'placement': 6, 'width_base_left': 1, 'width_base_right': 4})" + ] + }, + { + "cell_type": "markdown", + "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, "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", + "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, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", "text/plain": [ "
" ] @@ -63,48 +154,137 @@ } ], "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", + "title = \"triangular graph\"\n", + "plot(time_points, data_points, title)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Time series with random parameters\n", "\n", - "if __name__ == \"__main__\":\n", - " test_mvp()\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, + "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", + "metadata": {}, + "source": [ + "Next, we generate a set of arbitrary values based on this parameter space:" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "parameters = parameter_space.sample()" + ] + }, + { + "cell_type": "markdown", + "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, + "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", + "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, "metadata": {}, "outputs": [], - "source": [] + "source": [ + "variable_data_points = triangular_peak(time_points, **parameters)" + ] + }, + { + "cell_type": "markdown", + "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, + "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", + "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": {