From 7130108a8dd59dccead21d683ab8e1ab5f22b107 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Braulio=20R=C3=ADos?= Date: Thu, 26 Oct 2023 11:50:09 -0300 Subject: [PATCH 1/9] Move graph mode section to the end of user guide --- docs/src/user_guide.ipynb | 2070 +++++++++++++++++++------------------ 1 file changed, 1037 insertions(+), 1033 deletions(-) diff --git a/docs/src/user_guide.ipynb b/docs/src/user_guide.ipynb index 34a55c8e4..d6550666a 100644 --- a/docs/src/user_guide.ipynb +++ b/docs/src/user_guide.ipynb @@ -209,1960 +209,1964 @@ { "attachments": {}, "cell_type": "markdown", - "id": "0dd8a9a5-19b4-4898-b5af-794dbd4ac1eb", - "metadata": {}, + "id": "b73d3011", + "metadata": { + "cell_marker": "\"\"\"", + "lines_to_next_cell": 0 + }, "source": [ - "## Eager mode vs Graph mode\n", "\n", - "Temporian has two execution modes: **eager** and **graph**. In eager mode, operators are applied immediately. This mode is useful for learning Temporian, for iterative and interactive development, and for lightweight/small data use cases where performance isn't a priority.\n", + "## Time units\n", "\n", - "In graph mode, operators are combined together into \"Temporian programs\" before being executed. Graph mode is more efficient and it consumes less memory. Temporian programs can be saved, inspected, and distributed by users.\n", + "In Temporian, times are always represented by a float64 value. Users have the freedom to choose the semantic to this value. For example, the time can be the number of nanoseconds since the start of the day, the number of cycles of a process, the number of years since the big bang, or the number of seconds since January 1, 1970, at 00:00:00 UTC, also known as Unix or POSIX time.\n", "\n", - "Migrating a Temporian program from eager to graph mode is easy and requires little work. Most of the time, adding a `@tp.compile` annotation is enough. Therefore, it is recommended to develop programs in eager mode and then to productize them in graph mode.\n", + "To ease the feature engineering of dates, Temporian contains a set of _calendar operators_. These operators specialize in creating features from dates and datetimes. For instance, the `EventSet.calendar_hour()` operator returns the hour of the date in the range `0-23`.\n", "\n", - "Next, we see a the same program written three times: First, in eager mode, then in graph mode using `@tp.compile`, and finally in graph mode without `@tp.compile`." + "Calendar operators require the time in their inputs to be Unix time, so applying them on non-Unix timestamps will raise errors. Temporian can sometimes automatically recognize if input timestamps correspond to Unix time (e.g. when an `EventSet` is created from a pandas DataFrame with a datetime column, or when passing a list of datetime objects as timestamps in `EventSet`'s constructor). If creating `EventSets` manually and passing floats directly to `timestamps`, you need to explicitly specify whether they correspond to Unix times or not via the `is_unix_timestamp` argument." ] }, { "cell_type": "code", "execution_count": null, - "id": "d5405837-c801-40e9-8b41-4d4dc901d429", + "id": "92ec9711", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:00:57.315244Z", - "iopub.status.busy": "2023-07-24T15:00:57.315083Z", - "iopub.status.idle": "2023-07-24T15:00:57.417894Z", - "shell.execute_reply": "2023-07-24T15:00:57.417481Z" - } + "iopub.execute_input": "2023-07-24T15:00:57.666655Z", + "iopub.status.busy": "2023-07-24T15:00:57.666536Z", + "iopub.status.idle": "2023-07-24T15:00:57.679313Z", + "shell.execute_reply": "2023-07-24T15:00:57.678950Z" + }, + "lines_to_next_cell": 0 }, "outputs": [], "source": [ - "# Eager mode\n", - "#\n", - "# Note: This Temporian program contains three operators: two \"simple_moving_average\" and one \"tp.substract\" operators.\n", - "result = evset.simple_moving_average(window_length=0.5) - evset.simple_moving_average(window_length=1.0)\n", - "result.plot()" + "a_evset = tp.event_set(\n", + " timestamps=[\n", + " pd.to_datetime(\"Monday Mar 13 12:00:00 2023\", utc=True),\n", + " pd.to_datetime(\"Tuesday Mar 14 12:00:00 2023\", utc=True),\n", + " pd.to_datetime(\"Friday Mar 17 00:00:01 2023\", utc=True),\n", + " ],\n", + " features={\n", + " \"feature_1\": [1, 2, 3],\n", + " \"feature_2\": [\"a\", \"b\", \"c\"],\n", + " },\n", + ")\n", + "a_node = a_evset.node()\n", + "b_node = tp.glue(a_node, a_node.calendar_day_of_week())\n", + "b_node.run(a_evset)" ] }, { - "cell_type": "code", - "execution_count": null, - "id": "9c854408-0804-4435-8d44-f521ef1b379e", + "attachments": {}, + "cell_type": "markdown", + "id": "7380c9c7", "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:00:57.420139Z", - "iopub.status.busy": "2023-07-24T15:00:57.419972Z", - "iopub.status.idle": "2023-07-24T15:00:57.522730Z", - "shell.execute_reply": "2023-07-24T15:00:57.522286Z" - } + "cell_marker": "\"\"\"", + "lines_to_next_cell": 0 }, - "outputs": [], "source": [ - "# Graph mode with @tp.compile\n", "\n", - "@tp.compile\n", - "def my_function(x):\n", - " return x.simple_moving_average(window_length=0.5) - x.simple_moving_average(window_length=1.0)\n", + "Temporian accepts time inputs in various formats, including integer, float, Python date or datetime, NumPy datetime, and pandas datetime. Date and datetime objects are internally converted to floats as Unix time in seconds, compatible with the calendar operators.\n", "\n", - "result = my_function(evset)\n", - " \n", - "result.plot()" + "Operators can take _durations_ as input arguments. For example, the simple moving average operator takes a `window_length` argument. Temporian exposes several utility functions to help creating those duration arguments when using Unix timestamps:" ] }, { "cell_type": "code", "execution_count": null, - "id": "e4aa008f-aa8e-486f-a96c-854fb5b2bd83", + "id": "508c3f0c", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:00:57.525125Z", - "iopub.status.busy": "2023-07-24T15:00:57.524948Z", - "iopub.status.idle": "2023-07-24T15:00:57.629039Z", - "shell.execute_reply": "2023-07-24T15:00:57.628643Z" + "iopub.execute_input": "2023-07-24T15:00:57.681429Z", + "iopub.status.busy": "2023-07-24T15:00:57.681281Z", + "iopub.status.idle": "2023-07-24T15:00:57.684114Z", + "shell.execute_reply": "2023-07-24T15:00:57.683752Z" } }, "outputs": [], "source": [ - "# Graph model without @tp.compile\n", + "a = tp.input_node(features=[(\"feature_1\", tp.float64)])\n", "\n", - "input_node = tp.input_node([(\"value\", tp.float64)])\n", - "# Or input_node = tp.input_node(evset.schema.features)\n", + "# Define a 1-day moving average.\n", + "b = a.simple_moving_average(window_length=tp.duration.days(1))\n", "\n", - "result_node = input_node.simple_moving_average(window_length=0.5) - input_node.simple_moving_average(window_length=1.0)\n", - "result = tp.run(result_node, {input_node: evset}, verbose=1)\n", - " \n", - "result.plot()" + "# Equivalent.\n", + "b = a.simple_moving_average(window_length=24 * 60 * 60)" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "a6a5a017-9dbe-4782-bc73-9b278ec622b0", - "metadata": {}, + "id": "6c99993c", + "metadata": { + "cell_marker": "\"\"\"", + "lines_to_next_cell": 0 + }, "source": [ - "## More on graph mode\n", - "\n", - "**Remark:** While you will likely use the graph mode with `@tp.compile` , it is useful for you to understand the graph model without `@tp.compile`.\n", - "\n", - "A Temporian program is a graph of [EventSetNodes][temporian.EventSetNode] connecting operators. A graph is executed with the function `tp.run(, )`.\n", "\n", - "\"eager\n", + "## Plotting\n", "\n", - "The `` can be specified as an `EventSetNode`, a list of `EventSetNodes`, or a dictionary of names to `EventSetNodes`, and the result of `tp.run()` will be of the same type. For example, if `` is a list of three `EventSetNodes`, the result will be a list of the three corresponding `EventSets`.\n", + "Data visualization is crucial for gaining insights into data and the system it represents. It also helps in detecting unexpected behavior and issues, making debugging and iterative development easier.\n", "\n", - "The `` can be specified as:\n", + "Temporian provides two plotting functions for data visualization: `evset.plot()` and `tp.plot()`.\n", "\n", - "- A dictionary of `EventSetNodes` to `EventSets`, or \n", - "- A dictionary of names to `EventSets`, or,\n", - "- A list of `EventSets`, or\n", - "- A single `EventSet`\n", + "The `evset.plot()` function is shorter to write and is used for displaying a single `EventSet`, while the `tp.plot()` function is used for displaying multiple `EventSets` together. This function is particularly useful when `EventSets` are indexed (see [Index, horizontal and vertical operators](#indexes-horizontal-and-vertical-operators)) or have different samplings (see [Sampling](#sampling)).\n", "\n", - "This lets Temporian know the `EventSetNodes` of the graph that each input `EventSet` corresponds to. If `` is a dictionary of names to `EventSets`, the names must match the names of `EventSetNodes` in the graph. If `` is a list or a single `EventSet`, the names of those `EventSets` must do the same. If we specify the inputs as a dictionary, we could skip passing a name to `a_evset`." + "Here's an example of using the `evset.plot()` function:" ] }, { "cell_type": "code", "execution_count": null, - "id": "dd4142a0-df47-4ca3-aafe-7a105b4f2deb", + "id": "cbf42f42", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:00:57.631693Z", - "iopub.status.busy": "2023-07-24T15:00:57.631532Z", - "iopub.status.idle": "2023-07-24T15:00:57.636094Z", - "shell.execute_reply": "2023-07-24T15:00:57.635717Z" + "iopub.execute_input": "2023-07-24T15:00:57.686202Z", + "iopub.status.busy": "2023-07-24T15:00:57.685957Z", + "iopub.status.idle": "2023-07-24T15:00:57.884670Z", + "shell.execute_reply": "2023-07-24T15:00:57.884262Z" } }, "outputs": [], "source": [ - "input_node = tp.input_node([(\"value\", tp.float64)])\n", - "result_1_node = input_node.simple_moving_average(window_length=0.5)\n", - "result_2_node = input_node.simple_moving_average(window_length=1.0)\n", - "result_3_node = result_1_node - result_2_node\n", - "\n", - "result = tp.run([result_1_node,result_2_node, result_3_node], {input_node: evset})\n", - " \n", - "print(result)" + "evset = tp.event_set(\n", + "\ttimestamps=[1, 2, 3, 4, 5],\n", + "\tfeatures={\n", + " \"feature_1\": [0.5, 0.6, 0.4, 0.4, 0.9],\n", + " \"feature_2\": [\"red\", \"blue\", \"red\", \"blue\", \"green\"]\n", + " }\n", + ")\n", + "evset.plot()" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "32dd49a8-8847-4df1-be17-b844b92f4211", - "metadata": {}, + "id": "39dc9a92", + "metadata": { + "cell_marker": "\"\"\"", + "lines_to_next_cell": 0 + }, "source": [ - "**Remarks:**\n", "\n", - "- It's important to distinguish between a `tp.EventSet`, such as `evset`, that contains data, and a `tp.EventSetNode`, like `input_node`, that connect operators together and compose the computation graph, but do not contain data.\n", - "- No computation is performed when defining the graph (i.e., when calling the operator functions). All computation is done during `tp.run()`.\n", - "- In `tp.run()`, the second argument defines a mapping between input `EventSetNodes` and `EventSets`. If all necessary input `EventSetNodes` are not fed, an error will be raised.\n", - "- In most cases you will only pass `EventSets` that correspond to the graph's input `EventSetNodes`, but Temporian also supports passing `EventSets` to intermediate `EventSetNodes` in the graph." + "By default, the plotting style is selected automatically based on the data.\n", + "\n", + "For example, uniformly sampled numerical features (i.e., time series) are plotted with a continuous line, while non-uniformly sampled values are plotted with markers. Those and other behaviors can be controlled via the function's arguments.\n", + "\n", + "Here's an example of using the `evset.plot()` function with options:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "82552e04", + "metadata": { + "execution": { + "iopub.execute_input": "2023-07-24T15:00:57.887017Z", + "iopub.status.busy": "2023-07-24T15:00:57.886848Z", + "iopub.status.idle": "2023-07-24T15:00:58.113203Z", + "shell.execute_reply": "2023-07-24T15:00:58.112793Z" + } + }, + "outputs": [], + "source": [ + "figure = evset.plot(\n", + " style=\"marker\",\n", + " width_px=400,\n", + " min_time=2,\n", + " max_time=10,\n", + " return_fig=True,\n", + ")" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "c7e808b2-4091-447a-a6a5-66fcf5f037a9", - "metadata": {}, + "id": "37bd0475", + "metadata": { + "cell_marker": "\"\"\"", + "lines_to_next_cell": 0 + }, "source": [ - "The `@tp.compile` annotation takes a function inputing and outputing `tp.EventSetNode`, and automatically calls `tp.run` on the result of the function if a `tp.EventSet` is provided as input." + "\n", + "The plots are static images by default. However, interactive plotting can be very powerful. To enable interactive plotting, use `interactive=True`. Note that interactive plotting requires the `bokeh` Python library to be installed." ] }, { "cell_type": "code", "execution_count": null, - "id": "b0b0220b-9869-454c-8f3b-afeabaca06bc", + "id": "37feddd0", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:00:57.638508Z", - "iopub.status.busy": "2023-07-24T15:00:57.638232Z", - "iopub.status.idle": "2023-07-24T15:00:57.642016Z", - "shell.execute_reply": "2023-07-24T15:00:57.641623Z" + "iopub.execute_input": "2023-07-24T15:00:58.115589Z", + "iopub.status.busy": "2023-07-24T15:00:58.115426Z", + "iopub.status.idle": "2023-07-24T15:01:00.005021Z", + "shell.execute_reply": "2023-07-24T15:01:00.004601Z" } }, "outputs": [], "source": [ - "@tp.compile\n", - "def my_function(x : tp.types.EventSetOrNode) -> tp.types.EventSetOrNode:\n", - " return x.simple_moving_average(window_length=0.5)\n", - "\n", - "# Feeding an EventSet\n", - "input_evset = tp.event_set(timestamps=[1, 2, 3],features={\"value\": [5., 6., 7.]})\n", - "assert isinstance(my_function(input_evset), tp.EventSet)\n", + "!pip install bokeh -q\n", "\n", - "# Feeding an EventSetNode\n", - "input_node = tp.input_node([(\"value\", tp.float64)])\n", - "assert isinstance(my_function(input_node), tp.EventSetNode)" + "evset.plot(interactive=True)" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "c0f02853-718f-4c9e-8945-b25e74b548ae", - "metadata": {}, + "id": "cf4d0c27", + "metadata": { + "cell_marker": "\"\"\"", + "lines_to_next_cell": 0 + }, "source": [ - "Importantly, variables in a `tp.compile` function are `EventSetNode` and not `EventSet`. Therefore, you cannot directly access the event set data.\n", "\n", - "In addition, the compiled function execution first generates the graph. The graph is then executed. In the next example, the compiled function generates a graph with 10 operators." + "## Feature naming\n", + "\n", + "Each feature is identified by a name, and the list of features is available through the `features` property of an `EventSetNode`." ] }, { "cell_type": "code", "execution_count": null, - "id": "945d8f39-18ad-44df-a4d2-9d8986e7825b", + "id": "38ff0e20", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:00:57.644118Z", - "iopub.status.busy": "2023-07-24T15:00:57.643976Z", - "iopub.status.idle": "2023-07-24T15:00:57.646561Z", - "shell.execute_reply": "2023-07-24T15:00:57.646187Z" + "iopub.execute_input": "2023-07-24T15:01:00.007393Z", + "iopub.status.busy": "2023-07-24T15:01:00.007171Z", + "iopub.status.idle": "2023-07-24T15:01:00.010463Z", + "shell.execute_reply": "2023-07-24T15:01:00.010135Z" } }, "outputs": [], "source": [ - "@tp.compile\n", - "def my_function(x : tp.EventSetNode) -> tp.EventSetNode:\n", - " for i in range(10):\n", - " x = x.simple_moving_average(window_length=i+1)\n", - " return x" + "events = tp.event_set(\n", + "\ttimestamps=[1,2,3,4,5],\n", + "\tfeatures={\n", + "\t \"feature_1\": [0.5, 0.6, 0.4, 0.4, 0.9],\n", + "\t \"feature_2\": [1.0, 2.0, 3.0, 2.0, 1.0]}\n", + " )\n", + "node = events.node()\n", + "print(node.features)" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "4c46c4ee-a8ff-4b9b-9ced-acbee202d0a3", - "metadata": {}, + "id": "2cd29020", + "metadata": { + "cell_marker": "\"\"\"", + "lines_to_next_cell": 0 + }, "source": [ - "You can create a compiled function with a `if`. However, the condition of the `if` cannot depend on the EventSet data." + "\n", + "Most operators do not change the input feature's names." ] }, { "cell_type": "code", "execution_count": null, - "id": "941a5fc4-edfc-4fba-8bc8-22f3a7387e91", + "id": "838449d4", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:00:57.648616Z", - "iopub.status.busy": "2023-07-24T15:00:57.648475Z", - "iopub.status.idle": "2023-07-24T15:00:57.651921Z", - "shell.execute_reply": "2023-07-24T15:00:57.651456Z" + "iopub.execute_input": "2023-07-24T15:01:00.012599Z", + "iopub.status.busy": "2023-07-24T15:01:00.012475Z", + "iopub.status.idle": "2023-07-24T15:01:00.015736Z", + "shell.execute_reply": "2023-07-24T15:01:00.015395Z" } }, "outputs": [], "source": [ - "@tp.compile\n", - "def my_function(x : tp.types.EventSetOrNode, a:bool) -> tp.types.EventSetOrNode:\n", - " if a:\n", - " return x.rename(\"a_branch\")\n", - " else:\n", - " return x.rename(\"non_a_branch\")\n", - "\n", - "print(my_function(input_evset, a=True).schema.features)\n", - "\n", - "print(my_function(input_evset, a=False).schema.features)" + "node.moving_sum(window_length=10).features" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "3bf624e6-6b1c-4806-8024-8beebd30fc0b", - "metadata": {}, + "id": "b70cc298", + "metadata": { + "cell_marker": "\"\"\"", + "lines_to_next_cell": 0 + }, "source": [ - "If you want to create a program conditional on EventSet data, you can use `EventSet.filter()`." + "\n", + "Some operators combine two input features with different names, in which case the output name is also combined." ] }, { "cell_type": "code", "execution_count": null, - "id": "a9ab68f3-91a6-445e-99c2-7f2379185f21", + "id": "b10fdec3", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:00:57.654090Z", - "iopub.status.busy": "2023-07-24T15:00:57.653930Z", - "iopub.status.idle": "2023-07-24T15:00:57.658773Z", - "shell.execute_reply": "2023-07-24T15:00:57.658419Z" + "iopub.execute_input": "2023-07-24T15:01:00.017898Z", + "iopub.status.busy": "2023-07-24T15:01:00.017753Z", + "iopub.status.idle": "2023-07-24T15:01:00.021061Z", + "shell.execute_reply": "2023-07-24T15:01:00.020666Z" } }, "outputs": [], "source": [ - "@tp.compile\n", - "def my_function(x : tp.types.EventSetOrNode) -> tp.types.EventSetOrNode:\n", - " return x[\"value\"].filter(x[\"condition\"])\n", - "\n", - "my_function(tp.event_set(\n", - "\ttimestamps=[1,2,3],\n", - "\tfeatures={\n", - " \"value\": [10, 11, 12],\n", - " \"condition\":[True, True, False]}\n", - "))" + "result = node[\"feature_1\"] * node[\"feature_2\"]\n", + "result.features" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "c7ef8b32-a08d-46e2-aa8e-5cad3d5421e0", - "metadata": {}, + "id": "87731369", + "metadata": { + "cell_marker": "\"\"\"", + "lines_to_next_cell": 0 + }, "source": [ - "To simplify its usage when the graph contains a single output `EventSetNode`, `node.run(...)` is equivalent to `tp.run(node, ...)`." + "\n", + "The calendar operators don't depend on input features but on the timestamps, so the output feature name doesn't\n", + "relate to the input feature names." ] }, { - "attachments": {}, - "cell_type": "markdown", - "id": "afa9c5d2-1efe-440d-bf45-366c0b389b5a", - "metadata": {}, + "cell_type": "code", + "execution_count": null, + "id": "4182d3f8", + "metadata": { + "execution": { + "iopub.execute_input": "2023-07-24T15:01:00.023467Z", + "iopub.status.busy": "2023-07-24T15:01:00.023325Z", + "iopub.status.idle": "2023-07-24T15:01:00.026531Z", + "shell.execute_reply": "2023-07-24T15:01:00.026132Z" + } + }, + "outputs": [], "source": [ - "\n", - "\n", - "\n", - "**Warning:** It is more efficient to run multiple output `EventSetNodes` together with `tp.run()` than to run them separately with `node_1.run(...)`, `node_2.run(...)`, etc." + "date_events = tp.event_set(\n", + "\ttimestamps=[\"2020-02-15\", \"2020-06-20\"],\n", + "\tfeatures={\"some_feature\": [10, 20]}\n", + " )\n", + "date_node = date_events.node()\n", + "print(date_node.calendar_month().features)" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "d78f320b", + "id": "61127d7f", "metadata": { "cell_marker": "\"\"\"", "lines_to_next_cell": 0 }, "source": [ - "Previously, we defined the input of the graph with `tp.input_node()`. This way of listing features manually and their respective data type is cumbersome.\n", "\n", - "If an `EventSet` is available (i.e., data is available) this step can be changed to use `evset.node()` instead, which will return an `EventSetNode` that is compatible with it. This is especially useful when creating `EventSets` from existing data, such as pandas DataFrames or CSV files." + "You can modify feature names using the `EventSet.rename()` and `EventSet.prefix()` operators. `EventSet.rename()` changes the name of features, while `EventSet.prefix()` adds a prefix in front of existing feature names. Note that they do not modify the content of the input `EventSet`, but return a new one with the modified feature names." ] }, { "cell_type": "code", "execution_count": null, - "id": "d4fc33b0", + "id": "bc36bc1f", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:00:57.661104Z", - "iopub.status.busy": "2023-07-24T15:00:57.660955Z", - "iopub.status.idle": "2023-07-24T15:00:57.664631Z", - "shell.execute_reply": "2023-07-24T15:00:57.664234Z" - }, - "lines_to_next_cell": 0 + "iopub.execute_input": "2023-07-24T15:01:00.029017Z", + "iopub.status.busy": "2023-07-24T15:01:00.028848Z", + "iopub.status.idle": "2023-07-24T15:01:00.031960Z", + "shell.execute_reply": "2023-07-24T15:01:00.031429Z" + } }, "outputs": [], "source": [ - "# Define an EventSet.\n", - "a_evset = tp.event_set(\n", - "\ttimestamps=[0, 1, 2],\n", - "\tfeatures={\n", - " \"feature_1\": [1.0, 2.0, 3.0],\n", - " \"feature_2\": [\"hello\", \"little\", \"dog\"],\n", - " \"feature_3\": [\"A\", \"A\", \"B\"],\n", - "\t}\n", - ")\n", - "\n", - "# The following three statements are (almost) equivalent.\n", - "a_node = tp.input_node(\n", - " features=[\n", - " (\"feature_1\", tp.float64),\n", - " (\"feature_2\", tp.str_),\n", - " ],\n", - " indexes=[(\"feature_3\", tp.str_)])\n", - "\n", - "a_node = tp.input_node(\n", - " features=a_evset.schema.features,\n", - " indexes=a_evset.schema.indexes\n", + "# Rename a single feature.\n", + "renamed_f1 = node[\"feature_1\"].rename(\"renamed_1\")\n", + "print(renamed_f1.features)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a44f6e7a", + "metadata": { + "execution": { + "iopub.execute_input": "2023-07-24T15:01:00.042574Z", + "iopub.status.busy": "2023-07-24T15:01:00.042259Z", + "iopub.status.idle": "2023-07-24T15:01:00.045691Z", + "shell.execute_reply": "2023-07-24T15:01:00.044933Z" + } + }, + "outputs": [], + "source": [ + "# Rename all features.\n", + "renamed_node = node.rename(\n", + " {\"feature_1\": \"renamed_1\", \"feature_2\": \"renamed_2\"}\n", ")\n", - " \n", - "a_node = a_evset.node()" + "print(renamed_node.features)" ] }, { - "attachments": {}, - "cell_type": "markdown", - "id": "b73d3011", + "cell_type": "code", + "execution_count": null, + "id": "af6103fc", "metadata": { - "cell_marker": "\"\"\"", - "lines_to_next_cell": 0 + "execution": { + "iopub.execute_input": "2023-07-24T15:01:00.048841Z", + "iopub.status.busy": "2023-07-24T15:01:00.048430Z", + "iopub.status.idle": "2023-07-24T15:01:00.051757Z", + "shell.execute_reply": "2023-07-24T15:01:00.051319Z" + } }, + "outputs": [], "source": [ - "\n", - "## Time units\n", - "\n", - "In Temporian, times are always represented by a float64 value. Users have the freedom to choose the semantic to this value. For example, the time can be the number of nanoseconds since the start of the day, the number of cycles of a process, the number of years since the big bang, or the number of seconds since January 1, 1970, at 00:00:00 UTC, also known as Unix or POSIX time.\n", - "\n", - "To ease the feature engineering of dates, Temporian contains a set of _calendar operators_. These operators specialize in creating features from dates and datetimes. For instance, the `EventSet.calendar_hour()` operator returns the hour of the date in the range `0-23`.\n", - "\n", - "Calendar operators require the time in their inputs to be Unix time, so applying them on non-Unix timestamps will raise errors. Temporian can sometimes automatically recognize if input timestamps correspond to Unix time (e.g. when an `EventSet` is created from a pandas DataFrame with a datetime column, or when passing a list of datetime objects as timestamps in `EventSet`'s constructor). If creating `EventSets` manually and passing floats directly to `timestamps`, you need to explicitly specify whether they correspond to Unix times or not via the `is_unix_timestamp` argument." + "# Prefix a single feature.\n", + "prefixed_f1 = node[\"feature_1\"].prefix(\"prefixed.\")\n", + "print(prefixed_f1.features)" ] }, { "cell_type": "code", "execution_count": null, - "id": "92ec9711", + "id": "3126cbed", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:00:57.666655Z", - "iopub.status.busy": "2023-07-24T15:00:57.666536Z", - "iopub.status.idle": "2023-07-24T15:00:57.679313Z", - "shell.execute_reply": "2023-07-24T15:00:57.678950Z" - }, - "lines_to_next_cell": 0 + "iopub.execute_input": "2023-07-24T15:01:00.053697Z", + "iopub.status.busy": "2023-07-24T15:01:00.053582Z", + "iopub.status.idle": "2023-07-24T15:01:00.056089Z", + "shell.execute_reply": "2023-07-24T15:01:00.055703Z" + } }, "outputs": [], "source": [ - "a_evset = tp.event_set(\n", - " timestamps=[\n", - " pd.to_datetime(\"Monday Mar 13 12:00:00 2023\", utc=True),\n", - " pd.to_datetime(\"Tuesday Mar 14 12:00:00 2023\", utc=True),\n", - " pd.to_datetime(\"Friday Mar 17 00:00:01 2023\", utc=True),\n", - " ],\n", - " features={\n", - " \"feature_1\": [1, 2, 3],\n", - " \"feature_2\": [\"a\", \"b\", \"c\"],\n", - " },\n", - ")\n", - "a_node = a_evset.node()\n", - "b_node = tp.glue(a_node, a_node.calendar_day_of_week())\n", - "b_node.run(a_evset)" + "# Prefix all features.\n", + "prefixed_node = node.prefix(\"prefixed.\")\n", + "print(prefixed_node.features)" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "7380c9c7", + "id": "085e79c3", "metadata": { "cell_marker": "\"\"\"", "lines_to_next_cell": 0 }, "source": [ "\n", - "Temporian accepts time inputs in various formats, including integer, float, Python date or datetime, NumPy datetime, and pandas datetime. Date and datetime objects are internally converted to floats as Unix time in seconds, compatible with the calendar operators.\n", - "\n", - "Operators can take _durations_ as input arguments. For example, the simple moving average operator takes a `window_length` argument. Temporian exposes several utility functions to help creating those duration arguments when using Unix timestamps:" + "It is recommended to use `EventSet.rename()` and `EventSet.prefix()` to organize your data, and avoid duplicated feature names." ] }, { "cell_type": "code", "execution_count": null, - "id": "508c3f0c", + "id": "852abbdd", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:00:57.681429Z", - "iopub.status.busy": "2023-07-24T15:00:57.681281Z", - "iopub.status.idle": "2023-07-24T15:00:57.684114Z", - "shell.execute_reply": "2023-07-24T15:00:57.683752Z" + "iopub.execute_input": "2023-07-24T15:01:00.058375Z", + "iopub.status.busy": "2023-07-24T15:01:00.058188Z", + "iopub.status.idle": "2023-07-24T15:01:00.061323Z", + "shell.execute_reply": "2023-07-24T15:01:00.060844Z" } }, "outputs": [], "source": [ - "a = tp.input_node(features=[(\"feature_1\", tp.float64)])\n", - "\n", - "# Define a 1-day moving average.\n", - "b = a.simple_moving_average(window_length=tp.duration.days(1))\n", - "\n", - "# Equivalent.\n", - "b = a.simple_moving_average(window_length=24 * 60 * 60)" + "sma_7_node = node.simple_moving_average(tp.duration.days(7)).prefix(\"sma_7.\")\n", + "sma_14_node = node.simple_moving_average(tp.duration.days(14)).prefix(\"sma_14.\")" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "6c99993c", + "id": "ac25eb4a", "metadata": { "cell_marker": "\"\"\"", "lines_to_next_cell": 0 }, "source": [ "\n", - "## Plotting\n", - "\n", - "Data visualization is crucial for gaining insights into data and the system it represents. It also helps in detecting unexpected behavior and issues, making debugging and iterative development easier.\n", - "\n", - "Temporian provides two plotting functions for data visualization: `evset.plot()` and `tp.plot()`.\n", - "\n", - "The `evset.plot()` function is shorter to write and is used for displaying a single `EventSet`, while the `tp.plot()` function is used for displaying multiple `EventSets` together. This function is particularly useful when `EventSets` are indexed (see [Index, horizontal and vertical operators](#indexes-horizontal-and-vertical-operators)) or have different samplings (see [Sampling](#sampling)).\n", - "\n", - "Here's an example of using the `evset.plot()` function:" + "The `tp.glue()` operator can be used to concatenate different features into a single `EventSetNode`, but it will fail if two features with the same name are provided. The following pattern is commonly used in Temporian programs." ] }, { "cell_type": "code", "execution_count": null, - "id": "cbf42f42", + "id": "f7d85e33", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:00:57.686202Z", - "iopub.status.busy": "2023-07-24T15:00:57.685957Z", - "iopub.status.idle": "2023-07-24T15:00:57.884670Z", - "shell.execute_reply": "2023-07-24T15:00:57.884262Z" + "iopub.execute_input": "2023-07-24T15:01:00.063510Z", + "iopub.status.busy": "2023-07-24T15:01:00.063393Z", + "iopub.status.idle": "2023-07-24T15:01:00.067035Z", + "shell.execute_reply": "2023-07-24T15:01:00.066516Z" } }, "outputs": [], "source": [ - "evset = tp.event_set(\n", - "\ttimestamps=[1, 2, 3, 4, 5],\n", - "\tfeatures={\n", - " \"feature_1\": [0.5, 0.6, 0.4, 0.4, 0.9],\n", - " \"feature_2\": [\"red\", \"blue\", \"red\", \"blue\", \"green\"]\n", - " }\n", - ")\n", - "evset.plot()" + "result = tp.glue(\n", + " node.simple_moving_average(tp.duration.days(7)).prefix(\"sma_7.\"),\n", + " node.simple_moving_average(tp.duration.days(14)).prefix(\"sma_14.\"),\n", + ")" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "39dc9a92", + "id": "749df3cc", "metadata": { "cell_marker": "\"\"\"", "lines_to_next_cell": 0 }, "source": [ "\n", - "By default, the plotting style is selected automatically based on the data.\n", - "\n", - "For example, uniformly sampled numerical features (i.e., time series) are plotted with a continuous line, while non-uniformly sampled values are plotted with markers. Those and other behaviors can be controlled via the function's arguments.\n", + "## Casting\n", "\n", - "Here's an example of using the `evset.plot()` function with options:" + "Temporian is strict on feature data types (also called dtype). This means that often, you cannot perform operations between features of different types. For example, you cannot subtract a `tp.float32` and a `tp.float64`. Instead, you must manually cast the features to the same type before performing the operation." ] }, { "cell_type": "code", "execution_count": null, - "id": "82552e04", + "id": "e1276be1", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:00:57.887017Z", - "iopub.status.busy": "2023-07-24T15:00:57.886848Z", - "iopub.status.idle": "2023-07-24T15:00:58.113203Z", - "shell.execute_reply": "2023-07-24T15:00:58.112793Z" + "iopub.execute_input": "2023-07-24T15:01:00.069531Z", + "iopub.status.busy": "2023-07-24T15:01:00.069387Z", + "iopub.status.idle": "2023-07-24T15:01:00.072411Z", + "shell.execute_reply": "2023-07-24T15:01:00.071968Z" } }, "outputs": [], "source": [ - "figure = evset.plot(\n", - " style=\"marker\",\n", - " width_px=400,\n", - " min_time=2,\n", - " max_time=10,\n", - " return_fig=True,\n", - ")" + "node = tp.input_node(features=[(\"f1\", tp.float32), (\"f2\", tp.float64)])\n", + "added = node[\"f1\"].cast(tp.float64) + node[\"f2\"]" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "37bd0475", + "id": "d45a37bb", "metadata": { - "cell_marker": "\"\"\"", "lines_to_next_cell": 0 }, "source": [ "\n", - "The plots are static images by default. However, interactive plotting can be very powerful. To enable interactive plotting, use `interactive=True`. Note that interactive plotting requires the `bokeh` Python library to be installed." + "Casting is especially useful to reduce memory usage. For example, if a feature only contains values between 0 and 10000, using `tp.int32` instead of `tp.int64` will halve memory usage. These optimizations are critical when working with large datasets.\n", + "\n", + "Casting can also be a necessary step before calling operators that only accept certain input data types.\n", + "\n", + "Note that in Python, the values `1.0` and `1` are respectively `float64` and `int64`.\n", + "\n", + "Temporian supports data type casting through the `EventSet.cast()` operator. Destination data types can be specified in three different ways:\n", + "\n", + "1. Single data type: converts all input features to the same destination data type.\n", + "\n", + " " ] }, { "cell_type": "code", "execution_count": null, - "id": "37feddd0", + "id": "3e3ee4c4", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:00:58.115589Z", - "iopub.status.busy": "2023-07-24T15:00:58.115426Z", - "iopub.status.idle": "2023-07-24T15:01:00.005021Z", - "shell.execute_reply": "2023-07-24T15:01:00.004601Z" + "iopub.execute_input": "2023-07-24T15:01:00.074589Z", + "iopub.status.busy": "2023-07-24T15:01:00.074466Z", + "iopub.status.idle": "2023-07-24T15:01:00.077932Z", + "shell.execute_reply": "2023-07-24T15:01:00.077413Z" + }, + "lines_to_next_cell": 0 + }, + "outputs": [], + "source": [ + "node.features" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "6c2444ba", + "metadata": { + "execution": { + "iopub.execute_input": "2023-07-24T15:01:00.080190Z", + "iopub.status.busy": "2023-07-24T15:01:00.079991Z", + "iopub.status.idle": "2023-07-24T15:01:00.082867Z", + "shell.execute_reply": "2023-07-24T15:01:00.082457Z" } }, "outputs": [], "source": [ - "!pip install bokeh -q\n", - "\n", - "evset.plot(interactive=True)" + "print(node.cast(tp.str_).features)" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "cf4d0c27", + "id": "59c449d9", "metadata": { "cell_marker": "\"\"\"", "lines_to_next_cell": 0 }, "source": [ "\n", - "## Feature naming\n", - "\n", - "Each feature is identified by a name, and the list of features is available through the `features` property of an `EventSetNode`." + "2. Feature name to data type mapping: converts each feature (specified by name) to a specific data type." ] }, { "cell_type": "code", "execution_count": null, - "id": "38ff0e20", + "id": "05ee00a7", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.007393Z", - "iopub.status.busy": "2023-07-24T15:01:00.007171Z", - "iopub.status.idle": "2023-07-24T15:01:00.010463Z", - "shell.execute_reply": "2023-07-24T15:01:00.010135Z" + "iopub.execute_input": "2023-07-24T15:01:00.085010Z", + "iopub.status.busy": "2023-07-24T15:01:00.084841Z", + "iopub.status.idle": "2023-07-24T15:01:00.087364Z", + "shell.execute_reply": "2023-07-24T15:01:00.087026Z" } }, "outputs": [], "source": [ - "events = tp.event_set(\n", - "\ttimestamps=[1,2,3,4,5],\n", - "\tfeatures={\n", - "\t \"feature_1\": [0.5, 0.6, 0.4, 0.4, 0.9],\n", - "\t \"feature_2\": [1.0, 2.0, 3.0, 2.0, 1.0]}\n", - " )\n", - "node = events.node()\n", - "print(node.features)" + "print(node.cast({\"f1\": tp.str_, \"f2\": tp.int64}).features)" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "2cd29020", + "id": "3f85a531", "metadata": { "cell_marker": "\"\"\"", "lines_to_next_cell": 0 }, "source": [ "\n", - "Most operators do not change the input feature's names." + "3. Data type to data type mapping: converts all features of a specific data type to another data type." ] }, { "cell_type": "code", "execution_count": null, - "id": "838449d4", + "id": "6deaff88", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.012599Z", - "iopub.status.busy": "2023-07-24T15:01:00.012475Z", - "iopub.status.idle": "2023-07-24T15:01:00.015736Z", - "shell.execute_reply": "2023-07-24T15:01:00.015395Z" + "iopub.execute_input": "2023-07-24T15:01:00.089508Z", + "iopub.status.busy": "2023-07-24T15:01:00.089353Z", + "iopub.status.idle": "2023-07-24T15:01:00.091835Z", + "shell.execute_reply": "2023-07-24T15:01:00.091498Z" } }, "outputs": [], "source": [ - "node.moving_sum(window_length=10).features" + "print(node.cast({tp.float32: tp.str_, tp.float64: tp.int64}).features)" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "b70cc298", + "id": "915df6c5", "metadata": { "cell_marker": "\"\"\"", "lines_to_next_cell": 0 }, "source": [ "\n", - "Some operators combine two input features with different names, in which case the output name is also combined." + "Keep in mind that casting may fail when the graph is evaluated. For instance, attempting to cast `\"word\"` to `tp.float64` will result in an error. These errors cannot be caught prior to graph evaluation.\n", + "\n", + "## Arithmetic operators\n", + "\n", + "Arithmetic operators can be used between the features of an `EventSetNode`, to perform element-wise calculations.\n", + "\n", + "Common mathematical and bit operations are supported, such as addition (`+`), subtraction (`-`), product (`*`), division (`/`), floor division (`//`), modulo (`%`), comparisons (`>, >=, <, <=`), and bitwise operators (`&, |, ~`).\n", + "\n", + "These operators are applied index-wise and timestamp-wise, between features in the same position." ] }, { "cell_type": "code", "execution_count": null, - "id": "b10fdec3", + "id": "2c673b17", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.017898Z", - "iopub.status.busy": "2023-07-24T15:01:00.017753Z", - "iopub.status.idle": "2023-07-24T15:01:00.021061Z", - "shell.execute_reply": "2023-07-24T15:01:00.020666Z" - } + "iopub.execute_input": "2023-07-24T15:01:00.094177Z", + "iopub.status.busy": "2023-07-24T15:01:00.094010Z", + "iopub.status.idle": "2023-07-24T15:01:00.098574Z", + "shell.execute_reply": "2023-07-24T15:01:00.098140Z" + }, + "lines_to_next_cell": 0 }, "outputs": [], "source": [ - "result = node[\"feature_1\"] * node[\"feature_2\"]\n", - "result.features" + "evset = tp.event_set(\n", + " timestamps=[1, 10],\n", + " features={\n", + " \"f1\": [0, 1],\n", + " \"f2\": [10.0, 20.0],\n", + " \"f3\": [100, 100],\n", + " \"f4\": [1000.0, 1000.0],\n", + " },\n", + ")\n", + "node = evset.node()\n", + "\n", + "node_added = node[[\"f1\", \"f2\"]] + node[[\"f3\", \"f4\"]]\n", + "\n", + "evset_added = node_added.run(evset)\n", + "print(evset_added)" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "87731369", + "id": "03bd54cc", "metadata": { "cell_marker": "\"\"\"", "lines_to_next_cell": 0 }, "source": [ - "\n", - "The calendar operators don't depend on input features but on the timestamps, so the output feature name doesn't\n", - "relate to the input feature names." + "Note that features of type `int64` and `float64` are not mixed above, because otherwise the operation would fail without an explicit type cast." ] }, { - "cell_type": "code", - "execution_count": null, - "id": "4182d3f8", + "attachments": {}, + "cell_type": "markdown", + "id": "1675fa25", "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.023467Z", - "iopub.status.busy": "2023-07-24T15:01:00.023325Z", - "iopub.status.idle": "2023-07-24T15:01:00.026531Z", - "shell.execute_reply": "2023-07-24T15:01:00.026132Z" - } + "cell_marker": "\"\"\"", + "lines_to_next_cell": 0 }, - "outputs": [], "source": [ - "date_events = tp.event_set(\n", - "\ttimestamps=[\"2020-02-15\", \"2020-06-20\"],\n", - "\tfeatures={\"some_feature\": [10, 20]}\n", - " )\n", - "date_node = date_events.node()\n", - "print(date_node.calendar_month().features)" + "```python\n", + ">>> node[\"f1\"] + node[\"f2\"] # Attempt to mix dtypes.\n", + "Traceback (most recent call last):\n", + " ...\n", + "ValueError: corresponding features should have the same dtype. ...\n", + "```" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "61127d7f", + "id": "7b50cf71", "metadata": { "cell_marker": "\"\"\"", "lines_to_next_cell": 0 }, "source": [ + "Refer to the [Casting](#casting) section for more on this.\n", "\n", - "You can modify feature names using the `EventSet.rename()` and `EventSet.prefix()` operators. `EventSet.rename()` changes the name of features, while `EventSet.prefix()` adds a prefix in front of existing feature names. Note that they do not modify the content of the input `EventSet`, but return a new one with the modified feature names." + "All the operators have an equivalent functional form. The example above using `+`, could be rewritten with `tp.add()`." ] }, { "cell_type": "code", "execution_count": null, - "id": "bc36bc1f", + "id": "3b350c4a", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.029017Z", - "iopub.status.busy": "2023-07-24T15:01:00.028848Z", - "iopub.status.idle": "2023-07-24T15:01:00.031960Z", - "shell.execute_reply": "2023-07-24T15:01:00.031429Z" + "iopub.execute_input": "2023-07-24T15:01:00.101025Z", + "iopub.status.busy": "2023-07-24T15:01:00.100848Z", + "iopub.status.idle": "2023-07-24T15:01:00.103444Z", + "shell.execute_reply": "2023-07-24T15:01:00.103080Z" } }, "outputs": [], "source": [ - "# Rename a single feature.\n", - "renamed_f1 = node[\"feature_1\"].rename(\"renamed_1\")\n", - "print(renamed_f1.features)" + "# Equivalent.\n", + "node_added = tp.add(node[[\"f1\", \"f2\"]], node[[\"f3\", \"f4\"]])" ] }, { - "cell_type": "code", - "execution_count": null, - "id": "a44f6e7a", + "attachments": {}, + "cell_type": "markdown", + "id": "d65bd8de", "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.042574Z", - "iopub.status.busy": "2023-07-24T15:01:00.042259Z", - "iopub.status.idle": "2023-07-24T15:01:00.045691Z", - "shell.execute_reply": "2023-07-24T15:01:00.044933Z" - } + "cell_marker": "\"\"\"", + "lines_to_next_cell": 0 }, - "outputs": [], "source": [ - "# Rename all features.\n", - "renamed_node = node.rename(\n", - " {\"feature_1\": \"renamed_1\", \"feature_2\": \"renamed_2\"}\n", - ")\n", - "print(renamed_node.features)" + "Other usual comparison and logic operators also work (except `==`, see below)." ] }, { "cell_type": "code", "execution_count": null, - "id": "af6103fc", + "id": "f1462eea", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.048841Z", - "iopub.status.busy": "2023-07-24T15:01:00.048430Z", - "iopub.status.idle": "2023-07-24T15:01:00.051757Z", - "shell.execute_reply": "2023-07-24T15:01:00.051319Z" - } - }, - "outputs": [], - "source": [ - "# Prefix a single feature.\n", - "prefixed_f1 = node[\"feature_1\"].prefix(\"prefixed.\")\n", - "print(prefixed_f1.features)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3126cbed", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.053697Z", - "iopub.status.busy": "2023-07-24T15:01:00.053582Z", - "iopub.status.idle": "2023-07-24T15:01:00.056089Z", - "shell.execute_reply": "2023-07-24T15:01:00.055703Z" + "iopub.execute_input": "2023-07-24T15:01:00.105489Z", + "iopub.status.busy": "2023-07-24T15:01:00.105344Z", + "iopub.status.idle": "2023-07-24T15:01:00.108344Z", + "shell.execute_reply": "2023-07-24T15:01:00.107952Z" } }, "outputs": [], "source": [ - "# Prefix all features.\n", - "prefixed_node = node.prefix(\"prefixed.\")\n", - "print(prefixed_node.features)" + "is_greater = node[[\"f1\", \"f2\"]] > node[[\"f3\", \"f4\"]]\n", + "is_less_or_equal = node[[\"f1\", \"f2\"]] <= node[[\"f3\", \"f4\"]]\n", + "is_wrong = is_greater & is_less_or_equal" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "085e79c3", + "id": "9f01eee7", "metadata": { "cell_marker": "\"\"\"", "lines_to_next_cell": 0 }, "source": [ - "\n", - "It is recommended to use `EventSet.rename()` and `EventSet.prefix()` to organize your data, and avoid duplicated feature names." + "**Warning:** The Python equality operator (`==`) does not compute element-wise equality between features. Use the `evset.equal()` operator instead." ] }, { "cell_type": "code", "execution_count": null, - "id": "852abbdd", + "id": "c610a0d0", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.058375Z", - "iopub.status.busy": "2023-07-24T15:01:00.058188Z", - "iopub.status.idle": "2023-07-24T15:01:00.061323Z", - "shell.execute_reply": "2023-07-24T15:01:00.060844Z" + "iopub.execute_input": "2023-07-24T15:01:00.110338Z", + "iopub.status.busy": "2023-07-24T15:01:00.110212Z", + "iopub.status.idle": "2023-07-24T15:01:00.113649Z", + "shell.execute_reply": "2023-07-24T15:01:00.113316Z" } }, "outputs": [], "source": [ - "sma_7_node = node.simple_moving_average(tp.duration.days(7)).prefix(\"sma_7.\")\n", - "sma_14_node = node.simple_moving_average(tp.duration.days(14)).prefix(\"sma_14.\")" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "ac25eb4a", - "metadata": { - "cell_marker": "\"\"\"", - "lines_to_next_cell": 0 - }, - "source": [ - "\n", - "The `tp.glue()` operator can be used to concatenate different features into a single `EventSetNode`, but it will fail if two features with the same name are provided. The following pattern is commonly used in Temporian programs." + "# Works element-wise as expected\n", + "node[\"f1\"].equal(node[\"f3\"])" ] }, { "cell_type": "code", "execution_count": null, - "id": "f7d85e33", + "id": "abda404b", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.063510Z", - "iopub.status.busy": "2023-07-24T15:01:00.063393Z", - "iopub.status.idle": "2023-07-24T15:01:00.067035Z", - "shell.execute_reply": "2023-07-24T15:01:00.066516Z" + "iopub.execute_input": "2023-07-24T15:01:00.115541Z", + "iopub.status.busy": "2023-07-24T15:01:00.115402Z", + "iopub.status.idle": "2023-07-24T15:01:00.118082Z", + "shell.execute_reply": "2023-07-24T15:01:00.117723Z" } }, "outputs": [], "source": [ - "result = tp.glue(\n", - " node.simple_moving_average(tp.duration.days(7)).prefix(\"sma_7.\"),\n", - " node.simple_moving_average(tp.duration.days(14)).prefix(\"sma_14.\"),\n", - ")" + "# This is just a boolean\n", + "(node[\"f1\"] == node[\"f3\"])" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "749df3cc", + "id": "0fa4a2d1", "metadata": { "cell_marker": "\"\"\"", "lines_to_next_cell": 0 }, "source": [ - "\n", - "## Casting\n", - "\n", - "Temporian is strict on feature data types (also called dtype). This means that often, you cannot perform operations between features of different types. For example, you cannot subtract a `tp.float32` and a `tp.float64`. Instead, you must manually cast the features to the same type before performing the operation." + "All these operators act feature-wise, i.e. they perform index-feature-wise operations (for each feature in each index key). This implies that the input `EventSets` must have the same number of features." ] }, { - "cell_type": "code", - "execution_count": null, - "id": "e1276be1", + "attachments": {}, + "cell_type": "markdown", + "id": "0352b9de", "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.069531Z", - "iopub.status.busy": "2023-07-24T15:01:00.069387Z", - "iopub.status.idle": "2023-07-24T15:01:00.072411Z", - "shell.execute_reply": "2023-07-24T15:01:00.071968Z" - } + "cell_marker": "\"\"\"", + "lines_to_next_cell": 0 }, - "outputs": [], "source": [ - "node = tp.input_node(features=[(\"f1\", tp.float32), (\"f2\", tp.float64)])\n", - "added = node[\"f1\"].cast(tp.float64) + node[\"f2\"]" + "```python\n", + "node[[\"f1\", \"f2\"]] + node[\"f3\"]\n", + "Traceback (most recent call last):\n", + " ...\n", + "ValueError: The left and right arguments should have the same number of features. ...\n", + "```" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "d45a37bb", + "id": "8dd1d7f4", "metadata": { + "cell_marker": "\"\"\"", "lines_to_next_cell": 0 }, "source": [ "\n", - "Casting is especially useful to reduce memory usage. For example, if a feature only contains values between 0 and 10000, using `tp.int32` instead of `tp.int64` will halve memory usage. These optimizations are critical when working with large datasets.\n", - "\n", - "Casting can also be a necessary step before calling operators that only accept certain input data types.\n", - "\n", - "Note that in Python, the values `1.0` and `1` are respectively `float64` and `int64`.\n", - "\n", - "Temporian supports data type casting through the `EventSet.cast()` operator. Destination data types can be specified in three different ways:\n", - "\n", - "1. Single data type: converts all input features to the same destination data type.\n", - "\n", - " " + "The input `EventSets` must also have the same sampling and index." ] }, { - "cell_type": "code", - "execution_count": null, - "id": "3e3ee4c4", + "attachments": {}, + "cell_type": "markdown", + "id": "00990d1e", "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.074589Z", - "iopub.status.busy": "2023-07-24T15:01:00.074466Z", - "iopub.status.idle": "2023-07-24T15:01:00.077932Z", - "shell.execute_reply": "2023-07-24T15:01:00.077413Z" - }, + "cell_marker": "\"\"\"", "lines_to_next_cell": 0 }, - "outputs": [], - "source": [ - "node.features" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "6c2444ba", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.080190Z", - "iopub.status.busy": "2023-07-24T15:01:00.079991Z", - "iopub.status.idle": "2023-07-24T15:01:00.082867Z", - "shell.execute_reply": "2023-07-24T15:01:00.082457Z" - } - }, - "outputs": [], "source": [ - "print(node.cast(tp.str_).features)" + "```python\n", + "sampling_1 = tp.event_set(\n", + " timestamps=[0, 1],\n", + " features={\"f1\": [1, 2]},\n", + ")\n", + "sampling_2 = tp.event_set(\n", + " timestamps=[1, 2],\n", + " features={\"f1\": [3, 4]},\n", + ")\n", + "sampling_1.node() + sampling_2.node()\n", + "Traceback (most recent call last):\n", + " ...\n", + "ValueError: Arguments should have the same sampling. ...\n", + "```" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "59c449d9", + "id": "217fa8f5", "metadata": { "cell_marker": "\"\"\"", "lines_to_next_cell": 0 }, "source": [ + "If you want to apply arithmetic operators on `EventSets` with different samplings, take a look at\n", + "[Sampling](#sampling) section.\n", "\n", - "2. Feature name to data type mapping: converts each feature (specified by name) to a specific data type." + "If you want to apply them on `EventSets` with different indexes, check the\n", + "[Vertical operators](#indexes-horizontal-and-vertical-operators) section.\n", + "\n", + "Operations involving scalars are applied index-feature-element-wise." ] }, { "cell_type": "code", "execution_count": null, - "id": "05ee00a7", + "id": "58fe7d8e", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.085010Z", - "iopub.status.busy": "2023-07-24T15:01:00.084841Z", - "iopub.status.idle": "2023-07-24T15:01:00.087364Z", - "shell.execute_reply": "2023-07-24T15:01:00.087026Z" - } + "iopub.execute_input": "2023-07-24T15:01:00.120397Z", + "iopub.status.busy": "2023-07-24T15:01:00.120245Z", + "iopub.status.idle": "2023-07-24T15:01:00.123150Z", + "shell.execute_reply": "2023-07-24T15:01:00.122799Z" + }, + "lines_to_next_cell": 0 }, "outputs": [], "source": [ - "print(node.cast({\"f1\": tp.str_, \"f2\": tp.int64}).features)" + "node_scalar = node * 10\n", + "print(node_scalar.run(evset))" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "3f85a531", + "id": "a229408c", "metadata": { "cell_marker": "\"\"\"", "lines_to_next_cell": 0 }, "source": [ + "## Sampling\n", "\n", - "3. Data type to data type mapping: converts all features of a specific data type to another data type." + "Arithmetic operators, such as `tp.add()`, require their input arguments to have the same timestamps and [Index](#indexes-horizontal-and-vertical-operators). The unique combination of timestamps and indexes is called a _sampling_.\n", + "\n", + "\n", + "\n", + "For example, if `EventSetNodes` `a` and `b` have different samplings, `a[\"feature_1\"] + b[\"feature_2\"]` will fail.\n", + "\n", + "To use arithmetic operators on `EventSets` with different samplings, one of the `EventSets` needs to be resampled to the sampling of the other `EventSet`. Resampling is done with the `EventSet.resample()` operator.\n", + "\n", + "The `EventSet.resample()` operator takes two `EventSets` called `input` and `sampling`, and returns the resampling of the features of `input` according to the timestamps of `sampling` according to the following rules:\n", + "\n", + "If a timestamp is present in `input` but not in `sampling`, the timestamp is dropped.\n", + "If a timestamp is present in both `input` and `sampling`, the timestamp is kept.\n", + "If a timestamp is present in `sampling` but not in `input`, a new timestamp is created using the feature values from the _closest anterior_ (not the closest, as that could induce future leakage) timestamp of `input`. This rule is especially useful for events that represent measurements (see [Events and `EventSets`](#events-and-eventsets)).\n", + "\n", + "**Note:** Features in `sampling` are ignored. This also happens in some other operators that take a `sampling` argument of type `EventSetNode` - it indicates that only the sampling (a.k.a. the indexes and timestamps) of that `EventSetNode` are being used by that operator.\n", + "\n", + "Given this example:" ] }, { "cell_type": "code", "execution_count": null, - "id": "6deaff88", + "id": "087b6fd6", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.089508Z", - "iopub.status.busy": "2023-07-24T15:01:00.089353Z", - "iopub.status.idle": "2023-07-24T15:01:00.091835Z", - "shell.execute_reply": "2023-07-24T15:01:00.091498Z" - } + "iopub.execute_input": "2023-07-24T15:01:00.125315Z", + "iopub.status.busy": "2023-07-24T15:01:00.125163Z", + "iopub.status.idle": "2023-07-24T15:01:00.129661Z", + "shell.execute_reply": "2023-07-24T15:01:00.129338Z" + }, + "lines_to_next_cell": 0 }, "outputs": [], "source": [ - "print(node.cast({tp.float32: tp.str_, tp.float64: tp.int64}).features)" + "evset = tp.event_set(\n", + " timestamps=[10, 20, 30],\n", + " features={\n", + " \"x\": [1.0, 2.0, 3.0],\n", + " },\n", + ")\n", + "node = evset.node()\n", + "sampling_evset = tp.event_set(\n", + " timestamps=[0, 9, 10, 11, 19, 20, 21],\n", + ")\n", + "sampling_node = sampling_evset.node()\n", + "resampled = node.resample(sampling=sampling_node)\n", + "resampled.run({node: evset, sampling_node: sampling_evset})" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "915df6c5", + "id": "11496f59", "metadata": { "cell_marker": "\"\"\"", "lines_to_next_cell": 0 }, "source": [ "\n", - "Keep in mind that casting may fail when the graph is evaluated. For instance, attempting to cast `\"word\"` to `tp.float64` will result in an error. These errors cannot be caught prior to graph evaluation.\n", + "The following would be the matching between the timestamps of `sampling` and `input`:\n", "\n", - "## Arithmetic operators\n", + "| `sampling` timestamp | 0 | 9 | 10 | 11 | 19 | 20 | 21 |\n", + "| ---------------------------- | --- | --- | --- | --- | --- | --- | --- |\n", + "| matching `input` timestamp | - | - | 10 | 10 | 10 | 20 | 20 |\n", + "| matching `\"x\"` feature value | NaN | NaN | 1 | 1 | 1 | 2 | 2 |\n", "\n", - "Arithmetic operators can be used between the features of an `EventSetNode`, to perform element-wise calculations.\n", + "If `sampling` contains a timestamp anterior to any timestamp in the `input` (like 0 and 9 in the example above), the feature of the sampled event will be missing. The representation of a missing value depends on its dtype:\n", "\n", - "Common mathematical and bit operations are supported, such as addition (`+`), subtraction (`-`), product (`*`), division (`/`), floor division (`//`), modulo (`%`), comparisons (`>, >=, <, <=`), and bitwise operators (`&, |, ~`).\n", + "float: `NaN`\n", + "integer: `0`\n", + "string: `\"\"`\n", "\n", - "These operators are applied index-wise and timestamp-wise, between features in the same position." + "Back to the example of the `tp.add()` operator, `a` and `b` with different sampling can be added as follows:" ] }, { "cell_type": "code", "execution_count": null, - "id": "2c673b17", + "id": "df3bbc7d", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.094177Z", - "iopub.status.busy": "2023-07-24T15:01:00.094010Z", - "iopub.status.idle": "2023-07-24T15:01:00.098574Z", - "shell.execute_reply": "2023-07-24T15:01:00.098140Z" + "iopub.execute_input": "2023-07-24T15:01:00.131774Z", + "iopub.status.busy": "2023-07-24T15:01:00.131623Z", + "iopub.status.idle": "2023-07-24T15:01:00.136202Z", + "shell.execute_reply": "2023-07-24T15:01:00.135874Z" }, "lines_to_next_cell": 0 }, "outputs": [], "source": [ - "evset = tp.event_set(\n", - " timestamps=[1, 10],\n", - " features={\n", - " \"f1\": [0, 1],\n", - " \"f2\": [10.0, 20.0],\n", - " \"f3\": [100, 100],\n", - " \"f4\": [1000.0, 1000.0],\n", - " },\n", + "sampling_a = tp.event_set(\n", + " timestamps=[0, 1, 2],\n", + " features={\"f1\": [10, 20, 30]},\n", ")\n", - "node = evset.node()\n", - "\n", - "node_added = node[[\"f1\", \"f2\"]] + node[[\"f3\", \"f4\"]]\n", - "\n", - "evset_added = node_added.run(evset)\n", - "print(evset_added)" - ] - }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "03bd54cc", - "metadata": { - "cell_marker": "\"\"\"", - "lines_to_next_cell": 0 - }, - "source": [ - "Note that features of type `int64` and `float64` are not mixed above, because otherwise the operation would fail without an explicit type cast." + "sampling_b = tp.event_set(\n", + " timestamps=[1, 2, 3],\n", + " features={\"f1\": [5, 4, 3]},\n", + ")\n", + "a = sampling_a.node()\n", + "b = sampling_b.node()\n", + "result = a + b.resample(a)\n", + "result.run({a: sampling_a, b: sampling_b})" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "1675fa25", + "id": "56313ff2", "metadata": { "cell_marker": "\"\"\"", "lines_to_next_cell": 0 }, "source": [ + "\n", + "`EventSet.resample()` is critical to combine events from different, non-synchronized sources. For example, consider a system with two sensors, a thermometer for temperature and a manometer for pressure. The temperature sensor produces measurements every 1 to 10 minutes, while the pressure sensor returns measurements every second. Additionally assume that both sensors are not synchronized. Finally, assume that you need to combine the temperature and pressure measurements with the equation `temperature / pressure`.\n", + "\n", + "\n", + "\n", + "Since the temperature and pressure `EventSets` have different sampling, you will need to resample one of them. The pressure sensor has higher resolution. Therefore, resampling the temperature to the pressure yields higher resolution than resampling the pressure to the temperature.\n", + "\n", "```python\n", - ">>> node[\"f1\"] + node[\"f2\"] # Attempt to mix dtypes.\n", - "Traceback (most recent call last):\n", - " ...\n", - "ValueError: corresponding features should have the same dtype. ...\n", + "r = termometer[\"temperature\"].resample(manometer) / manometer[\"pressure\"]\n", "```" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "7b50cf71", + "id": "ae131e37", "metadata": { "cell_marker": "\"\"\"", "lines_to_next_cell": 0 }, "source": [ - "Refer to the [Casting](#casting) section for more on this.\n", "\n", - "All the operators have an equivalent functional form. The example above using `+`, could be rewritten with `tp.add()`." + "When handling non-uniform timestamps it is also common to have a common resampling source.\n", + "\n", + "```python\n", + "sampling_source = # Uniform timestamps every 10 seconds.\n", + "r = termometer[\"temperature\"].resample(sampling_source) / manometer[\"pressure\"].resample(sampling_source)\n", + "```\n", + "\n", + "Moving window operators, such as the `EventSet.simple_moving_average()` or `EventSet.moving_count()` operators, have an optional `sampling` argument. For example, the signature of the simple moving average operator is `EventSet.simple_moving_average(window_length: Duration, sampling: Optional[EventSet] = None)`. If `sampling` is not set, the result will maintain the sampling of the `input` argument. If `sampling` is set, the moving window will be sampled at each timestamp of `sampling` instead, and the result will have those new ones.\n", + "\n", + "```python\n", + "b = tp.simple_moving_average(input=a, window_length=10)\n", + "c = tp.simple_moving_average(input=a, window_length=10, sampling=d)\n", + "```\n", + "\n", + "Note that if planning to resample the result of a moving window operator, passing the `sampling` argument is both more efficient and more accurate than calling `.resample()` on the result.\n", + "\n", + "## Indexes, horizontal and vertical operators\n", + "\n", + "All operators presented so far work on a sequence of related events. For instance, the simple moving average operator computes the average of events within a specific time window. These types of operators are called _horizontal operators_.\n", + "\n", + "It is sometimes desirable for events in an `EventSet` not to interact with each other. For example, assume a dataset containing the sum of daily sales of a set of products. The objective is to compute the sum of weekly sales of each product independently. In this scenario, the weekly moving sum should be applied individually to each product. If not, you would compute the weekly sales of all the products together.\n", + "\n", + "To compute the weekly sales of individual products, you can define the `product` feature as the _index_." ] }, { "cell_type": "code", "execution_count": null, - "id": "3b350c4a", + "id": "54a71cae", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.101025Z", - "iopub.status.busy": "2023-07-24T15:01:00.100848Z", - "iopub.status.idle": "2023-07-24T15:01:00.103444Z", - "shell.execute_reply": "2023-07-24T15:01:00.103080Z" - } + "iopub.execute_input": "2023-07-24T15:01:00.138254Z", + "iopub.status.busy": "2023-07-24T15:01:00.138101Z", + "iopub.status.idle": "2023-07-24T15:01:00.141435Z", + "shell.execute_reply": "2023-07-24T15:01:00.141074Z" + }, + "lines_to_next_cell": 0 }, "outputs": [], "source": [ - "# Equivalent.\n", - "node_added = tp.add(node[[\"f1\", \"f2\"]], node[[\"f3\", \"f4\"]])" + "daily_sales = tp.event_set(\n", + "\ttimestamps=[\"2020-01-01\", \"2020-01-01\", \"2020-01-02\", \"2020-01-02\"],\n", + "\tfeatures={\n", + " \"product\": [1, 2, 1, 2],\n", + " \"sale\": [100.0, 300.0, 90.0, 400.0],\n", + " },\n", + " indexes=[\"product\"]\n", + ")\n", + "print(daily_sales)" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "d65bd8de", + "id": "40dacbb4", "metadata": { "cell_marker": "\"\"\"", "lines_to_next_cell": 0 }, "source": [ - "Other usual comparison and logic operators also work (except `==`, see below)." + "\n", + "The moving sum operator will then be applied independently to the events corresponding to each product." ] }, { "cell_type": "code", "execution_count": null, - "id": "f1462eea", + "id": "2c87a680", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.105489Z", - "iopub.status.busy": "2023-07-24T15:01:00.105344Z", - "iopub.status.idle": "2023-07-24T15:01:00.108344Z", - "shell.execute_reply": "2023-07-24T15:01:00.107952Z" - } + "iopub.execute_input": "2023-07-24T15:01:00.143537Z", + "iopub.status.busy": "2023-07-24T15:01:00.143412Z", + "iopub.status.idle": "2023-07-24T15:01:00.147227Z", + "shell.execute_reply": "2023-07-24T15:01:00.146886Z" + }, + "lines_to_next_cell": 2 }, "outputs": [], "source": [ - "is_greater = node[[\"f1\", \"f2\"]] > node[[\"f3\", \"f4\"]]\n", - "is_less_or_equal = node[[\"f1\", \"f2\"]] <= node[[\"f3\", \"f4\"]]\n", - "is_wrong = is_greater & is_less_or_equal" + "a = daily_sales.node()\n", + "\n", + "# Compute the moving sum of each index group (a.k.a. each product) individually.\n", + "b = a.moving_sum(window_length=tp.duration.weeks(1))\n", + "\n", + "b.run({a: daily_sales})" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "9f01eee7", + "id": "e096897d", "metadata": { "cell_marker": "\"\"\"", "lines_to_next_cell": 0 }, "source": [ - "**Warning:** The Python equality operator (`==`) does not compute element-wise equality between features. Use the `evset.equal()` operator instead." + "\n", + "Horizontal operators can be understood as operators that are applied independently on each index.\n", + "\n", + "Operators that modify an `EventSetNode`'s indexes are called _vertical operators_. The most important vertical operators are:\n", + "\n", + "- `EventSet.add_index()`: Add features to the index.\n", + "- `EventSet.drop_index()`: Remove features from the index, optionally keeping them as features.\n", + "- `EventSet.set_index()`: Changes the index.\n", + "- `EventSet.propagate()`: Expand indexes based on another `EventSet`’s indexes.\n", + "\n", + "By default, `EventSets` are _flat_, which means they have no index, and therefore all events are in a single global group.\n", + "\n", + "Also, keep in mind that only string and integer features can be used as indexes.\n", + "\n", + "`EventSets` can have multiple features as index. In the next example, assume our daily sale aggregates are also annotated with `store` data." ] }, { "cell_type": "code", "execution_count": null, - "id": "c610a0d0", + "id": "8badbebf", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.110338Z", - "iopub.status.busy": "2023-07-24T15:01:00.110212Z", - "iopub.status.idle": "2023-07-24T15:01:00.113649Z", - "shell.execute_reply": "2023-07-24T15:01:00.113316Z" + "iopub.execute_input": "2023-07-24T15:01:00.149178Z", + "iopub.status.busy": "2023-07-24T15:01:00.149039Z", + "iopub.status.idle": "2023-07-24T15:01:00.152148Z", + "shell.execute_reply": "2023-07-24T15:01:00.151798Z" } }, "outputs": [], "source": [ - "# Works element-wise as expected\n", - "node[\"f1\"].equal(node[\"f3\"])" + "daily_sales = tp.event_set(\n", + "\ttimestamps=[\"2020-01-01\", \"2020-01-01\", \"2020-01-02\", \"2020-01-02\"],\n", + "\tfeatures={\n", + " \"store\": [1, 1, 1, 2],\n", + " \"product\": [1, 2, 1, 2],\n", + " \"sale\": [100.0, 200.0, 110.0, 300.0],\n", + " },\n", + ")\n", + "print(daily_sales)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "69b3c03c", + "metadata": { + "cell_marker": "\"\"\"", + "lines_to_next_cell": 0 + }, + "source": [ + "\n", + "Since we haven't defined the `indexes` yet, `store` and `product` are just regular features above.\n", + "Let's add the `(product, store)` pair as the index." ] }, { "cell_type": "code", "execution_count": null, - "id": "abda404b", + "id": "479096c3", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.115541Z", - "iopub.status.busy": "2023-07-24T15:01:00.115402Z", - "iopub.status.idle": "2023-07-24T15:01:00.118082Z", - "shell.execute_reply": "2023-07-24T15:01:00.117723Z" - } + "iopub.execute_input": "2023-07-24T15:01:00.154125Z", + "iopub.status.busy": "2023-07-24T15:01:00.154007Z", + "iopub.status.idle": "2023-07-24T15:01:00.157566Z", + "shell.execute_reply": "2023-07-24T15:01:00.157243Z" + }, + "lines_to_next_cell": 2 }, "outputs": [], "source": [ - "# This is just a boolean\n", - "(node[\"f1\"] == node[\"f3\"])" + "a = daily_sales.node()\n", + "b = a.add_index([\"product\", \"store\"])\n", + "b.run({a: daily_sales})" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "0fa4a2d1", + "id": "c2dc98f6", "metadata": { "cell_marker": "\"\"\"", "lines_to_next_cell": 0 }, "source": [ - "All these operators act feature-wise, i.e. they perform index-feature-wise operations (for each feature in each index key). This implies that the input `EventSets` must have the same number of features." + "\n", + "The `moving_sum` operator can be used to calculate the weekly sum of sales\n", + "for each `(product, store)` pair." ] }, { - "attachments": {}, - "cell_type": "markdown", - "id": "0352b9de", + "cell_type": "code", + "execution_count": null, + "id": "4df0d8cf", "metadata": { - "cell_marker": "\"\"\"", + "execution": { + "iopub.execute_input": "2023-07-24T15:01:00.159586Z", + "iopub.status.busy": "2023-07-24T15:01:00.159442Z", + "iopub.status.idle": "2023-07-24T15:01:00.163136Z", + "shell.execute_reply": "2023-07-24T15:01:00.162800Z" + }, "lines_to_next_cell": 0 }, + "outputs": [], "source": [ - "```python\n", - "node[[\"f1\", \"f2\"]] + node[\"f3\"]\n", - "Traceback (most recent call last):\n", - " ...\n", - "ValueError: The left and right arguments should have the same number of features. ...\n", - "```" + "# Weekly sales by product and store\n", + "c = b[\"sale\"].moving_sum(window_length=tp.duration.weeks(1))\n", + "c.run({a: daily_sales})" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "8dd1d7f4", + "id": "2295d4ee", "metadata": { "cell_marker": "\"\"\"", "lines_to_next_cell": 0 }, "source": [ "\n", - "The input `EventSets` must also have the same sampling and index." + "If we want the weekly sum of sales per `store`, we can just drop the `product` index." ] }, { - "attachments": {}, - "cell_type": "markdown", - "id": "00990d1e", + "cell_type": "code", + "execution_count": null, + "id": "8d9448a2", "metadata": { - "cell_marker": "\"\"\"", + "execution": { + "iopub.execute_input": "2023-07-24T15:01:00.165204Z", + "iopub.status.busy": "2023-07-24T15:01:00.165078Z", + "iopub.status.idle": "2023-07-24T15:01:00.170459Z", + "shell.execute_reply": "2023-07-24T15:01:00.169929Z" + }, "lines_to_next_cell": 0 }, + "outputs": [], "source": [ - "```python\n", - "sampling_1 = tp.event_set(\n", - " timestamps=[0, 1],\n", - " features={\"f1\": [1, 2]},\n", - ")\n", - "sampling_2 = tp.event_set(\n", - " timestamps=[1, 2],\n", - " features={\"f1\": [3, 4]},\n", - ")\n", - "sampling_1.node() + sampling_2.node()\n", - "Traceback (most recent call last):\n", - " ...\n", - "ValueError: Arguments should have the same sampling. ...\n", - "```" + "# Weekly sales by store (including all products)\n", + "d = b.drop_index(\"product\")\n", + "e = d[\"sale\"].moving_sum(window_length=tp.duration.weeks(1))\n", + "e.run({a: daily_sales})" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "217fa8f5", + "id": "f67b3f0c", "metadata": { "cell_marker": "\"\"\"", "lines_to_next_cell": 0 }, "source": [ - "If you want to apply arithmetic operators on `EventSets` with different samplings, take a look at\n", - "[Sampling](#sampling) section.\n", "\n", - "If you want to apply them on `EventSets` with different indexes, check the\n", - "[Vertical operators](#indexes-horizontal-and-vertical-operators) section.\n", + "Finally, let's calculate the ratio of sales of each `(product, store)` pair compared to the whole `store` sales.\n", "\n", - "Operations involving scalars are applied index-feature-element-wise." + "Since `c` (weekly sales for each product and store) and `e` (weekly sales for each store) have different indexes, we cannot use `tp.divide` (or `/`) directly - we must first `propagate` `e` to the `[\"product\", \"store\"]` index." ] }, { "cell_type": "code", "execution_count": null, - "id": "58fe7d8e", + "id": "4e12a9e0", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.120397Z", - "iopub.status.busy": "2023-07-24T15:01:00.120245Z", - "iopub.status.idle": "2023-07-24T15:01:00.123150Z", - "shell.execute_reply": "2023-07-24T15:01:00.122799Z" + "iopub.execute_input": "2023-07-24T15:01:00.172674Z", + "iopub.status.busy": "2023-07-24T15:01:00.172528Z", + "iopub.status.idle": "2023-07-24T15:01:00.177142Z", + "shell.execute_reply": "2023-07-24T15:01:00.176616Z" }, "lines_to_next_cell": 0 }, "outputs": [], "source": [ - "node_scalar = node * 10\n", - "print(node_scalar.run(evset))" + "# Copy the content of e (indexed by (store)) into each (store, product).\n", + "f = c / e.propagate(sampling=c, resample=True)\n", + "\n", + "# Equivalent.\n", + "f = c / e.propagate(sampling=c).resample(sampling=c)\n", + "print(f.run({a: daily_sales}))" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "a229408c", + "id": "e73da62c", "metadata": { "cell_marker": "\"\"\"", "lines_to_next_cell": 0 }, "source": [ - "## Sampling\n", - "\n", - "Arithmetic operators, such as `tp.add()`, require their input arguments to have the same timestamps and [Index](#indexes-horizontal-and-vertical-operators). The unique combination of timestamps and indexes is called a _sampling_.\n", - "\n", - "\n", "\n", - "For example, if `EventSetNodes` `a` and `b` have different samplings, `a[\"feature_1\"] + b[\"feature_2\"]` will fail.\n", + "The `EventSet.propagate()` operator expands the indexes of its `input` (`e` in this case) to match the indexes of its `sampling` by copying the content of `input` into each corresponding index group of `sampling`. Note that `sampling`'s indexes must be a superset of `input`'s indexes.\n", "\n", - "To use arithmetic operators on `EventSets` with different samplings, one of the `EventSets` needs to be resampled to the sampling of the other `EventSet`. Resampling is done with the `EventSet.resample()` operator.\n", + "## Future leakage\n", "\n", - "The `EventSet.resample()` operator takes two `EventSets` called `input` and `sampling`, and returns the resampling of the features of `input` according to the timestamps of `sampling` according to the following rules:\n", + "In supervised learning, [leakage]() is the use of data not available at serving time by a machine learning model. A common example of leakage is _label leakage_, which involves the invalid use of labels in the model input features. Leakage tends to bias model evaluation by making it appear much better than it is in reality. Unfortunately, leakage is often subtle, easy to inject, and challenging to detect.\n", "\n", - "If a timestamp is present in `input` but not in `sampling`, the timestamp is dropped.\n", - "If a timestamp is present in both `input` and `sampling`, the timestamp is kept.\n", - "If a timestamp is present in `sampling` but not in `input`, a new timestamp is created using the feature values from the _closest anterior_ (not the closest, as that could induce future leakage) timestamp of `input`. This rule is especially useful for events that represent measurements (see [Events and `EventSets`](#events-and-eventsets)).\n", + "Another type of leakage is future leakage, where a model uses data before it is available. Future leakage is particularly easy to create, as all feature data is ultimately available to the model, the problem being it being accessed at the wrong time.\n", "\n", - "**Note:** Features in `sampling` are ignored. This also happens in some other operators that take a `sampling` argument of type `EventSetNode` - it indicates that only the sampling (a.k.a. the indexes and timestamps) of that `EventSetNode` are being used by that operator.\n", + "To avoid future leakage, Temporian operators are guaranteed to not cause future leakage, except for the `EventSet.leak()` operator. This means that it is impossible to inadvertently add future leakage to a Temporian program.\n", "\n", - "Given this example:" + "`EventSet.leak()` can be useful for precomputing labels or evaluating machine learning models. However, its outputs shouldn’t be used as input features." ] }, { "cell_type": "code", "execution_count": null, - "id": "087b6fd6", + "id": "c07453fa", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.125315Z", - "iopub.status.busy": "2023-07-24T15:01:00.125163Z", - "iopub.status.idle": "2023-07-24T15:01:00.129661Z", - "shell.execute_reply": "2023-07-24T15:01:00.129338Z" - }, - "lines_to_next_cell": 0 + "iopub.execute_input": "2023-07-24T15:01:00.179407Z", + "iopub.status.busy": "2023-07-24T15:01:00.179261Z", + "iopub.status.idle": "2023-07-24T15:01:00.182867Z", + "shell.execute_reply": "2023-07-24T15:01:00.182049Z" + } }, "outputs": [], "source": [ - "evset = tp.event_set(\n", - " timestamps=[10, 20, 30],\n", - " features={\n", - " \"x\": [1.0, 2.0, 3.0],\n", - " },\n", - ")\n", - "node = evset.node()\n", - "sampling_evset = tp.event_set(\n", - " timestamps=[0, 9, 10, 11, 19, 20, 21],\n", - ")\n", - "sampling_node = sampling_evset.node()\n", - "resampled = node.resample(sampling=sampling_node)\n", - "resampled.run({node: evset, sampling_node: sampling_evset})" + "a = tp.input_node(features=[(\"feature_1\", tp.float32)])\n", + "b = a.moving_count(1)\n", + "c = b.leak(1).moving_count(2)" ] }, { - "attachments": {}, "cell_type": "markdown", - "id": "11496f59", - "metadata": { - "cell_marker": "\"\"\"", - "lines_to_next_cell": 0 - }, + "id": "d2e37ee5", + "metadata": {}, "source": [ + "In this example, `b` does not have a future leak, but `c` does because it depends on `EventSet.leak()`.\n", "\n", - "The following would be the matching between the timestamps of `sampling` and `input`:\n", - "\n", - "| `sampling` timestamp | 0 | 9 | 10 | 11 | 19 | 20 | 21 |\n", - "| ---------------------------- | --- | --- | --- | --- | --- | --- | --- |\n", - "| matching `input` timestamp | - | - | 10 | 10 | 10 | 20 | 20 |\n", - "| matching `\"x\"` feature value | NaN | NaN | 1 | 1 | 1 | 2 | 2 |\n", - "\n", - "If `sampling` contains a timestamp anterior to any timestamp in the `input` (like 0 and 9 in the example above), the feature of the sampled event will be missing. The representation of a missing value depends on its dtype:\n", - "\n", - "float: `NaN`\n", - "integer: `0`\n", - "string: `\"\"`\n", - "\n", - "Back to the example of the `tp.add()` operator, `a` and `b` with different sampling can be added as follows:" + "To check programmatically if an `EventSetNode` depends on `leak()`, we can use the `tp.has_leak()` function." ] }, { "cell_type": "code", "execution_count": null, - "id": "df3bbc7d", + "id": "ab15c133", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.131774Z", - "iopub.status.busy": "2023-07-24T15:01:00.131623Z", - "iopub.status.idle": "2023-07-24T15:01:00.136202Z", - "shell.execute_reply": "2023-07-24T15:01:00.135874Z" - }, - "lines_to_next_cell": 0 + "iopub.execute_input": "2023-07-24T15:01:00.185286Z", + "iopub.status.busy": "2023-07-24T15:01:00.185178Z", + "iopub.status.idle": "2023-07-24T15:01:00.187923Z", + "shell.execute_reply": "2023-07-24T15:01:00.187503Z" + } }, "outputs": [], "source": [ - "sampling_a = tp.event_set(\n", - " timestamps=[0, 1, 2],\n", - " features={\"f1\": [10, 20, 30]},\n", - ")\n", - "sampling_b = tp.event_set(\n", - " timestamps=[1, 2, 3],\n", - " features={\"f1\": [5, 4, 3]},\n", - ")\n", - "a = sampling_a.node()\n", - "b = sampling_b.node()\n", - "result = a + b.resample(a)\n", - "result.run({a: sampling_a, b: sampling_b})" + "print(tp.has_leak(b))" ] }, { - "attachments": {}, - "cell_type": "markdown", - "id": "56313ff2", + "cell_type": "code", + "execution_count": null, + "id": "cd455fc1", "metadata": { - "cell_marker": "\"\"\"", - "lines_to_next_cell": 0 + "execution": { + "iopub.execute_input": "2023-07-24T15:01:00.190006Z", + "iopub.status.busy": "2023-07-24T15:01:00.189857Z", + "iopub.status.idle": "2023-07-24T15:01:00.192310Z", + "shell.execute_reply": "2023-07-24T15:01:00.191954Z" + } }, + "outputs": [], "source": [ - "\n", - "`EventSet.resample()` is critical to combine events from different, non-synchronized sources. For example, consider a system with two sensors, a thermometer for temperature and a manometer for pressure. The temperature sensor produces measurements every 1 to 10 minutes, while the pressure sensor returns measurements every second. Additionally assume that both sensors are not synchronized. Finally, assume that you need to combine the temperature and pressure measurements with the equation `temperature / pressure`.\n", - "\n", - "\n", - "\n", - "Since the temperature and pressure `EventSets` have different sampling, you will need to resample one of them. The pressure sensor has higher resolution. Therefore, resampling the temperature to the pressure yields higher resolution than resampling the pressure to the temperature.\n", - "\n", - "```python\n", - "r = termometer[\"temperature\"].resample(manometer) / manometer[\"pressure\"]\n", - "```" + "print(tp.has_leak(c))" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "ae131e37", + "id": "8d973547", "metadata": { "cell_marker": "\"\"\"", "lines_to_next_cell": 0 }, "source": [ + "By using `tp.has_leak()`, we can programmatically identify future leakage and modify our code accordingly.\n", "\n", - "When handling non-uniform timestamps it is also common to have a common resampling source.\n", - "\n", - "```python\n", - "sampling_source = # Uniform timestamps every 10 seconds.\n", - "r = termometer[\"temperature\"].resample(sampling_source) / manometer[\"pressure\"].resample(sampling_source)\n", - "```\n", - "\n", - "Moving window operators, such as the `EventSet.simple_moving_average()` or `EventSet.moving_count()` operators, have an optional `sampling` argument. For example, the signature of the simple moving average operator is `EventSet.simple_moving_average(window_length: Duration, sampling: Optional[EventSet] = None)`. If `sampling` is not set, the result will maintain the sampling of the `input` argument. If `sampling` is set, the moving window will be sampled at each timestamp of `sampling` instead, and the result will have those new ones.\n", - "\n", - "```python\n", - "b = tp.simple_moving_average(input=a, window_length=10)\n", - "c = tp.simple_moving_average(input=a, window_length=10, sampling=d)\n", - "```\n", - "\n", - "Note that if planning to resample the result of a moving window operator, passing the `sampling` argument is both more efficient and more accurate than calling `.resample()` on the result.\n", - "\n", - "## Indexes, horizontal and vertical operators\n", - "\n", - "All operators presented so far work on a sequence of related events. For instance, the simple moving average operator computes the average of events within a specific time window. These types of operators are called _horizontal operators_.\n", - "\n", - "It is sometimes desirable for events in an `EventSet` not to interact with each other. For example, assume a dataset containing the sum of daily sales of a set of products. The objective is to compute the sum of weekly sales of each product independently. In this scenario, the weekly moving sum should be applied individually to each product. If not, you would compute the weekly sales of all the products together.\n", + "## Accessing `EventSet` data\n", "\n", - "To compute the weekly sales of individual products, you can define the `product` feature as the _index_." + "`EventSet` data can be accessed using their `data` attribute. Temporian internally relies on NumPy, which means that the data access functions always return NumPy arrays." ] }, { "cell_type": "code", "execution_count": null, - "id": "54a71cae", + "id": "7da63117", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.138254Z", - "iopub.status.busy": "2023-07-24T15:01:00.138101Z", - "iopub.status.idle": "2023-07-24T15:01:00.141435Z", - "shell.execute_reply": "2023-07-24T15:01:00.141074Z" - }, - "lines_to_next_cell": 0 + "iopub.execute_input": "2023-07-24T15:01:00.194430Z", + "iopub.status.busy": "2023-07-24T15:01:00.194277Z", + "iopub.status.idle": "2023-07-24T15:01:00.198829Z", + "shell.execute_reply": "2023-07-24T15:01:00.198424Z" + } }, "outputs": [], "source": [ - "daily_sales = tp.event_set(\n", - "\ttimestamps=[\"2020-01-01\", \"2020-01-01\", \"2020-01-02\", \"2020-01-02\"],\n", + "evset = tp.event_set(\n", + "\ttimestamps=[1, 2, 3, 5, 6],\n", "\tfeatures={\n", - " \"product\": [1, 2, 1, 2],\n", - " \"sale\": [100.0, 300.0, 90.0, 400.0],\n", - " },\n", - " indexes=[\"product\"]\n", + " \"f1\": [0.1, 0.2, 0.3, 1.1, 1.2],\n", + " \"f2\": [\"red\", \"red\", \"red\", \"blue\", \"blue\"],\n", + "\t},\n", + "\tindexes=[\"f2\"],\n", ")\n", - "print(daily_sales)" + "\n", + "# Access the data for the index group `f2=red`.\n", + "evset.get_index_value((\"red\",))" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "40dacbb4", + "id": "eddfa88e", "metadata": { "cell_marker": "\"\"\"", "lines_to_next_cell": 0 }, "source": [ + "\n", + "\n", + "## Import and export data\n", + "\n", + "`EventSets` can be read from and saved to csv files via the `tp.from_csv()` and `tp.to_csv()` functions.\n", + "\n", + "```python\n", + "evset = tp.from_csv( # Read EventSet from a .csv file.\n", + " path=\"path/to/file.csv\",\n", + " timestamps=\"timestamp\",\n", + " indexes=[\"product_id\"],\n", + ")\n", + "\n", + "tp.to_csv(evset, path=\"path/to/file.csv\") # Save EventSet to a .csv file.\n", + "```\n", + "\n", + "Converting `EventSet` data to and from pandas DataFrames is also easily done via `tp.to_pandas()` and `tp.from_pandas()`." ] }, { "cell_type": "code", "execution_count": null, - "id": "8badbebf", + "id": "da239494", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.149178Z", - "iopub.status.busy": "2023-07-24T15:01:00.149039Z", - "iopub.status.idle": "2023-07-24T15:01:00.152148Z", - "shell.execute_reply": "2023-07-24T15:01:00.151798Z" + "iopub.execute_input": "2023-07-24T15:01:00.200932Z", + "iopub.status.busy": "2023-07-24T15:01:00.200760Z", + "iopub.status.idle": "2023-07-24T15:01:00.212641Z", + "shell.execute_reply": "2023-07-24T15:01:00.212298Z" } }, "outputs": [], "source": [ - "daily_sales = tp.event_set(\n", - "\ttimestamps=[\"2020-01-01\", \"2020-01-01\", \"2020-01-02\", \"2020-01-02\"],\n", - "\tfeatures={\n", - " \"store\": [1, 1, 1, 2],\n", - " \"product\": [1, 2, 1, 2],\n", - " \"sale\": [100.0, 200.0, 110.0, 300.0],\n", - " },\n", - ")\n", - "print(daily_sales)" + "df = pd.DataFrame({\n", + " \"timestamp\": [1, 2, 3, 5, 6],\n", + " \"f1\": [0.1, 0.2, 0.3, 1.1, 1.2],\n", + " \"f2\": [\"red\", \"red\", \"red\", \"blue\", \"blue\"],\n", + "})\n", + "\n", + "# Create EventSet from DataFrame.\n", + "evset = tp.from_pandas(df)\n", + "\n", + "# Convert EventSet to DataFrame.\n", + "df = tp.to_pandas(evset)" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "69b3c03c", + "id": "64cb7ff2-945d-461d-ba4b-b5ac1e127f85", "metadata": { - "cell_marker": "\"\"\"", - "lines_to_next_cell": 0 + "jp-MarkdownHeadingCollapsed": true }, "source": [ + "## Eager mode vs Graph mode\n", "\n", - "Since we haven't defined the `indexes` yet, `store` and `product` are just regular features above.\n", - "Let's add the `(product, store)` pair as the index." + "Temporian has two execution modes: **eager** and **graph**. In eager mode, operators are applied immediately. This mode is useful for learning Temporian, for iterative and interactive development, and for lightweight/small data use cases where performance isn't a priority.\n", + "\n", + "In graph mode, operators are combined together into \"Temporian programs\" before being executed. Graph mode is more efficient and it consumes less memory. Temporian programs can be saved, inspected, and distributed by users.\n", + "\n", + "Migrating a Temporian program from eager to graph mode is easy and requires little work. Most of the time, adding a `@tp.compile` annotation is enough. Therefore, it is recommended to develop programs in eager mode and then to productize them in graph mode.\n", + "\n", + "Next, we see a the same program written three times: First, in eager mode, then in graph mode using `@tp.compile`, and finally in graph mode without `@tp.compile`." ] }, { "cell_type": "code", "execution_count": null, - "id": "479096c3", + "id": "d5405837-c801-40e9-8b41-4d4dc901d429", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.154125Z", - "iopub.status.busy": "2023-07-24T15:01:00.154007Z", - "iopub.status.idle": "2023-07-24T15:01:00.157566Z", - "shell.execute_reply": "2023-07-24T15:01:00.157243Z" - }, - "lines_to_next_cell": 2 + "iopub.execute_input": "2023-07-24T15:00:57.315244Z", + "iopub.status.busy": "2023-07-24T15:00:57.315083Z", + "iopub.status.idle": "2023-07-24T15:00:57.417894Z", + "shell.execute_reply": "2023-07-24T15:00:57.417481Z" + } }, "outputs": [], "source": [ - "a = daily_sales.node()\n", - "b = a.add_index([\"product\", \"store\"])\n", - "b.run({a: daily_sales})" + "# Eager mode\n", + "#\n", + "# Note: This Temporian program contains three operators: two \"simple_moving_average\" and one \"tp.substract\" operators.\n", + "result = evset.simple_moving_average(window_length=0.5) - evset.simple_moving_average(window_length=1.0)\n", + "result.plot()" ] }, { - "attachments": {}, - "cell_type": "markdown", - "id": "c2dc98f6", + "cell_type": "code", + "execution_count": null, + "id": "9c854408-0804-4435-8d44-f521ef1b379e", "metadata": { - "cell_marker": "\"\"\"", - "lines_to_next_cell": 0 + "execution": { + "iopub.execute_input": "2023-07-24T15:00:57.420139Z", + "iopub.status.busy": "2023-07-24T15:00:57.419972Z", + "iopub.status.idle": "2023-07-24T15:00:57.522730Z", + "shell.execute_reply": "2023-07-24T15:00:57.522286Z" + } }, + "outputs": [], "source": [ + "# Graph mode with @tp.compile\n", "\n", - "The `moving_sum` operator can be used to calculate the weekly sum of sales\n", - "for each `(product, store)` pair." + "@tp.compile\n", + "def my_function(x):\n", + " return x.simple_moving_average(window_length=0.5) - x.simple_moving_average(window_length=1.0)\n", + "\n", + "result = my_function(evset)\n", + " \n", + "result.plot()" ] }, { "cell_type": "code", "execution_count": null, - "id": "4df0d8cf", + "id": "e4aa008f-aa8e-486f-a96c-854fb5b2bd83", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.159586Z", - "iopub.status.busy": "2023-07-24T15:01:00.159442Z", - "iopub.status.idle": "2023-07-24T15:01:00.163136Z", - "shell.execute_reply": "2023-07-24T15:01:00.162800Z" - }, - "lines_to_next_cell": 0 + "iopub.execute_input": "2023-07-24T15:00:57.525125Z", + "iopub.status.busy": "2023-07-24T15:00:57.524948Z", + "iopub.status.idle": "2023-07-24T15:00:57.629039Z", + "shell.execute_reply": "2023-07-24T15:00:57.628643Z" + } }, "outputs": [], "source": [ - "# Weekly sales by product and store\n", - "c = b[\"sale\"].moving_sum(window_length=tp.duration.weeks(1))\n", - "c.run({a: daily_sales})" + "# Graph model without @tp.compile\n", + "\n", + "input_node = tp.input_node([(\"value\", tp.float64)])\n", + "# Or input_node = tp.input_node(evset.schema.features)\n", + "\n", + "result_node = input_node.simple_moving_average(window_length=0.5) - input_node.simple_moving_average(window_length=1.0)\n", + "result = tp.run(result_node, {input_node: evset}, verbose=1)\n", + " \n", + "result.plot()" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "2295d4ee", + "id": "6f961cee-c813-46b8-bf49-cecd95916b31", "metadata": { - "cell_marker": "\"\"\"", - "lines_to_next_cell": 0 + "jp-MarkdownHeadingCollapsed": true }, "source": [ + "## More on graph mode\n", "\n", - "If we want the weekly sum of sales per `store`, we can just drop the `product` index." + "**Remark:** While you will likely use the graph mode with `@tp.compile` , it is useful for you to understand the graph model without `@tp.compile`.\n", + "\n", + "A Temporian program is a graph of [EventSetNodes][temporian.EventSetNode] connecting operators. A graph is executed with the function `tp.run(, )`.\n", + "\n", + "\"eager\n", + "\n", + "The `` can be specified as an `EventSetNode`, a list of `EventSetNodes`, or a dictionary of names to `EventSetNodes`, and the result of `tp.run()` will be of the same type. For example, if `` is a list of three `EventSetNodes`, the result will be a list of the three corresponding `EventSets`.\n", + "\n", + "The `` can be specified as:\n", + "\n", + "- A dictionary of `EventSetNodes` to `EventSets`, or \n", + "- A dictionary of names to `EventSets`, or,\n", + "- A list of `EventSets`, or\n", + "- A single `EventSet`\n", + "\n", + "This lets Temporian know the `EventSetNodes` of the graph that each input `EventSet` corresponds to. If `` is a dictionary of names to `EventSets`, the names must match the names of `EventSetNodes` in the graph. If `` is a list or a single `EventSet`, the names of those `EventSets` must do the same. If we specify the inputs as a dictionary, we could skip passing a name to `a_evset`." ] }, { "cell_type": "code", "execution_count": null, - "id": "8d9448a2", + "id": "dd4142a0-df47-4ca3-aafe-7a105b4f2deb", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.165204Z", - "iopub.status.busy": "2023-07-24T15:01:00.165078Z", - "iopub.status.idle": "2023-07-24T15:01:00.170459Z", - "shell.execute_reply": "2023-07-24T15:01:00.169929Z" - }, - "lines_to_next_cell": 0 + "iopub.execute_input": "2023-07-24T15:00:57.631693Z", + "iopub.status.busy": "2023-07-24T15:00:57.631532Z", + "iopub.status.idle": "2023-07-24T15:00:57.636094Z", + "shell.execute_reply": "2023-07-24T15:00:57.635717Z" + } }, "outputs": [], "source": [ - "# Weekly sales by store (including all products)\n", - "d = b.drop_index(\"product\")\n", - "e = d[\"sale\"].moving_sum(window_length=tp.duration.weeks(1))\n", - "e.run({a: daily_sales})" + "input_node = tp.input_node([(\"value\", tp.float64)])\n", + "result_1_node = input_node.simple_moving_average(window_length=0.5)\n", + "result_2_node = input_node.simple_moving_average(window_length=1.0)\n", + "result_3_node = result_1_node - result_2_node\n", + "\n", + "result = tp.run([result_1_node,result_2_node, result_3_node], {input_node: evset})\n", + " \n", + "print(result)" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "f67b3f0c", - "metadata": { - "cell_marker": "\"\"\"", - "lines_to_next_cell": 0 - }, + "id": "bca4258f-cdb2-4b2b-992d-4c2937a2868f", + "metadata": {}, "source": [ + "**Remarks:**\n", "\n", - "Finally, let's calculate the ratio of sales of each `(product, store)` pair compared to the whole `store` sales.\n", - "\n", - "Since `c` (weekly sales for each product and store) and `e` (weekly sales for each store) have different indexes, we cannot use `tp.divide` (or `/`) directly - we must first `propagate` `e` to the `[\"product\", \"store\"]` index." + "- It's important to distinguish between a `tp.EventSet`, such as `evset`, that contains data, and a `tp.EventSetNode`, like `input_node`, that connect operators together and compose the computation graph, but do not contain data.\n", + "- No computation is performed when defining the graph (i.e., when calling the operator functions). All computation is done during `tp.run()`.\n", + "- In `tp.run()`, the second argument defines a mapping between input `EventSetNodes` and `EventSets`. If all necessary input `EventSetNodes` are not fed, an error will be raised.\n", + "- In most cases you will only pass `EventSets` that correspond to the graph's input `EventSetNodes`, but Temporian also supports passing `EventSets` to intermediate `EventSetNodes` in the graph." + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "5b445f9c-725b-47b1-bd8c-fc0502b99016", + "metadata": {}, + "source": [ + "The `@tp.compile` annotation takes a function inputing and outputing `tp.EventSetNode`, and automatically calls `tp.run` on the result of the function if a `tp.EventSet` is provided as input." ] }, { "cell_type": "code", "execution_count": null, - "id": "4e12a9e0", + "id": "b0b0220b-9869-454c-8f3b-afeabaca06bc", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.172674Z", - "iopub.status.busy": "2023-07-24T15:01:00.172528Z", - "iopub.status.idle": "2023-07-24T15:01:00.177142Z", - "shell.execute_reply": "2023-07-24T15:01:00.176616Z" - }, - "lines_to_next_cell": 0 + "iopub.execute_input": "2023-07-24T15:00:57.638508Z", + "iopub.status.busy": "2023-07-24T15:00:57.638232Z", + "iopub.status.idle": "2023-07-24T15:00:57.642016Z", + "shell.execute_reply": "2023-07-24T15:00:57.641623Z" + } }, "outputs": [], "source": [ - "# Copy the content of e (indexed by (store)) into each (store, product).\n", - "f = c / e.propagate(sampling=c, resample=True)\n", + "@tp.compile\n", + "def my_function(x : tp.types.EventSetOrNode) -> tp.types.EventSetOrNode:\n", + " return x.simple_moving_average(window_length=0.5)\n", "\n", - "# Equivalent.\n", - "f = c / e.propagate(sampling=c).resample(sampling=c)\n", - "print(f.run({a: daily_sales}))" + "# Feeding an EventSet\n", + "input_evset = tp.event_set(timestamps=[1, 2, 3],features={\"value\": [5., 6., 7.]})\n", + "assert isinstance(my_function(input_evset), tp.EventSet)\n", + "\n", + "# Feeding an EventSetNode\n", + "input_node = tp.input_node([(\"value\", tp.float64)])\n", + "assert isinstance(my_function(input_node), tp.EventSetNode)" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "e73da62c", - "metadata": { - "cell_marker": "\"\"\"", - "lines_to_next_cell": 0 - }, + "id": "282ec163-1d0e-442a-bb18-ac961010b28e", + "metadata": {}, "source": [ + "Importantly, variables in a `tp.compile` function are `EventSetNode` and not `EventSet`. Therefore, you cannot directly access the event set data.\n", "\n", - "The `EventSet.propagate()` operator expands the indexes of its `input` (`e` in this case) to match the indexes of its `sampling` by copying the content of `input` into each corresponding index group of `sampling`. Note that `sampling`'s indexes must be a superset of `input`'s indexes.\n", - "\n", - "## Future leakage\n", - "\n", - "In supervised learning, [leakage]() is the use of data not available at serving time by a machine learning model. A common example of leakage is _label leakage_, which involves the invalid use of labels in the model input features. Leakage tends to bias model evaluation by making it appear much better than it is in reality. Unfortunately, leakage is often subtle, easy to inject, and challenging to detect.\n", - "\n", - "Another type of leakage is future leakage, where a model uses data before it is available. Future leakage is particularly easy to create, as all feature data is ultimately available to the model, the problem being it being accessed at the wrong time.\n", - "\n", - "To avoid future leakage, Temporian operators are guaranteed to not cause future leakage, except for the `EventSet.leak()` operator. This means that it is impossible to inadvertently add future leakage to a Temporian program.\n", - "\n", - "`EventSet.leak()` can be useful for precomputing labels or evaluating machine learning models. However, its outputs shouldn’t be used as input features." + "In addition, the compiled function execution first generates the graph. The graph is then executed. In the next example, the compiled function generates a graph with 10 operators." ] }, { "cell_type": "code", "execution_count": null, - "id": "c07453fa", + "id": "945d8f39-18ad-44df-a4d2-9d8986e7825b", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.179407Z", - "iopub.status.busy": "2023-07-24T15:01:00.179261Z", - "iopub.status.idle": "2023-07-24T15:01:00.182867Z", - "shell.execute_reply": "2023-07-24T15:01:00.182049Z" + "iopub.execute_input": "2023-07-24T15:00:57.644118Z", + "iopub.status.busy": "2023-07-24T15:00:57.643976Z", + "iopub.status.idle": "2023-07-24T15:00:57.646561Z", + "shell.execute_reply": "2023-07-24T15:00:57.646187Z" } }, "outputs": [], "source": [ - "a = tp.input_node(features=[(\"feature_1\", tp.float32)])\n", - "b = a.moving_count(1)\n", - "c = b.leak(1).moving_count(2)" + "@tp.compile\n", + "def my_function(x : tp.EventSetNode) -> tp.EventSetNode:\n", + " for i in range(10):\n", + " x = x.simple_moving_average(window_length=i+1)\n", + " return x" ] }, { + "attachments": {}, "cell_type": "markdown", - "id": "d2e37ee5", + "id": "660e2930-38b5-4eaa-af3e-97b97b1a422c", "metadata": {}, "source": [ - "In this example, `b` does not have a future leak, but `c` does because it depends on `EventSet.leak()`.\n", - "\n", - "To check programmatically if an `EventSetNode` depends on `leak()`, we can use the `tp.has_leak()` function." + "You can create a compiled function with a `if`. However, the condition of the `if` cannot depend on the EventSet data." ] }, { "cell_type": "code", "execution_count": null, - "id": "ab15c133", + "id": "941a5fc4-edfc-4fba-8bc8-22f3a7387e91", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.185286Z", - "iopub.status.busy": "2023-07-24T15:01:00.185178Z", - "iopub.status.idle": "2023-07-24T15:01:00.187923Z", - "shell.execute_reply": "2023-07-24T15:01:00.187503Z" + "iopub.execute_input": "2023-07-24T15:00:57.648616Z", + "iopub.status.busy": "2023-07-24T15:00:57.648475Z", + "iopub.status.idle": "2023-07-24T15:00:57.651921Z", + "shell.execute_reply": "2023-07-24T15:00:57.651456Z" } }, "outputs": [], "source": [ - "print(tp.has_leak(b))" + "@tp.compile\n", + "def my_function(x : tp.types.EventSetOrNode, a:bool) -> tp.types.EventSetOrNode:\n", + " if a:\n", + " return x.rename(\"a_branch\")\n", + " else:\n", + " return x.rename(\"non_a_branch\")\n", + "\n", + "print(my_function(input_evset, a=True).schema.features)\n", + "\n", + "print(my_function(input_evset, a=False).schema.features)" + ] + }, + { + "attachments": {}, + "cell_type": "markdown", + "id": "57eff095-9188-4add-b904-7679ed86a2de", + "metadata": {}, + "source": [ + "If you want to create a program conditional on EventSet data, you can use `EventSet.filter()`." ] }, { "cell_type": "code", "execution_count": null, - "id": "cd455fc1", + "id": "a9ab68f3-91a6-445e-99c2-7f2379185f21", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.190006Z", - "iopub.status.busy": "2023-07-24T15:01:00.189857Z", - "iopub.status.idle": "2023-07-24T15:01:00.192310Z", - "shell.execute_reply": "2023-07-24T15:01:00.191954Z" + "iopub.execute_input": "2023-07-24T15:00:57.654090Z", + "iopub.status.busy": "2023-07-24T15:00:57.653930Z", + "iopub.status.idle": "2023-07-24T15:00:57.658773Z", + "shell.execute_reply": "2023-07-24T15:00:57.658419Z" } }, "outputs": [], "source": [ - "print(tp.has_leak(c))" + "@tp.compile\n", + "def my_function(x : tp.types.EventSetOrNode) -> tp.types.EventSetOrNode:\n", + " return x[\"value\"].filter(x[\"condition\"])\n", + "\n", + "my_function(tp.event_set(\n", + "\ttimestamps=[1,2,3],\n", + "\tfeatures={\n", + " \"value\": [10, 11, 12],\n", + " \"condition\":[True, True, False]}\n", + "))" ] }, { "attachments": {}, "cell_type": "markdown", - "id": "8d973547", - "metadata": { - "cell_marker": "\"\"\"", - "lines_to_next_cell": 0 - }, + "id": "80ebc42e-4cc4-4928-b815-af353ae41a11", + "metadata": {}, "source": [ - "By using `tp.has_leak()`, we can programmatically identify future leakage and modify our code accordingly.\n", - "\n", - "## Accessing `EventSet` data\n", - "\n", - "`EventSet` data can be accessed using their `data` attribute. Temporian internally relies on NumPy, which means that the data access functions always return NumPy arrays." + "To simplify its usage when the graph contains a single output `EventSetNode`, `node.run(...)` is equivalent to `tp.run(node, ...)`." ] }, { - "cell_type": "code", - "execution_count": null, - "id": "7da63117", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.194430Z", - "iopub.status.busy": "2023-07-24T15:01:00.194277Z", - "iopub.status.idle": "2023-07-24T15:01:00.198829Z", - "shell.execute_reply": "2023-07-24T15:01:00.198424Z" - } - }, - "outputs": [], + "attachments": {}, + "cell_type": "markdown", + "id": "79ed1db9-43cf-4d8d-8d19-c6594565b71e", + "metadata": {}, "source": [ - "evset = tp.event_set(\n", - "\ttimestamps=[1, 2, 3, 5, 6],\n", - "\tfeatures={\n", - " \"f1\": [0.1, 0.2, 0.3, 1.1, 1.2],\n", - " \"f2\": [\"red\", \"red\", \"red\", \"blue\", \"blue\"],\n", - "\t},\n", - "\tindexes=[\"f2\"],\n", - ")\n", "\n", - "# Access the data for the index group `f2=red`.\n", - "evset.get_index_value((\"red\",))" + "\n", + "\n", + "**Warning:** It is more efficient to run multiple output `EventSetNodes` together with `tp.run()` than to run them separately with `node_1.run(...)`, `node_2.run(...)`, etc." ] }, { "attachments": {}, "cell_type": "markdown", - "id": "eddfa88e", + "id": "0da789f5-a0dd-4b7b-8887-b5a9c2801678", "metadata": { "cell_marker": "\"\"\"", "lines_to_next_cell": 0 }, "source": [ - "\n", - "\n", - "## Import and export data\n", - "\n", - "`EventSets` can be read from and saved to csv files via the `tp.from_csv()` and `tp.to_csv()` functions.\n", - "\n", - "```python\n", - "evset = tp.from_csv( # Read EventSet from a .csv file.\n", - " path=\"path/to/file.csv\",\n", - " timestamps=\"timestamp\",\n", - " indexes=[\"product_id\"],\n", - ")\n", - "\n", - "tp.to_csv(evset, path=\"path/to/file.csv\") # Save EventSet to a .csv file.\n", - "```\n", + "Previously, we defined the input of the graph with `tp.input_node()`. This way of listing features manually and their respective data type is cumbersome.\n", "\n", - "Converting `EventSet` data to and from pandas DataFrames is also easily done via `tp.to_pandas()` and `tp.from_pandas()`." + "If an `EventSet` is available (i.e., data is available) this step can be changed to use `evset.node()` instead, which will return an `EventSetNode` that is compatible with it. This is especially useful when creating `EventSets` from existing data, such as pandas DataFrames or CSV files." ] }, { "cell_type": "code", "execution_count": null, - "id": "da239494", + "id": "d4fc33b0", "metadata": { "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.200932Z", - "iopub.status.busy": "2023-07-24T15:01:00.200760Z", - "iopub.status.idle": "2023-07-24T15:01:00.212641Z", - "shell.execute_reply": "2023-07-24T15:01:00.212298Z" - } + "iopub.execute_input": "2023-07-24T15:00:57.661104Z", + "iopub.status.busy": "2023-07-24T15:00:57.660955Z", + "iopub.status.idle": "2023-07-24T15:00:57.664631Z", + "shell.execute_reply": "2023-07-24T15:00:57.664234Z" + }, + "lines_to_next_cell": 0 }, "outputs": [], "source": [ - "df = pd.DataFrame({\n", - " \"timestamp\": [1, 2, 3, 5, 6],\n", - " \"f1\": [0.1, 0.2, 0.3, 1.1, 1.2],\n", - " \"f2\": [\"red\", \"red\", \"red\", \"blue\", \"blue\"],\n", - "})\n", + "# Define an EventSet.\n", + "a_evset = tp.event_set(\n", + "\ttimestamps=[0, 1, 2],\n", + "\tfeatures={\n", + " \"feature_1\": [1.0, 2.0, 3.0],\n", + " \"feature_2\": [\"hello\", \"little\", \"dog\"],\n", + " \"feature_3\": [\"A\", \"A\", \"B\"],\n", + "\t}\n", + ")\n", "\n", - "# Create EventSet from DataFrame.\n", - "evset = tp.from_pandas(df)\n", + "# The following three statements are (almost) equivalent.\n", + "a_node = tp.input_node(\n", + " features=[\n", + " (\"feature_1\", tp.float64),\n", + " (\"feature_2\", tp.str_),\n", + " ],\n", + " indexes=[(\"feature_3\", tp.str_)])\n", "\n", - "# Convert EventSet to DataFrame.\n", - "df = tp.to_pandas(evset)" + "a_node = tp.input_node(\n", + " features=a_evset.schema.features,\n", + " indexes=a_evset.schema.indexes\n", + ")\n", + " \n", + "a_node = a_evset.node()" ] }, { @@ -2239,7 +2243,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.4" + "version": "3.10.13" } }, "nbformat": 4, From a815629b03f9452c2d64f389cb56f6a6ac5b6acf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Braulio=20R=C3=ADos?= Date: Thu, 26 Oct 2023 17:46:30 -0300 Subject: [PATCH 2/9] Move user guide to use eager mode --- docs/src/user_guide.ipynb | 801 ++++++++++++-------------------------- 1 file changed, 244 insertions(+), 557 deletions(-) diff --git a/docs/src/user_guide.ipynb b/docs/src/user_guide.ipynb index d6550666a..29a7e7054 100644 --- a/docs/src/user_guide.ipynb +++ b/docs/src/user_guide.ipynb @@ -8,7 +8,7 @@ "source": [ "# User Guide\n", "\n", - "This is a complete tour of Temporian's capabilities. For a brief introduction to how the library works, please refer to [3 minutes to Temporian](./3_minutes).\n" + "This is a complete tour of Temporian's capabilities. For a quick hands-on overview, make sure to check the [Getting started guide](./getting_started)." ] }, { @@ -60,10 +60,10 @@ "**Remarks:**\n", "\n", "- All values for a given feature are of the same data type. For instance, `feature_1` is float64 while `feature_2` is a string.\n", - "- Many operators interpret the value NaN (for _not a number_) as missing.\n", + "- Operators handle the value NaN (for _not a number_) as missing (e.g., it's ignored in moving averages).\n", "- Timestamps are not necessarily uniformly sampled.\n", "- The same timestamp can be repeated.\n", - "- The events withing an EventSet are sampled synchronously. However, different EventSets might be sampled differently.\n", + "- Timestamps can be floating point numbers (in seconds) that don't represent a datetime.\n", "\n", "In the next code examples, variables with names like `evset` refer to an `EventSet`.\n", "\n", @@ -111,7 +111,7 @@ "metadata": {}, "outputs": [], "source": [ - "print(evset)" + "evset" ] }, { @@ -130,14 +130,7 @@ "cell_type": "code", "execution_count": null, "id": "e3f29b64", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:00:56.491002Z", - "iopub.status.busy": "2023-07-24T15:00:56.490848Z", - "iopub.status.idle": "2023-07-24T15:00:57.122544Z", - "shell.execute_reply": "2023-07-24T15:00:57.122043Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "evset.plot()" @@ -169,25 +162,16 @@ "id": "e7a88b45-bef7-46ac-88b8-f376cc14ee88", "metadata": {}, "source": [ - "## Operators and eager mode\n", + "## Operators\n", "\n", - "Processing operations are performed by **Operators**. For instance, the `EventSet.simple_moving_average()` operator computes the [simple moving average](https://en.wikipedia.org/wiki/Moving_average) of each feature in an `EventSet`.\n", - "\n", - "The list of all operators is available in the [API Reference](../reference/)." + "`EventSets` are transformed using **Operators**. For instance, the `EventSet.simple_moving_average()` operator computes the [simple moving average](https://en.wikipedia.org/wiki/Moving_average) of each feature." ] }, { "cell_type": "code", "execution_count": null, "id": "f0c059c3-1412-47d5-8f21-8c034f16a551", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:00:57.125248Z", - "iopub.status.busy": "2023-07-24T15:00:57.125018Z", - "iopub.status.idle": "2023-07-24T15:00:57.312917Z", - "shell.execute_reply": "2023-07-24T15:00:57.312518Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "# Create an event set with a random walk\n", @@ -199,13 +183,24 @@ "\tfeatures={\"value\": random_walk}\n", ")\n", "\n", - "# Compute a simple moving average\n", + "# Compute a simple moving average (1 second, equivalent to tp.duration.seconds(1))\n", "result = evset.simple_moving_average(window_length=1)\n", "\n", "# Plot the results\n", "tp.plot([evset, result]) " ] }, + { + "cell_type": "markdown", + "id": "df79875e-7802-4316-94da-9923650c01b5", + "metadata": {}, + "source": [ + "By default, all durations in Temporian are given in **seconds**. So, `window_length=1` means 1 second of duration.\n", + "See the next section to see how to specify other time units.\n", + "\n", + "The list of all operators is available in the [API Reference](../reference/)." + ] + }, { "attachments": {}, "cell_type": "markdown", @@ -215,14 +210,12 @@ "lines_to_next_cell": 0 }, "source": [ - "\n", "## Time units\n", "\n", - "In Temporian, times are always represented by a float64 value. Users have the freedom to choose the semantic to this value. For example, the time can be the number of nanoseconds since the start of the day, the number of cycles of a process, the number of years since the big bang, or the number of seconds since January 1, 1970, at 00:00:00 UTC, also known as Unix or POSIX time.\n", - "\n", - "To ease the feature engineering of dates, Temporian contains a set of _calendar operators_. These operators specialize in creating features from dates and datetimes. For instance, the `EventSet.calendar_hour()` operator returns the hour of the date in the range `0-23`.\n", + "### Timestamps and datetimes\n", + "In Temporian, timestamps are always represented by a `float64` value in **seconds**.\n", "\n", - "Calendar operators require the time in their inputs to be Unix time, so applying them on non-Unix timestamps will raise errors. Temporian can sometimes automatically recognize if input timestamps correspond to Unix time (e.g. when an `EventSet` is created from a pandas DataFrame with a datetime column, or when passing a list of datetime objects as timestamps in `EventSet`'s constructor). If creating `EventSets` manually and passing floats directly to `timestamps`, you need to explicitly specify whether they correspond to Unix times or not via the `is_unix_timestamp` argument." + "When datetimes are provided as the timestamps, Temporian internally converts them to the number of seconds since January 1, 1970, at 00:00:00 UTC, also known as Unix or POSIX time. But the printing and plotting functions will still show datetimes, which are easier to interpret by humans." ] }, { @@ -230,30 +223,51 @@ "execution_count": null, "id": "92ec9711", "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:00:57.666655Z", - "iopub.status.busy": "2023-07-24T15:00:57.666536Z", - "iopub.status.idle": "2023-07-24T15:00:57.679313Z", - "shell.execute_reply": "2023-07-24T15:00:57.678950Z" - }, "lines_to_next_cell": 0 }, "outputs": [], "source": [ + "from datetime import datetime\n", + "\n", "a_evset = tp.event_set(\n", " timestamps=[\n", - " pd.to_datetime(\"Monday Mar 13 12:00:00 2023\", utc=True),\n", - " pd.to_datetime(\"Tuesday Mar 14 12:00:00 2023\", utc=True),\n", - " pd.to_datetime(\"Friday Mar 17 00:00:01 2023\", utc=True),\n", + " # strings are interpreted as datetimes\n", + " \"2023-03-13\",\n", + " \"2023-03-14 13:30:05\",\n", + "\n", + " # python and pandas datetimes are ok too :)\n", + " datetime(2023, 4, 22, 12, 00),\n", + " pd.to_datetime(\"Tue, Mar 14 12:00:00 2023\", utc=True),\n", " ],\n", " features={\n", - " \"feature_1\": [1, 2, 3],\n", - " \"feature_2\": [\"a\", \"b\", \"c\"],\n", + " \"feature_1\": [1, 2, 3, 4],\n", + " \"feature_2\": [\"a\", \"b\", \"c\", \"d\"],\n", " },\n", ")\n", - "a_node = a_evset.node()\n", - "b_node = tp.glue(a_node, a_node.calendar_day_of_week())\n", - "b_node.run(a_evset)" + "a_evset" + ] + }, + { + "cell_type": "markdown", + "id": "e23789b4-3b14-47ee-ad49-3980e9d111c7", + "metadata": {}, + "source": [ + "If you specify floating point numbers as the timestamps (which might be useful to handle signals such as ECG, audio, etc.), then the _calendar operators_ like `EventSet.calendar_hour()` or `EventSet.calendar_day_of_month()` are disabled, they will raise an error unless you indicate that these numbers represent datetimes, by setting `is_unix_timestamp=True` explicitly." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4869f529-350b-43a5-af07-fded47ccad54", + "metadata": {}, + "outputs": [], + "source": [ + "a_evset = tp.event_set(\n", + " timestamps=[0, 1, 2],\n", + " is_unix_timestamp=True\n", + ")\n", + "\n", + "tp.glue(a_evset.calendar_year(), a_evset.calendar_hour(), a_evset.calendar_second())" ] }, { @@ -265,33 +279,33 @@ "lines_to_next_cell": 0 }, "source": [ + "### Durations\n", "\n", - "Temporian accepts time inputs in various formats, including integer, float, Python date or datetime, NumPy datetime, and pandas datetime. Date and datetime objects are internally converted to floats as Unix time in seconds, compatible with the calendar operators.\n", - "\n", - "Operators can take _durations_ as input arguments. For example, the simple moving average operator takes a `window_length` argument. Temporian exposes several utility functions to help creating those duration arguments when using Unix timestamps:" + "Operators can take _durations_ as input arguments, which are always in seconds, as mentioned above. This is compatible with datetime-like timestamps, as well as floating point timestamps that don't represent a datetime." ] }, { "cell_type": "code", "execution_count": null, - "id": "508c3f0c", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:00:57.681429Z", - "iopub.status.busy": "2023-07-24T15:00:57.681281Z", - "iopub.status.idle": "2023-07-24T15:00:57.684114Z", - "shell.execute_reply": "2023-07-24T15:00:57.683752Z" - } - }, + "id": "899fee67-01d0-4680-a223-7b7b144a46ca", + "metadata": {}, "outputs": [], "source": [ - "a = tp.input_node(features=[(\"feature_1\", tp.float64)])\n", + "a = tp.event_set(timestamps=[\"2023-03-13\", \"2023-03-14\", \"2023-03-15\"])\n", "\n", - "# Define a 1-day moving average.\n", - "b = a.simple_moving_average(window_length=tp.duration.days(1))\n", + "# Number of seconds in 2 days:\n", + "a.moving_count(window_length=2 * 24 * 60 * 60)\n", "\n", - "# Equivalent.\n", - "b = a.simple_moving_average(window_length=24 * 60 * 60)" + "# Better option:\n", + "a.moving_count(window_length=tp.duration.days(2))" + ] + }, + { + "cell_type": "markdown", + "id": "374ce207-f369-446a-9b6d-fd5d25939321", + "metadata": {}, + "source": [ + "**Note:** all window operators work with left-open intervals, so for each `t` in the sampling, events in `(t - window_length, t]` will be considered (i.e., the exact time `t - window_length` is not included). That is why the moving window at `t=2023-03-15` doesn't include the event at `t=2023-03-13`, when using a window length of 2 days." ] }, { @@ -319,14 +333,7 @@ "cell_type": "code", "execution_count": null, "id": "cbf42f42", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:00:57.686202Z", - "iopub.status.busy": "2023-07-24T15:00:57.685957Z", - "iopub.status.idle": "2023-07-24T15:00:57.884670Z", - "shell.execute_reply": "2023-07-24T15:00:57.884262Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "evset = tp.event_set(\n", @@ -360,14 +367,7 @@ "cell_type": "code", "execution_count": null, "id": "82552e04", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:00:57.887017Z", - "iopub.status.busy": "2023-07-24T15:00:57.886848Z", - "iopub.status.idle": "2023-07-24T15:00:58.113203Z", - "shell.execute_reply": "2023-07-24T15:00:58.112793Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "figure = evset.plot(\n", @@ -396,19 +396,12 @@ "cell_type": "code", "execution_count": null, "id": "37feddd0", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:00:58.115589Z", - "iopub.status.busy": "2023-07-24T15:00:58.115426Z", - "iopub.status.idle": "2023-07-24T15:01:00.005021Z", - "shell.execute_reply": "2023-07-24T15:01:00.004601Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "!pip install bokeh -q\n", "\n", - "evset.plot(interactive=True)" + "evset.plot(interactive=True, width_px=500)" ] }, { @@ -423,31 +416,23 @@ "\n", "## Feature naming\n", "\n", - "Each feature is identified by a name, and the list of features is available through the `features` property of an `EventSetNode`." + "Each feature is identified by a name, and the list of features is available through the `schema.feature_names()` method of an `EventSet`." ] }, { "cell_type": "code", "execution_count": null, "id": "38ff0e20", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.007393Z", - "iopub.status.busy": "2023-07-24T15:01:00.007171Z", - "iopub.status.idle": "2023-07-24T15:01:00.010463Z", - "shell.execute_reply": "2023-07-24T15:01:00.010135Z" - } - }, + "metadata": {}, "outputs": [], "source": [ - "events = tp.event_set(\n", - "\ttimestamps=[1,2,3,4,5],\n", + "evset = tp.event_set(\n", + "\ttimestamps=[0],\n", "\tfeatures={\n", - "\t \"feature_1\": [0.5, 0.6, 0.4, 0.4, 0.9],\n", - "\t \"feature_2\": [1.0, 2.0, 3.0, 2.0, 1.0]}\n", + "\t \"feature_1\": [0.1],\n", + "\t \"feature_2\": [0.2]}\n", " )\n", - "node = events.node()\n", - "print(node.features)" + "print(evset.schema.feature_names())" ] }, { @@ -467,17 +452,10 @@ "cell_type": "code", "execution_count": null, "id": "838449d4", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.012599Z", - "iopub.status.busy": "2023-07-24T15:01:00.012475Z", - "iopub.status.idle": "2023-07-24T15:01:00.015736Z", - "shell.execute_reply": "2023-07-24T15:01:00.015395Z" - } - }, + "metadata": {}, "outputs": [], "source": [ - "node.moving_sum(window_length=10).features" + "evset.moving_sum(window_length=10).schema.feature_names()" ] }, { @@ -497,18 +475,10 @@ "cell_type": "code", "execution_count": null, "id": "b10fdec3", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.017898Z", - "iopub.status.busy": "2023-07-24T15:01:00.017753Z", - "iopub.status.idle": "2023-07-24T15:01:00.021061Z", - "shell.execute_reply": "2023-07-24T15:01:00.020666Z" - } - }, + "metadata": {}, "outputs": [], "source": [ - "result = node[\"feature_1\"] * node[\"feature_2\"]\n", - "result.features" + "(evset[\"feature_1\"] * evset[\"feature_2\"]).schema.feature_names()" ] }, { @@ -521,7 +491,7 @@ }, "source": [ "\n", - "The calendar operators don't depend on input features but on the timestamps, so the output feature name doesn't\n", + "The calendar operators don't depend on input features but only on the timestamps, so the output feature name doesn't\n", "relate to the input feature names." ] }, @@ -529,22 +499,14 @@ "cell_type": "code", "execution_count": null, "id": "4182d3f8", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.023467Z", - "iopub.status.busy": "2023-07-24T15:01:00.023325Z", - "iopub.status.idle": "2023-07-24T15:01:00.026531Z", - "shell.execute_reply": "2023-07-24T15:01:00.026132Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "date_events = tp.event_set(\n", "\ttimestamps=[\"2020-02-15\", \"2020-06-20\"],\n", "\tfeatures={\"some_feature\": [10, 20]}\n", " )\n", - "date_node = date_events.node()\n", - "print(date_node.calendar_month().features)" + "print(date_events.calendar_month().schema.feature_names())" ] }, { @@ -564,78 +526,33 @@ "cell_type": "code", "execution_count": null, "id": "bc36bc1f", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.029017Z", - "iopub.status.busy": "2023-07-24T15:01:00.028848Z", - "iopub.status.idle": "2023-07-24T15:01:00.031960Z", - "shell.execute_reply": "2023-07-24T15:01:00.031429Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "# Rename a single feature.\n", - "renamed_f1 = node[\"feature_1\"].rename(\"renamed_1\")\n", - "print(renamed_f1.features)" + "evset[\"feature_1\"].rename(\"renamed_1\")" ] }, { "cell_type": "code", "execution_count": null, "id": "a44f6e7a", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.042574Z", - "iopub.status.busy": "2023-07-24T15:01:00.042259Z", - "iopub.status.idle": "2023-07-24T15:01:00.045691Z", - "shell.execute_reply": "2023-07-24T15:01:00.044933Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "# Rename all features.\n", - "renamed_node = node.rename(\n", - " {\"feature_1\": \"renamed_1\", \"feature_2\": \"renamed_2\"}\n", - ")\n", - "print(renamed_node.features)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "af6103fc", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.048841Z", - "iopub.status.busy": "2023-07-24T15:01:00.048430Z", - "iopub.status.idle": "2023-07-24T15:01:00.051757Z", - "shell.execute_reply": "2023-07-24T15:01:00.051319Z" - } - }, - "outputs": [], - "source": [ - "# Prefix a single feature.\n", - "prefixed_f1 = node[\"feature_1\"].prefix(\"prefixed.\")\n", - "print(prefixed_f1.features)" + "evset.rename({\"feature_1\": \"renamed_1\", \"feature_2\": \"renamed_2\"})" ] }, { "cell_type": "code", "execution_count": null, "id": "3126cbed", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.053697Z", - "iopub.status.busy": "2023-07-24T15:01:00.053582Z", - "iopub.status.idle": "2023-07-24T15:01:00.056089Z", - "shell.execute_reply": "2023-07-24T15:01:00.055703Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "# Prefix all features.\n", - "prefixed_node = node.prefix(\"prefixed.\")\n", - "print(prefixed_node.features)" + "evset.prefix(\"prefixed.\")" ] }, { @@ -655,18 +572,11 @@ "cell_type": "code", "execution_count": null, "id": "852abbdd", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.058375Z", - "iopub.status.busy": "2023-07-24T15:01:00.058188Z", - "iopub.status.idle": "2023-07-24T15:01:00.061323Z", - "shell.execute_reply": "2023-07-24T15:01:00.060844Z" - } - }, + "metadata": {}, "outputs": [], "source": [ - "sma_7_node = node.simple_moving_average(tp.duration.days(7)).prefix(\"sma_7.\")\n", - "sma_14_node = node.simple_moving_average(tp.duration.days(14)).prefix(\"sma_14.\")" + "sma_7_node = evset.simple_moving_average(tp.duration.days(7)).prefix(\"sma_7.\")\n", + "sma_14_node = evset.simple_moving_average(tp.duration.days(14)).prefix(\"sma_14.\")" ] }, { @@ -679,26 +589,19 @@ }, "source": [ "\n", - "The `tp.glue()` operator can be used to concatenate different features into a single `EventSetNode`, but it will fail if two features with the same name are provided. The following pattern is commonly used in Temporian programs." + "The `tp.glue()` operator can be used to concatenate different features into a single `EventSet`, but it will fail if two features with the same name are provided. The following pattern is commonly used in Temporian programs to avoid errors:" ] }, { "cell_type": "code", "execution_count": null, "id": "f7d85e33", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.063510Z", - "iopub.status.busy": "2023-07-24T15:01:00.063393Z", - "iopub.status.idle": "2023-07-24T15:01:00.067035Z", - "shell.execute_reply": "2023-07-24T15:01:00.066516Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "result = tp.glue(\n", - " node.simple_moving_average(tp.duration.days(7)).prefix(\"sma_7.\"),\n", - " node.simple_moving_average(tp.duration.days(14)).prefix(\"sma_14.\"),\n", + " evset.simple_moving_average(tp.duration.days(7)).prefix(\"sma_7.\"),\n", + " evset.simple_moving_average(tp.duration.days(14)).prefix(\"sma_14.\"),\n", ")" ] }, @@ -714,25 +617,23 @@ "\n", "## Casting\n", "\n", - "Temporian is strict on feature data types (also called dtype). This means that often, you cannot perform operations between features of different types. For example, you cannot subtract a `tp.float32` and a `tp.float64`. Instead, you must manually cast the features to the same type before performing the operation." + "Temporian is strict on feature data types (also called dtype). This means that often, you cannot perform operations between features of different types. For example, you cannot subtract a `tp.float64` and a `tp.int64`. Instead, you must manually cast the features to the same type before performing the operation." ] }, { "cell_type": "code", "execution_count": null, "id": "e1276be1", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.069531Z", - "iopub.status.busy": "2023-07-24T15:01:00.069387Z", - "iopub.status.idle": "2023-07-24T15:01:00.072411Z", - "shell.execute_reply": "2023-07-24T15:01:00.071968Z" - } - }, + "metadata": {}, "outputs": [], "source": [ - "node = tp.input_node(features=[(\"f1\", tp.float32), (\"f2\", tp.float64)])\n", - "added = node[\"f1\"].cast(tp.float64) + node[\"f2\"]" + "evset = tp.event_set(timestamps=[0, 1],\n", + " features={'f1': [0.5, 1.1],\n", + " 'f2': [1, 2]\n", + " }\n", + " )\n", + "# Can't add float64 and int64, explicit cast required:\n", + "result = evset['f1'] + evset['f2'].cast(float)" ] }, { @@ -743,53 +644,25 @@ "lines_to_next_cell": 0 }, "source": [ + "Using python's `float` above is equivalent to using `tp.float64`, like using `int` is equivalent to `tp.int64`.\n", "\n", "Casting is especially useful to reduce memory usage. For example, if a feature only contains values between 0 and 10000, using `tp.int32` instead of `tp.int64` will halve memory usage. These optimizations are critical when working with large datasets.\n", "\n", "Casting can also be a necessary step before calling operators that only accept certain input data types.\n", "\n", - "Note that in Python, the values `1.0` and `1` are respectively `float64` and `int64`.\n", - "\n", - "Temporian supports data type casting through the `EventSet.cast()` operator. Destination data types can be specified in three different ways:\n", + "When using `EventSet.cast()`, destination data types can be specified in three different ways:\n", "\n", - "1. Single data type: converts all input features to the same destination data type.\n", - "\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3e3ee4c4", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.074589Z", - "iopub.status.busy": "2023-07-24T15:01:00.074466Z", - "iopub.status.idle": "2023-07-24T15:01:00.077932Z", - "shell.execute_reply": "2023-07-24T15:01:00.077413Z" - }, - "lines_to_next_cell": 0 - }, - "outputs": [], - "source": [ - "node.features" + "1. Single data type: converts all input features to the same destination data type.\n" ] }, { "cell_type": "code", "execution_count": null, "id": "6c2444ba", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.080190Z", - "iopub.status.busy": "2023-07-24T15:01:00.079991Z", - "iopub.status.idle": "2023-07-24T15:01:00.082867Z", - "shell.execute_reply": "2023-07-24T15:01:00.082457Z" - } - }, + "metadata": {}, "outputs": [], "source": [ - "print(node.cast(tp.str_).features)" + "numbers_to_str = evset.cast(str)" ] }, { @@ -809,17 +682,10 @@ "cell_type": "code", "execution_count": null, "id": "05ee00a7", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.085010Z", - "iopub.status.busy": "2023-07-24T15:01:00.084841Z", - "iopub.status.idle": "2023-07-24T15:01:00.087364Z", - "shell.execute_reply": "2023-07-24T15:01:00.087026Z" - } - }, + "metadata": {}, "outputs": [], "source": [ - "print(node.cast({\"f1\": tp.str_, \"f2\": tp.int64}).features)" + "evset.cast({\"f1\": str, \"f2\": tp.int32})" ] }, { @@ -839,17 +705,10 @@ "cell_type": "code", "execution_count": null, "id": "6deaff88", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.089508Z", - "iopub.status.busy": "2023-07-24T15:01:00.089353Z", - "iopub.status.idle": "2023-07-24T15:01:00.091835Z", - "shell.execute_reply": "2023-07-24T15:01:00.091498Z" - } - }, + "metadata": {}, "outputs": [], "source": [ - "print(node.cast({tp.float32: tp.str_, tp.float64: tp.int64}).features)" + "half_precision = evset.cast({float: tp.float32, int: tp.int32})" ] }, { @@ -878,12 +737,6 @@ "execution_count": null, "id": "2c673b17", "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.094177Z", - "iopub.status.busy": "2023-07-24T15:01:00.094010Z", - "iopub.status.idle": "2023-07-24T15:01:00.098574Z", - "shell.execute_reply": "2023-07-24T15:01:00.098140Z" - }, "lines_to_next_cell": 0 }, "outputs": [], @@ -897,12 +750,7 @@ " \"f4\": [1000.0, 1000.0],\n", " },\n", ")\n", - "node = evset.node()\n", - "\n", - "node_added = node[[\"f1\", \"f2\"]] + node[[\"f3\", \"f4\"]]\n", - "\n", - "evset_added = node_added.run(evset)\n", - "print(evset_added)" + "evset[[\"f1\", \"f2\"]] + evset[[\"f3\", \"f4\"]]" ] }, { @@ -914,7 +762,7 @@ "lines_to_next_cell": 0 }, "source": [ - "Note that features of type `int64` and `float64` are not mixed above, because otherwise the operation would fail without an explicit type cast." + "Note that we're adding both `int64` and both `float64` features, otherwise the operation would fail without an explicit cast (see the previous casting section)." ] }, { @@ -927,7 +775,7 @@ }, "source": [ "```python\n", - ">>> node[\"f1\"] + node[\"f2\"] # Attempt to mix dtypes.\n", + ">>> evset[\"f1\"] + evset[\"f2\"] # Attempt to mix dtypes int and float.\n", "Traceback (most recent call last):\n", " ...\n", "ValueError: corresponding features should have the same dtype. ...\n", @@ -943,27 +791,7 @@ "lines_to_next_cell": 0 }, "source": [ - "Refer to the [Casting](#casting) section for more on this.\n", - "\n", - "All the operators have an equivalent functional form. The example above using `+`, could be rewritten with `tp.add()`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "3b350c4a", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.101025Z", - "iopub.status.busy": "2023-07-24T15:01:00.100848Z", - "iopub.status.idle": "2023-07-24T15:01:00.103444Z", - "shell.execute_reply": "2023-07-24T15:01:00.103080Z" - } - }, - "outputs": [], - "source": [ - "# Equivalent.\n", - "node_added = tp.add(node[[\"f1\", \"f2\"]], node[[\"f3\", \"f4\"]])" + "Refer to the [Casting](#casting) section to learn how to cast features and solve this issue." ] }, { @@ -975,25 +803,20 @@ "lines_to_next_cell": 0 }, "source": [ - "Other usual comparison and logic operators also work (except `==`, see below)." + "### Comparisons\n", + "\n", + "The usual comparison and logic operators perform element-wise comparison (except `==`, see below)." ] }, { "cell_type": "code", "execution_count": null, "id": "f1462eea", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.105489Z", - "iopub.status.busy": "2023-07-24T15:01:00.105344Z", - "iopub.status.idle": "2023-07-24T15:01:00.108344Z", - "shell.execute_reply": "2023-07-24T15:01:00.107952Z" - } - }, + "metadata": {}, "outputs": [], "source": [ - "is_greater = node[[\"f1\", \"f2\"]] > node[[\"f3\", \"f4\"]]\n", - "is_less_or_equal = node[[\"f1\", \"f2\"]] <= node[[\"f3\", \"f4\"]]\n", + "is_greater = evset[[\"f1\", \"f2\"]] > evset[[\"f3\", \"f4\"]]\n", + "is_less_or_equal = evset[[\"f1\", \"f2\"]] <= evset[[\"f3\", \"f4\"]]\n", "is_wrong = is_greater & is_less_or_equal" ] }, @@ -1006,43 +829,39 @@ "lines_to_next_cell": 0 }, "source": [ + "The results are `EventSets` with boolean features, which can be used with other operators such as `filter()` or `where()`.\n", + "\n", "**Warning:** The Python equality operator (`==`) does not compute element-wise equality between features. Use the `evset.equal()` operator instead." ] }, { "cell_type": "code", "execution_count": null, - "id": "c610a0d0", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.110338Z", - "iopub.status.busy": "2023-07-24T15:01:00.110212Z", - "iopub.status.idle": "2023-07-24T15:01:00.113649Z", - "shell.execute_reply": "2023-07-24T15:01:00.113316Z" - } - }, + "id": "c67262d9-0a72-41ed-b020-12d95c5d2879", + "metadata": {}, "outputs": [], "source": [ - "# Works element-wise as expected\n", - "node[\"f1\"].equal(node[\"f3\"])" + "# This is NOT event-wise comparison, just a python boolean\n", + "evset[\"f1\"] == evset[\"f2\"]" + ] + }, + { + "cell_type": "markdown", + "id": "d65cbeb6-8de3-4824-8bca-815d88055a45", + "metadata": {}, + "source": [ + "For this particular comparison to work event-wise, use the `EventSet.equal()` method instead:" ] }, { "cell_type": "code", "execution_count": null, - "id": "abda404b", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.115541Z", - "iopub.status.busy": "2023-07-24T15:01:00.115402Z", - "iopub.status.idle": "2023-07-24T15:01:00.118082Z", - "shell.execute_reply": "2023-07-24T15:01:00.117723Z" - } - }, + "id": "c610a0d0", + "metadata": {}, "outputs": [], "source": [ - "# This is just a boolean\n", - "(node[\"f1\"] == node[\"f3\"])" + "# Works element-wise as expected\n", + "evset[\"f1\"].equal(evset[\"f3\"])" ] }, { @@ -1057,23 +876,6 @@ "All these operators act feature-wise, i.e. they perform index-feature-wise operations (for each feature in each index key). This implies that the input `EventSets` must have the same number of features." ] }, - { - "attachments": {}, - "cell_type": "markdown", - "id": "0352b9de", - "metadata": { - "cell_marker": "\"\"\"", - "lines_to_next_cell": 0 - }, - "source": [ - "```python\n", - "node[[\"f1\", \"f2\"]] + node[\"f3\"]\n", - "Traceback (most recent call last):\n", - " ...\n", - "ValueError: The left and right arguments should have the same number of features. ...\n", - "```" - ] - }, { "attachments": {}, "cell_type": "markdown", @@ -1084,7 +886,7 @@ }, "source": [ "\n", - "The input `EventSets` must also have the same sampling and index." + "The input `EventSets` must also have the same sampling and index. Otherwise, Temporian raises an error:" ] }, { @@ -1097,19 +899,38 @@ }, "source": [ "```python\n", - "sampling_1 = tp.event_set(\n", - " timestamps=[0, 1],\n", - " features={\"f1\": [1, 2]},\n", - ")\n", - "sampling_2 = tp.event_set(\n", - " timestamps=[1, 2],\n", - " features={\"f1\": [3, 4]},\n", - ")\n", - "sampling_1.node() + sampling_2.node()\n", + ">>> sampling_1 = tp.event_set(\n", + "... timestamps=[0, 1],\n", + "... features={\"f1\": [1, 2]},\n", + "... )\n", + ">>> sampling_2 = tp.event_set(\n", + "... timestamps=[1, 2],\n", + "... features={\"f1\": [3, 4]},\n", + "... )\n", + ">>> sampling_1 + sampling_2\n", "Traceback (most recent call last):\n", " ...\n", "ValueError: Arguments should have the same sampling. ...\n", - "```" + "\n", + "```\n", + "\n", + "If you want to create two `EventSets` associated to the same sampling source (same timestamps and indexes), use the `same_sampling_as` argument:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "1415ede1-3fbc-43d7-94e6-dd5d5ec93bbb", + "metadata": {}, + "outputs": [], + "source": [ + "evset_2 = tp.event_set(\n", + " timestamps=[1, 10],\n", + " features={'f': [1, 2]},\n", + " same_sampling_as=evset\n", + ")\n", + "# Now evset and evset_2 have the same sampling source\n", + "result = evset['f1'] + evset_2['f']" ] }, { @@ -1135,18 +956,11 @@ "execution_count": null, "id": "58fe7d8e", "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.120397Z", - "iopub.status.busy": "2023-07-24T15:01:00.120245Z", - "iopub.status.idle": "2023-07-24T15:01:00.123150Z", - "shell.execute_reply": "2023-07-24T15:01:00.122799Z" - }, "lines_to_next_cell": 0 }, "outputs": [], "source": [ - "node_scalar = node * 10\n", - "print(node_scalar.run(evset))" + "evset * 10" ] }, { @@ -1160,21 +974,16 @@ "source": [ "## Sampling\n", "\n", - "Arithmetic operators, such as `tp.add()`, require their input arguments to have the same timestamps and [Index](#indexes-horizontal-and-vertical-operators). The unique combination of timestamps and indexes is called a _sampling_.\n", - "\n", - "\n", - "\n", - "For example, if `EventSetNodes` `a` and `b` have different samplings, `a[\"feature_1\"] + b[\"feature_2\"]` will fail.\n", + "Arithmetic operators, require their input arguments to have the same timestamps and [Index](#indexes-horizontal-and-vertical-operators), as seen in the previous section. The unique combination of timestamps and indexes is called a _sampling_.\n", "\n", "To use arithmetic operators on `EventSets` with different samplings, one of the `EventSets` needs to be resampled to the sampling of the other `EventSet`. Resampling is done with the `EventSet.resample()` operator.\n", "\n", - "The `EventSet.resample()` operator takes two `EventSets` called `input` and `sampling`, and returns the resampling of the features of `input` according to the timestamps of `sampling` according to the following rules:\n", + "The `EventSet.resample(new_sampling)` operator returns the resampling of the features of the calling `EventSet` with the timestamps of `new_sampling` according to the following rules:\n", "\n", - "If a timestamp is present in `input` but not in `sampling`, the timestamp is dropped.\n", - "If a timestamp is present in both `input` and `sampling`, the timestamp is kept.\n", - "If a timestamp is present in `sampling` but not in `input`, a new timestamp is created using the feature values from the _closest anterior_ (not the closest, as that could induce future leakage) timestamp of `input`. This rule is especially useful for events that represent measurements (see [Events and `EventSets`](#events-and-eventsets)).\n", + "1. For each timestamp in `new_sampling`, use the feature values from the _closest_ event in `EventSet` that is previous or has exactly equal timestamp (future events are ignored as that would induce future leakage). This rule is especially useful for events that represent measurements (see [Events and `EventSets`](#events-and-eventsets)).\n", + "2. If there's no previous event for some timestamps in `new_sampling`, fill with a missing value, which depends on the feature type (`NaN` will be used for `float` features, `0` for `int` features, and `''` for `str` features).\n", "\n", - "**Note:** Features in `sampling` are ignored. This also happens in some other operators that take a `sampling` argument of type `EventSetNode` - it indicates that only the sampling (a.k.a. the indexes and timestamps) of that `EventSetNode` are being used by that operator.\n", + "**Note:** Features in `sampling` are ignored. This also happens in some other operators that take a `sampling` argument of type `EventSet`.\n", "\n", "Given this example:" ] @@ -1184,12 +993,6 @@ "execution_count": null, "id": "087b6fd6", "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.125315Z", - "iopub.status.busy": "2023-07-24T15:01:00.125163Z", - "iopub.status.idle": "2023-07-24T15:01:00.129661Z", - "shell.execute_reply": "2023-07-24T15:01:00.129338Z" - }, "lines_to_next_cell": 0 }, "outputs": [], @@ -1200,13 +1003,10 @@ " \"x\": [1.0, 2.0, 3.0],\n", " },\n", ")\n", - "node = evset.node()\n", "sampling_evset = tp.event_set(\n", " timestamps=[0, 9, 10, 11, 19, 20, 21],\n", ")\n", - "sampling_node = sampling_evset.node()\n", - "resampled = node.resample(sampling=sampling_node)\n", - "resampled.run({node: evset, sampling_node: sampling_evset})" + "resampled = evset.resample(sampling=sampling_evset)" ] }, { @@ -1219,20 +1019,14 @@ }, "source": [ "\n", - "The following would be the matching between the timestamps of `sampling` and `input`:\n", + "The following would be the matching between the timestamps of `sampling_evset` and `evset`:\n", "\n", "| `sampling` timestamp | 0 | 9 | 10 | 11 | 19 | 20 | 21 |\n", "| ---------------------------- | --- | --- | --- | --- | --- | --- | --- |\n", - "| matching `input` timestamp | - | - | 10 | 10 | 10 | 20 | 20 |\n", - "| matching `\"x\"` feature value | NaN | NaN | 1 | 1 | 1 | 2 | 2 |\n", - "\n", - "If `sampling` contains a timestamp anterior to any timestamp in the `input` (like 0 and 9 in the example above), the feature of the sampled event will be missing. The representation of a missing value depends on its dtype:\n", + "| previous `evset` timestamp | - | - | 10 | 10 | 10 | 20 | 20 |\n", + "| value for `\"x\"` | NaN | NaN | 1 | 1 | 1 | 2 | 2 |\n", "\n", - "float: `NaN`\n", - "integer: `0`\n", - "string: `\"\"`\n", - "\n", - "Back to the example of the `tp.add()` operator, `a` and `b` with different sampling can be added as follows:" + "Back to the example of the arithmetics operators, `a` and `b` with different sampling can be added as follows:" ] }, { @@ -1240,28 +1034,19 @@ "execution_count": null, "id": "df3bbc7d", "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.131774Z", - "iopub.status.busy": "2023-07-24T15:01:00.131623Z", - "iopub.status.idle": "2023-07-24T15:01:00.136202Z", - "shell.execute_reply": "2023-07-24T15:01:00.135874Z" - }, "lines_to_next_cell": 0 }, "outputs": [], "source": [ - "sampling_a = tp.event_set(\n", + "a = tp.event_set(\n", " timestamps=[0, 1, 2],\n", " features={\"f1\": [10, 20, 30]},\n", ")\n", - "sampling_b = tp.event_set(\n", + "b = tp.event_set(\n", " timestamps=[1, 2, 3],\n", " features={\"f1\": [5, 4, 3]},\n", ")\n", - "a = sampling_a.node()\n", - "b = sampling_b.node()\n", - "result = a + b.resample(a)\n", - "result.run({a: sampling_a, b: sampling_b})" + "result = a + b.resample(a)" ] }, { @@ -1302,18 +1087,18 @@ "r = termometer[\"temperature\"].resample(sampling_source) / manometer[\"pressure\"].resample(sampling_source)\n", "```\n", "\n", - "Moving window operators, such as the `EventSet.simple_moving_average()` or `EventSet.moving_count()` operators, have an optional `sampling` argument. For example, the signature of the simple moving average operator is `EventSet.simple_moving_average(window_length: Duration, sampling: Optional[EventSet] = None)`. If `sampling` is not set, the result will maintain the sampling of the `input` argument. If `sampling` is set, the moving window will be sampled at each timestamp of `sampling` instead, and the result will have those new ones.\n", + "Moving window operators, such as the `EventSet.simple_moving_average()` or `EventSet.moving_count()` operators, have an optional `sampling` argument. For example, the signature of the simple moving average operator is `EventSet.simple_moving_average(window_length: Duration, sampling: Optional[EventSet] = None)`. If `sampling` is not set, the result will maintain the sampling of the original `EventSet`. If `sampling` is set, the moving window will be sampled at each timestamp of `sampling` instead, and the result will have those new ones.\n", "\n", "```python\n", - "b = tp.simple_moving_average(input=a, window_length=10)\n", - "c = tp.simple_moving_average(input=a, window_length=10, sampling=d)\n", + "a.simple_moving_average(window_length=10)\n", + "a.simple_moving_average(window_length=10, sampling=d)\n", "```\n", "\n", "Note that if planning to resample the result of a moving window operator, passing the `sampling` argument is both more efficient and more accurate than calling `.resample()` on the result.\n", "\n", "## Indexes, horizontal and vertical operators\n", "\n", - "All operators presented so far work on a sequence of related events. For instance, the simple moving average operator computes the average of events within a specific time window. These types of operators are called _horizontal operators_.\n", + "All operators presented so far work on a sequence of related events. For instance, the simple moving average operator computes the average of events within a specific time window. These types of operators are called _horizontal operators_ (which makes sense if we think of events as advancing in time from left to right).\n", "\n", "It is sometimes desirable for events in an `EventSet` not to interact with each other. For example, assume a dataset containing the sum of daily sales of a set of products. The objective is to compute the sum of weekly sales of each product independently. In this scenario, the weekly moving sum should be applied individually to each product. If not, you would compute the weekly sales of all the products together.\n", "\n", @@ -1325,12 +1110,6 @@ "execution_count": null, "id": "54a71cae", "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.138254Z", - "iopub.status.busy": "2023-07-24T15:01:00.138101Z", - "iopub.status.idle": "2023-07-24T15:01:00.141435Z", - "shell.execute_reply": "2023-07-24T15:01:00.141074Z" - }, "lines_to_next_cell": 0 }, "outputs": [], @@ -1343,7 +1122,7 @@ " },\n", " indexes=[\"product\"]\n", ")\n", - "print(daily_sales)" + "daily_sales.plot()" ] }, { @@ -1364,22 +1143,12 @@ "execution_count": null, "id": "2c87a680", "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.143537Z", - "iopub.status.busy": "2023-07-24T15:01:00.143412Z", - "iopub.status.idle": "2023-07-24T15:01:00.147227Z", - "shell.execute_reply": "2023-07-24T15:01:00.146886Z" - }, "lines_to_next_cell": 2 }, "outputs": [], "source": [ - "a = daily_sales.node()\n", - "\n", "# Compute the moving sum of each index group (a.k.a. each product) individually.\n", - "b = a.moving_sum(window_length=tp.duration.weeks(1))\n", - "\n", - "b.run({a: daily_sales})" + "b = a.moving_sum(window_length=tp.duration.weeks(1))" ] }, { @@ -1394,7 +1163,7 @@ "\n", "Horizontal operators can be understood as operators that are applied independently on each index.\n", "\n", - "Operators that modify an `EventSetNode`'s indexes are called _vertical operators_. The most important vertical operators are:\n", + "Operators that modify an `EventSet`'s indexes are called _vertical operators_ (note that they affect the vertical layout of the plots above). The most important vertical operators are:\n", "\n", "- `EventSet.add_index()`: Add features to the index.\n", "- `EventSet.drop_index()`: Remove features from the index, optionally keeping them as features.\n", @@ -1412,14 +1181,7 @@ "cell_type": "code", "execution_count": null, "id": "8badbebf", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.149178Z", - "iopub.status.busy": "2023-07-24T15:01:00.149039Z", - "iopub.status.idle": "2023-07-24T15:01:00.152148Z", - "shell.execute_reply": "2023-07-24T15:01:00.151798Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "daily_sales = tp.event_set(\n", @@ -1429,8 +1191,7 @@ " \"product\": [1, 2, 1, 2],\n", " \"sale\": [100.0, 200.0, 110.0, 300.0],\n", " },\n", - ")\n", - "print(daily_sales)" + ")" ] }, { @@ -1452,19 +1213,12 @@ "execution_count": null, "id": "479096c3", "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.154125Z", - "iopub.status.busy": "2023-07-24T15:01:00.154007Z", - "iopub.status.idle": "2023-07-24T15:01:00.157566Z", - "shell.execute_reply": "2023-07-24T15:01:00.157243Z" - }, "lines_to_next_cell": 2 }, "outputs": [], "source": [ - "a = daily_sales.node()\n", - "b = a.add_index([\"product\", \"store\"])\n", - "b.run({a: daily_sales})" + "sales_per_product_store = daily_sales.add_index([\"product\", \"store\"])\n", + "sales_per_product_store" ] }, { @@ -1486,19 +1240,12 @@ "execution_count": null, "id": "4df0d8cf", "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.159586Z", - "iopub.status.busy": "2023-07-24T15:01:00.159442Z", - "iopub.status.idle": "2023-07-24T15:01:00.163136Z", - "shell.execute_reply": "2023-07-24T15:01:00.162800Z" - }, "lines_to_next_cell": 0 }, "outputs": [], "source": [ "# Weekly sales by product and store\n", - "c = b[\"sale\"].moving_sum(window_length=tp.duration.weeks(1))\n", - "c.run({a: daily_sales})" + "per_product_weekly = sales_per_product_store.moving_sum(window_length=tp.duration.weeks(1))" ] }, { @@ -1519,20 +1266,12 @@ "execution_count": null, "id": "8d9448a2", "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.165204Z", - "iopub.status.busy": "2023-07-24T15:01:00.165078Z", - "iopub.status.idle": "2023-07-24T15:01:00.170459Z", - "shell.execute_reply": "2023-07-24T15:01:00.169929Z" - }, "lines_to_next_cell": 0 }, "outputs": [], "source": [ "# Weekly sales by store (including all products)\n", - "d = b.drop_index(\"product\")\n", - "e = d[\"sale\"].moving_sum(window_length=tp.duration.weeks(1))\n", - "e.run({a: daily_sales})" + "per_store_weekly = per_week.drop_index(\"product\", keep=False).moving_sum(tp.duration.weeks(1))" ] }, { @@ -1555,22 +1294,12 @@ "execution_count": null, "id": "4e12a9e0", "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.172674Z", - "iopub.status.busy": "2023-07-24T15:01:00.172528Z", - "iopub.status.idle": "2023-07-24T15:01:00.177142Z", - "shell.execute_reply": "2023-07-24T15:01:00.176616Z" - }, "lines_to_next_cell": 0 }, "outputs": [], "source": [ - "# Copy the content of e (indexed by (store)) into each (store, product).\n", - "f = c / e.propagate(sampling=c, resample=True)\n", - "\n", - "# Equivalent.\n", - "f = c / e.propagate(sampling=c).resample(sampling=c)\n", - "print(f.run({a: daily_sales}))" + "# Copy the content of per_store_weekly (indexed by (store)) into each (store, product).\n", + "f = per_product_weekly / per_store_weekly.propagate(sampling=per_product_weekly, resample=True)" ] }, { @@ -1583,7 +1312,7 @@ }, "source": [ "\n", - "The `EventSet.propagate()` operator expands the indexes of its `input` (`e` in this case) to match the indexes of its `sampling` by copying the content of `input` into each corresponding index group of `sampling`. Note that `sampling`'s indexes must be a superset of `input`'s indexes.\n", + "The `EventSet.propagate()` operator expands the indexes of its input to match the indexes of its `sampling` by copying the contents of the former into each corresponding index group of `sampling`. Note that `sampling`'s indexes must be a superset of `input`'s indexes.\n", "\n", "## Future leakage\n", "\n", @@ -1600,19 +1329,12 @@ "cell_type": "code", "execution_count": null, "id": "c07453fa", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.179407Z", - "iopub.status.busy": "2023-07-24T15:01:00.179261Z", - "iopub.status.idle": "2023-07-24T15:01:00.182867Z", - "shell.execute_reply": "2023-07-24T15:01:00.182049Z" - } - }, + "metadata": {}, "outputs": [], "source": [ - "a = tp.input_node(features=[(\"feature_1\", tp.float32)])\n", - "b = a.moving_count(1)\n", - "c = b.leak(1).moving_count(2)" + "a = tp.event_set(timestamps=[10, 20])\n", + "b = a.leak(1)\n", + "b" ] }, { @@ -1620,43 +1342,29 @@ "id": "d2e37ee5", "metadata": {}, "source": [ - "In this example, `b` does not have a future leak, but `c` does because it depends on `EventSet.leak()`.\n", + "In this example, `b` has a future leakage because it depends on `EventSet.leak()`.\n", "\n", - "To check programmatically if an `EventSetNode` depends on `leak()`, we can use the `tp.has_leak()` function." + "To check programmatically if an `EventSet` depends on `leak()`, we can use the `tp.has_leak()` function." ] }, { "cell_type": "code", "execution_count": null, "id": "ab15c133", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.185286Z", - "iopub.status.busy": "2023-07-24T15:01:00.185178Z", - "iopub.status.idle": "2023-07-24T15:01:00.187923Z", - "shell.execute_reply": "2023-07-24T15:01:00.187503Z" - } - }, + "metadata": {}, "outputs": [], "source": [ - "print(tp.has_leak(b))" + "print(tp.has_leak(a.node()))" ] }, { "cell_type": "code", "execution_count": null, "id": "cd455fc1", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.190006Z", - "iopub.status.busy": "2023-07-24T15:01:00.189857Z", - "iopub.status.idle": "2023-07-24T15:01:00.192310Z", - "shell.execute_reply": "2023-07-24T15:01:00.191954Z" - } - }, + "metadata": {}, "outputs": [], "source": [ - "print(tp.has_leak(c))" + "print(tp.has_leak(b.node()))" ] }, { @@ -1768,14 +1476,7 @@ "cell_type": "code", "execution_count": null, "id": "da239494", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.200932Z", - "iopub.status.busy": "2023-07-24T15:01:00.200760Z", - "iopub.status.idle": "2023-07-24T15:01:00.212641Z", - "shell.execute_reply": "2023-07-24T15:01:00.212298Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame({\n", @@ -1795,39 +1496,30 @@ "attachments": {}, "cell_type": "markdown", "id": "64cb7ff2-945d-461d-ba4b-b5ac1e127f85", - "metadata": { - "jp-MarkdownHeadingCollapsed": true - }, + "metadata": {}, "source": [ "## Eager mode vs Graph mode\n", "\n", - "Temporian has two execution modes: **eager** and **graph**. In eager mode, operators are applied immediately. This mode is useful for learning Temporian, for iterative and interactive development, and for lightweight/small data use cases where performance isn't a priority.\n", + "Temporian has two execution modes: **eager** and **graph**. In eager mode (default), operators are applied immediately. This mode is useful for learning Temporian, for iterative and interactive development, and for lightweight/small data use cases where performance isn't a priority.\n", "\n", "In graph mode, operators are combined together into \"Temporian programs\" before being executed. Graph mode is more efficient and it consumes less memory. Temporian programs can be saved, inspected, and distributed by users.\n", "\n", "Migrating a Temporian program from eager to graph mode is easy and requires little work. Most of the time, adding a `@tp.compile` annotation is enough. Therefore, it is recommended to develop programs in eager mode and then to productize them in graph mode.\n", "\n", - "Next, we see a the same program written three times: First, in eager mode, then in graph mode using `@tp.compile`, and finally in graph mode without `@tp.compile`." + "Below, we see the same program written three times: First, in eager mode, then in graph mode using `@tp.compile`, and finally in graph mode without `@tp.compile`." ] }, { "cell_type": "code", "execution_count": null, "id": "d5405837-c801-40e9-8b41-4d4dc901d429", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:00:57.315244Z", - "iopub.status.busy": "2023-07-24T15:00:57.315083Z", - "iopub.status.idle": "2023-07-24T15:00:57.417894Z", - "shell.execute_reply": "2023-07-24T15:00:57.417481Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "# Eager mode\n", "#\n", "# Note: This Temporian program contains three operators: two \"simple_moving_average\" and one \"tp.substract\" operators.\n", - "result = evset.simple_moving_average(window_length=0.5) - evset.simple_moving_average(window_length=1.0)\n", + "result = evset['f1'].simple_moving_average(window_length=2) - evset['f1'].simple_moving_average(window_length=4)\n", "result.plot()" ] }, @@ -1835,21 +1527,17 @@ "cell_type": "code", "execution_count": null, "id": "9c854408-0804-4435-8d44-f521ef1b379e", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:00:57.420139Z", - "iopub.status.busy": "2023-07-24T15:00:57.419972Z", - "iopub.status.idle": "2023-07-24T15:00:57.522730Z", - "shell.execute_reply": "2023-07-24T15:00:57.522286Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "# Graph mode with @tp.compile\n", "\n", "@tp.compile\n", "def my_function(x):\n", - " return x.simple_moving_average(window_length=0.5) - x.simple_moving_average(window_length=1.0)\n", + " f1 = x['f1']\n", + " sma_2 = f1.simple_moving_average(window_length=2)\n", + " sma_4 = f1.simple_moving_average(window_length=4)\n", + " return sma_2 - sma_4\n", "\n", "result = my_function(evset)\n", " \n", @@ -1860,22 +1548,21 @@ "cell_type": "code", "execution_count": null, "id": "e4aa008f-aa8e-486f-a96c-854fb5b2bd83", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:00:57.525125Z", - "iopub.status.busy": "2023-07-24T15:00:57.524948Z", - "iopub.status.idle": "2023-07-24T15:00:57.629039Z", - "shell.execute_reply": "2023-07-24T15:00:57.628643Z" - } - }, + "metadata": {}, "outputs": [], "source": [ - "# Graph model without @tp.compile\n", + "# Graph mode without @tp.compile\n", "\n", - "input_node = tp.input_node([(\"value\", tp.float64)])\n", - "# Or input_node = tp.input_node(evset.schema.features)\n", + "# Input can be specified before having the actual data\n", + "# input_node = tp.input_node([(\"f1\", tp.float64), (\"f2\", tp.str_)])\n", + "\n", + "# Since we already have the evset, create a proper node for it\n", + "input_node = evset.node()\n", "\n", - "result_node = input_node.simple_moving_average(window_length=0.5) - input_node.simple_moving_average(window_length=1.0)\n", + "f1_node = input_node['f1']\n", + "sma_2_node = f1_node.simple_moving_average(window_length=2)\n", + "sma_4_node = f1_node.simple_moving_average(window_length=4)\n", + "result_node = sma_2_node - sma_4_node\n", "result = tp.run(result_node, {input_node: evset}, verbose=1)\n", " \n", "result.plot()" From fdc78d67b93abf656628f928a4c741c95eb058bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Braulio=20R=C3=ADos?= Date: Thu, 26 Oct 2023 18:42:31 -0300 Subject: [PATCH 3/9] Remove 3_minutes, merged into getting_started --- .github/workflows/test_notebooks.yaml | 2 +- README.md | 6 +- docs/mkdocs.yml | 2 +- docs/src/3_minutes.md | 69 ----- .../src/{tutorials => }/getting_started.ipynb | 260 ++++++++++++++++-- docs/src/tutorials/index.md | 3 +- docs/src/tutorials/temporian_with_beam.ipynb | 2 +- 7 files changed, 242 insertions(+), 102 deletions(-) delete mode 100644 docs/src/3_minutes.md rename docs/src/{tutorials => }/getting_started.ipynb (57%) diff --git a/.github/workflows/test_notebooks.yaml b/.github/workflows/test_notebooks.yaml index a22ca7efd..449d1c8fd 100644 --- a/.github/workflows/test_notebooks.yaml +++ b/.github/workflows/test_notebooks.yaml @@ -11,11 +11,11 @@ jobs: # * can be used and all .ipynb files in that dir will be tested sequentially path: - user_guide + - getting_started - recipes/* - tutorials/anomaly_detection_supervised - tutorials/anomaly_detection_unsupervised - tutorials/bank_fraud_detection_with_tfdf - - tutorials/getting_started - tutorials/heart_rate_analysis - tutorials/loan_outcomes_prediction - tutorials/m5_competition diff --git a/README.md b/README.md index a81795be4..8e5b86d57 100644 --- a/README.md +++ b/README.md @@ -91,17 +91,17 @@ Check the [Getting Started tutorial](https://temporian.readthedocs.io/en/stable/ ## Next steps -New users should refer to the [3 minutes to Temporian](https://temporian.readthedocs.io/en/stable/3_minutes/) page, which provides a +New users should refer to the [Getting Started](https://temporian.readthedocs.io/en/stable/getting_started/) guide, which provides a quick overview of the key concepts and operations of Temporian. -After reading the 3 minute guide, visit the [User Guide](https://temporian.readthedocs.io/en/stable/user_guide/) for a deep dive into +After that, visit the [User Guide](https://temporian.readthedocs.io/en/stable/user_guide/) for a deep dive into the major concepts, operators, conventions, and practices of Temporian. For a hands-on learning experience, work through the [Tutorials](https://temporian.readthedocs.io/en/stable/tutorials/) or refer to the [API reference](https://temporian.readthedocs.io/en/stable/reference/). ## Documentation -The documentation 📚 is available at [temporian.readthedocs.io](https://temporian.readthedocs.io/en/stable/). The [3 minutes to Temporian ⏰️](https://temporian.readthedocs.io/en/stable/3_minutes/) is the best way to start. +The documentation 📚 is available at [temporian.readthedocs.io](https://temporian.readthedocs.io/en/stable/). The [Getting Started guide](https://temporian.readthedocs.io/en/stable/getting_started/) is the best way to start. ## Contributing diff --git a/docs/mkdocs.yml b/docs/mkdocs.yml index 4b367aa99..465485c58 100644 --- a/docs/mkdocs.yml +++ b/docs/mkdocs.yml @@ -53,7 +53,7 @@ extra_css: # Navigation bar nav: - Home: index.md - - 3 minutes to Temporian: 3_minutes.md + - Getting Started: getting_started.ipynb - User Guide: user_guide.ipynb - Recipes: recipes/ - Tutorials: tutorials/ diff --git a/docs/src/3_minutes.md b/docs/src/3_minutes.md deleted file mode 100644 index ad6ba7897..000000000 --- a/docs/src/3_minutes.md +++ /dev/null @@ -1,69 +0,0 @@ -# 3 minutes to Temporian - -This is a _very_ quick introduction to how Temporian works. For a complete tour of its capabilities, please refer to the [User Guide](../user_guide). - -## Events and EventSets - -The most basic unit of data in Temporian is an **event**. An event consists of a timestamp and a set of feature values. - -Events are not handled individually. Instead, events are grouped together into an **[`EventSet`][temporian.EventSet]**. - -[`EventSets`][temporian.EventSet] are the main data structure in Temporian, and represent **[multivariate and multi-index time sequences](../user_guide/#what-is-temporal-data)**. Let's break that down: - -- "multivariate" indicates that each event in the time sequence holds several feature values. -- "multi-index" indicates that the events can represent hierarchical data, and be therefore grouped by one or more of their features' values. -- "sequence" indicates that the events are not necessarily sampled at a uniform rate (in which case we would call it a time "series"). - -You can create an [`EventSet`][temporian.EventSet] from a pandas DataFrame, NumPy arrays, CSV files, and more. Here is an example of an [`EventSet`][temporian.EventSet] containing four events and three features: - -```python ->>> evset = tp.event_set( -... timestamps=["2023-02-04", "2023-02-06", "2023-02-07", "2023-02-07"], -... features={ -... "feature_1": [0.5, 0.6, np.nan, 0.9], -... "feature_2": ["red", "blue", "red", "blue"], -... "feature_3": [10.0, -1.0, 5.0, 5.0], -... }, -... indexes=["feature_2"], -... ) - -``` - -An [`EventSet`][temporian.EventSet] can hold one or several time sequences, depending on what its **[index](../user_guide/#index-horizontal-and-vertical-operators)** is. - -If the [`EventSet`][temporian.EventSet] has no index, it will hold a single multivariate time sequence, which means that all events will be considered part of the same group and will interact with each other when operators are applied to the [`EventSet`][temporian.EventSet]. - -If the [`EventSet`][temporian.EventSet] has one (or many) indexes, its events will be grouped by their indexes' values, so it will hold one multivariate time sequence for each unique value (or unique combination of values) of its indexes, and most operators applied to the [`EventSet`][temporian.EventSet] will be applied to each time sequence independently. - -## Operators - -Processing operations are performed by **operators**. For instance, the [`EventSet.simple_moving_average()`][temporian.EventSet.simple_moving_average] operator computes the [simple moving average](https://en.wikipedia.org/wiki/Moving_average) of each feature in an [`EventSet`][temporian.EventSet]. - -The list of all available operators is available in the [API Reference](../reference). - -```python ->>> # Compute the 2-day simple moving average of the EventSet defined above ->>> sma = evset.simple_moving_average(window_length=tp.duration.days(2)) - ->>> # Remove index to get a flat EventSet ->>> reindexed = sma.drop_index() - ->>> # Subtract feature_1 from feature_3 ->>> sub = reindexed["feature_3"] - reindexed["feature_1"] - ->>> # Plot the resulting EventSet ->>> sub.plot() - -``` - -## Graph mode - -Temporian works in **eager mode** out of the box, which means that when you call an operator on an [`EventSet`][temporian.EventSet] you get back the result of that operation immediately as a new [`EventSet`][temporian.EventSet]. - -Eager execution is easy to grasp, and fits most small data use cases. However, for big data, **graph mode** allows Temporian to perform optimizations on the computation graph that is defined when operators are applied on [`EventSets`][temporian.EventSet]. Graph mode also enables the serialization of Temporian programs, for later use in other platforms or distributed compute environments. - -To learn how graph mode works, check out **[Eager mode vs Graph mode](./user_guide.ipynb#eager-mode-vs-graph-mode)** in the User Guide. - -🥳 Congratulations! You're all set to write your first pieces of Temporian code. - -For a more in-depth look at Temporian's capabilities, please check out the [User Guide](../user_guide) or some of the use cases in the [Tutorials](../tutorials) section. diff --git a/docs/src/tutorials/getting_started.ipynb b/docs/src/getting_started.ipynb similarity index 57% rename from docs/src/tutorials/getting_started.ipynb rename to docs/src/getting_started.ipynb index f5bafb2a8..231af61d3 100644 --- a/docs/src/tutorials/getting_started.ipynb +++ b/docs/src/getting_started.ipynb @@ -8,7 +8,17 @@ "source": [ "# Getting Started with Temporian\n", "\n", - "[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/google/temporian/blob/last-release/docs/src/tutorials/getting_started.ipynb)" + "[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/google/temporian/blob/last-release/docs/src/tutorials/getting_started.ipynb)\n", + "\n", + "This guide will introduce you to the basics of Temporian, including:\n", + "- What is an **EventSet** and how to create one from scratch.\n", + "- Visualizing input/output data using **EventSet.plot()** and interactive plots.\n", + "- Converting back and forth between EventSets and pandas **DataFrames**.\n", + "- Transforming the EventSets by using **operators**.\n", + "- How operators work when using **indexes**.\n", + "- Commonly used operations like **glue**, **resample**, **lag**, moving windows and arithmetics.\n", + "\n", + "If you're interested in a topic that is not included here, we provide links to other parts of the documentation on the final section, to continue learning." ] }, { @@ -40,7 +50,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "c71dc843", "metadata": {}, "outputs": [], @@ -51,13 +61,221 @@ "import numpy as np" ] }, + { + "cell_type": "markdown", + "id": "5e9bf8e3-07fd-4e4d-bdb8-d32a48a366c7", + "metadata": {}, + "source": [ + "## Part 1: Events and EventSets\n", + "\n", + "The most basic unit of data in Temporian is an **event**. An event consists of a timestamp and a set of feature values.\n", + "\n", + "Events are not handled individually. Instead, events are grouped together into an **[`EventSet`][temporian.EventSet]**.\n", + "\n", + "[`EventSets`][temporian.EventSet] are the main data structure in Temporian, and represent **[multivariate and multi-index time sequences](../user_guide/#what-is-temporal-data)**. Let's break that down:\n", + "\n", + "- \"multivariate\" indicates that each event in the time sequence holds several feature values.\n", + "- \"multi-index\" indicates that the events can represent hierarchical data, and be therefore grouped by one or more of their features' values.\n", + "- \"sequence\" indicates that the events are not necessarily sampled at a uniform rate (in which case we would call it a time \"series\").\n", + "\n", + "You can create an [`EventSet`][temporian.EventSet] from a pandas DataFrame, NumPy arrays, CSV files, and more. Here is an example of an [`EventSet`][temporian.EventSet] containing four events and three features (one of which is used as an `index`):" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "46ebad7f-f4b4-4850-bc12-8552e55a3f6b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "
\n", + "
\n", + " \n", + " features\n", + " [2]:\n", + " \n", + " feature_1\n", + " (float64)\n", + " , \n", + " feature_3\n", + " (float64)\n", + "
\n", + "
\n", + " \n", + " indexes\n", + " [1]:\n", + " \n", + " feature_2\n", + " (str_)\n", + "
\n", + "
\n", + " events: \n", + " 4\n", + "
\n", + "
\n", + " index values: \n", + " 2\n", + "
\n", + "
\n", + " memory usage: \n", + " 1.1 kB\n", + "
\n", + "
\n", + "
\n", + " index\n", + " (\n", + " feature_2: \n", + " blue\n", + " ) with 2 events\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " timestamp\n", + " \n", + " \n", + " \n", + " feature_1\n", + " \n", + " \n", + " \n", + " feature_3\n", + " \n", + "
\n", + " 2023-02-06 00:00:00+00:00\n", + " \n", + " 0.6\n", + " \n", + " -1\n", + "
\n", + " 2023-02-07 00:00:00+00:00\n", + " \n", + " 0.9\n", + " \n", + " 5\n", + "
\n", + "
\n", + " index\n", + " (\n", + " feature_2: \n", + " red\n", + " ) with 2 events\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " timestamp\n", + " \n", + " \n", + " \n", + " feature_1\n", + " \n", + " \n", + " \n", + " feature_3\n", + " \n", + "
\n", + " 2023-02-04 00:00:00+00:00\n", + " \n", + " 0.5\n", + " \n", + " 10\n", + "
\n", + " 2023-02-07 00:00:00+00:00\n", + " \n", + " nan\n", + " \n", + " 5\n", + "
\n", + "
\n" + ], + "text/plain": [ + "indexes: [('feature_2', str_)]\n", + "features: [('feature_1', float64), ('feature_3', float64)]\n", + "events:\n", + " feature_2=b'blue' (2 events):\n", + " timestamps: ['2023-02-06T00:00:00' '2023-02-07T00:00:00']\n", + " 'feature_1': [0.6 0.9]\n", + " 'feature_3': [-1. 5.]\n", + " feature_2=b'red' (2 events):\n", + " timestamps: ['2023-02-04T00:00:00' '2023-02-07T00:00:00']\n", + " 'feature_1': [0.5 nan]\n", + " 'feature_3': [10. 5.]\n", + "memory usage: 1.1 kB" + ] + }, + "execution_count": 3, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "evset = tp.event_set(\n", + " timestamps=[\"2023-02-04\", \"2023-02-06\", \"2023-02-07\", \"2023-02-07\"],\n", + " features={\n", + " \"feature_1\": [0.5, 0.6, np.nan, 0.9],\n", + " \"feature_2\": [\"red\", \"blue\", \"red\", \"blue\"],\n", + " \"feature_3\": [10.0, -1.0, 5.0, 5.0],\n", + " },\n", + " indexes=[\"feature_2\"],\n", + ")\n", + "evset" + ] + }, + { + "cell_type": "markdown", + "id": "effc4483-9a1a-4e21-b376-3ed188ced821", + "metadata": {}, + "source": [ + "An [`EventSet`][temporian.EventSet] can hold one or several time sequences, depending on what its **[index](../user_guide/#index-horizontal-and-vertical-operators)** is.\n", + "\n", + "If the [`EventSet`][temporian.EventSet] has no index, it will hold a single multivariate time sequence, which means that all events will be considered part of the same group and will interact with each other when operators are applied to the [`EventSet`][temporian.EventSet].\n", + "\n", + "If the [`EventSet`][temporian.EventSet] has one (or many) indexes, its events will be grouped by their indexes' values, so it will hold one multivariate time sequence for each unique value (or unique combination of values) of its indexes, and most operators applied to the [`EventSet`][temporian.EventSet] will be applied to each time sequence independently.\n", + "\n", + "See the last part of this tutorial to see some examples using `indexes` and operators." + ] + }, { "attachments": {}, "cell_type": "markdown", "id": "18cc96f7", "metadata": {}, "source": [ - "## Example Data\n", + "### Example Data\n", "\n", "This minimal data consists of just one `signal` with a `timestamp` for each sample.\n", "\n", @@ -98,14 +316,11 @@ "id": "3f156949", "metadata": {}, "source": [ - "## Part 1: Loading Data\n", - "\n", - "Any kind of signal is represented in Temporian as a **collection of events**, using the `EventSet` object.\n", + "### Creating an EventSet from a DataFrame\n", "\n", - "In this case there's no `indexes` because we only have one sequence.\n", + "As mentioned in the previous section, any kind of signal is represented in Temporian as a **collection of events**, using the `EventSet` object.\n", "\n", - "Indices could be useful if we had multiple signals in parallel.\n", - "For example, imagine that we needed to work with signals from multiple sensor devices, or represent the sales from many stores or products: we could separate them by setting the correct features as indexes for each one." + "In this case there's no `indexes` because we only have one sequence. In the third part we'll learn how to use them and why they can be useful." ] }, { @@ -347,7 +562,7 @@ "id": "de46f604-8d28-4d56-a83d-a13f1073b6b8", "metadata": {}, "source": [ - "## Part 3: Using an index\n", + "## Part 3: Using indexes\n", "This is the final important concept to get from this introduction.\n", "\n", "Indexes are useful to handle multiple signals in parallel (as mentioned at the top of this notebook).\n", @@ -464,25 +679,18 @@ "\n", "To keep it short and concise, there are interesting concepts that were not mentioned above:\n", "\n", - "- You might as well use **datetimes** to specify the timestamps. Learn more about it on the [**Time Units** section of the User Guide](https://temporian.readthedocs.io/en/latest/user_guide/#time-units). There are many [**calendar operators**](https://temporian.readthedocs.io/en/stable/reference/temporian/operators/calendar/calendar_day_of_month/) available when working with date timestamps.\n", - "- Temporian can handle **non-uniform samplings** just as easily (non-equal distance between event timestamps). Read more about the data representation on the **[User Guide's introduction](https://temporian.readthedocs.io/en/latest/user_guide/)** or check the [**sampling** section](https://temporian.readthedocs.io/en/latest/user_guide/#sampling).\n", - "- Temporian is **strict on the feature types** when applying operations, to avoid potentially silent errors or memory issues. Check the [User Guide's **casting** section](https://temporian.readthedocs.io/en/latest/user_guide/#casting) section to learn how to tackle those cases.\n", - "- We only used moving average here, but there are a bunch of other [**moving window**](https://temporian.readthedocs.io/en/stable/reference/temporian/operators/window/moving_count/) operators, frequently useful for time sequences manipulation.\n", + "- Check the [**Time Units** section of the User Guide](https://temporian.readthedocs.io/en/latest/user_guide/#time-units). There are many [**calendar operators**](https://temporian.readthedocs.io/en/stable/reference/temporian/operators/calendar/calendar_day_of_month/) available when working with datetimes.\n", + "- To combine or operate with events from different sampling sources (potentially non-uniform samplings) check the [**sampling** section of the User Guide](https://temporian.readthedocs.io/en/stable/user_guide/#sampling).\n", + "- Temporian is **strict on the feature data types** when applying operations, to avoid potentially silent errors or memory issues. Check the [User Guide's **casting** section](https://temporian.readthedocs.io/en/latest/user_guide/#casting) section to learn how to tackle those cases.\n", "\n", "### Next Steps\n", - "- The [**Recipes**](https://temporian.readthedocs.io/en/latest/recipes/) are short and self-contained examples showing how to use Temporian in typical use cases.\n", - "- Try the more advanced [**tutorials**](https://temporian.readthedocs.io/en/latest/tutorials/) to continue learning by example about all these topics and more!\n", + "- The [**Recipes**](https://temporian.readthedocs.io/en/stable/recipes/) are short and self-contained examples showing how to use Temporian in typical use cases.\n", + "- Try the more advanced [**tutorials**](https://temporian.readthedocs.io/en/stable/tutorials/) to continue learning by example about all these topics and more!\n", + "- Learn how Temporian is **ready for production**, using [**graph mode**](https://temporian.readthedocs.io/en/stable/user_guide/#eager-mode-vs-graph-mode) or [Apache Beam](https://temporian.readthedocs.io/en/stable/tutorials/temporian_with_beam/).\n", + "\n", "- We could only cover a small fraction of **[all available operators](https://temporian.readthedocs.io/en/stable/reference/temporian/operators/add_index/)**.\n", - "- We put a lot of ❤️ in the **[User Guide](https://temporian.readthedocs.io/en/latest/user_guide/)**, so make sure to check it out 🙂." + "- We put a lot of ❤️ in the **[User Guide](https://temporian.readthedocs.io/en/stable/user_guide/)**, so make sure to check it out 🙂." ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "73b77f3e-dcdf-4be0-9c15-c625cb4e297e", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { @@ -501,7 +709,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.4" + "version": "3.10.13" } }, "nbformat": 4, diff --git a/docs/src/tutorials/index.md b/docs/src/tutorials/index.md index f1aa7839b..2c68a6aee 100644 --- a/docs/src/tutorials/index.md +++ b/docs/src/tutorials/index.md @@ -2,7 +2,8 @@ A collection of tutorials that will help you see how Temporian can be used in practice in a wide range of scenarios. -- [Getting Started](getting_started.ipynb): Basic usage of the library, including the concept of index. +Make sure to check the [Getting Started guide](../getting_started.ipynb) before to learn about the basic usage of the library, including the concepts of sampling and indexes. + - [Heart rate analysis](heart_rate_analysis.ipynb): Load, visualize and preprocess medical data to detect heartbeats and compute heart rate and heart rate variability from raw ECG signals. - [Loan outcomes prediction](loan_outcomes_prediction.ipynb): Use Temporian to prepare data to predict outcomes for finished loans. - [M5 Competition](m5_competition.ipynb): Feature engineering and model training on the M5 Makridakis Forecasting Competitions. diff --git a/docs/src/tutorials/temporian_with_beam.ipynb b/docs/src/tutorials/temporian_with_beam.ipynb index 107648aa2..6976bfaff 100644 --- a/docs/src/tutorials/temporian_with_beam.ipynb +++ b/docs/src/tutorials/temporian_with_beam.ipynb @@ -11,7 +11,7 @@ "\n", "**WARNING:** Temporian with Apache Beam is experimental. The API might change, some optimizations are not implemented, and some operators are not available.\n", "\n", - "The reader is assumed to be familiar with Temporian in-process execution. Please read the [3 Minutes to Temporian](../3_minutes), or the [User Guide](../user_guide) before.\n" + "The reader is assumed to be familiar with Temporian in-process execution. Please read the [Getting Started](../getting_started) or the [User Guide](../user_guide) before.\n" ] }, { From a2e00ae5158ffdc3a250d1635e24d01d8b0a37d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Braulio=20R=C3=ADos?= Date: Thu, 26 Oct 2023 19:06:25 -0300 Subject: [PATCH 4/9] Fixes in user_guide --- docs/src/user_guide.ipynb | 2369 ++++++++++++++++++++++++++++++++++--- 1 file changed, 2214 insertions(+), 155 deletions(-) diff --git a/docs/src/user_guide.ipynb b/docs/src/user_guide.ipynb index 29a7e7054..b10f4cccd 100644 --- a/docs/src/user_guide.ipynb +++ b/docs/src/user_guide.ipynb @@ -72,7 +72,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "id": "1d23b4c0", "metadata": {}, "outputs": [], @@ -106,10 +106,154 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "id": "17c712f6", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "
\n", + "
\n", + " \n", + " features\n", + " [3]:\n", + " \n", + " feature_1\n", + " (float64)\n", + " , \n", + " feature_2\n", + " (str_)\n", + " , \n", + " feature_3\n", + " (int64)\n", + "
\n", + "
\n", + " \n", + " indexes\n", + " [0]:\n", + " \n", + " none\n", + "
\n", + "
\n", + " events: \n", + " 4\n", + "
\n", + "
\n", + " index values: \n", + " 1\n", + "
\n", + "
\n", + " memory usage: \n", + " 0.8 kB\n", + "
\n", + "
\n", + "
\n", + " index\n", + " (\n", + " ) with 4 events\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " timestamp\n", + " \n", + " \n", + " \n", + " feature_1\n", + " \n", + " \n", + " \n", + " feature_2\n", + " \n", + " \n", + " \n", + " feature_3\n", + " \n", + "
\n", + " 2023-02-04 00:00:00+00:00\n", + " \n", + " 0.5\n", + " \n", + " red\n", + " \n", + " 10\n", + "
\n", + " 2023-02-06 00:00:00+00:00\n", + " \n", + " 0.6\n", + " \n", + " blue\n", + " \n", + " -1\n", + "
\n", + " 2023-02-07 00:00:00+00:00\n", + " \n", + " nan\n", + " \n", + " red\n", + " \n", + " 5\n", + "
\n", + " 2023-02-07 00:00:00+00:00\n", + " \n", + " 0.9\n", + " \n", + " blue\n", + " \n", + " 5\n", + "
\n", + "
\n" + ], + "text/plain": [ + "indexes: []\n", + "features: [('feature_1', float64), ('feature_2', str_), ('feature_3', int64)]\n", + "events:\n", + " (4 events):\n", + " timestamps: ['2023-02-04T00:00:00' '2023-02-06T00:00:00' '2023-02-07T00:00:00'\n", + " '2023-02-07T00:00:00']\n", + " 'feature_1': [0.5 0.6 nan 0.9]\n", + " 'feature_2': [b'red' b'blue' b'red' b'blue']\n", + " 'feature_3': [10 -1 5 5]\n", + "memory usage: 0.8 kB" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "evset" ] @@ -128,10 +272,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "e3f29b64", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "evset.plot()" ] @@ -169,10 +324,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "f0c059c3-1412-47d5-8f21-8c034f16a551", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Create an event set with a random walk\n", "np.random.seed(1)\n", @@ -220,12 +386,135 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "id": "92ec9711", "metadata": { "lines_to_next_cell": 0 }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "
\n", + "
\n", + " \n", + " features\n", + " [2]:\n", + " \n", + " feature_1\n", + " (int64)\n", + " , \n", + " feature_2\n", + " (str_)\n", + "
\n", + "
\n", + " \n", + " indexes\n", + " [0]:\n", + " \n", + " none\n", + "
\n", + "
\n", + " events: \n", + " 4\n", + "
\n", + "
\n", + " index values: \n", + " 1\n", + "
\n", + "
\n", + " memory usage: \n", + " 0.7 kB\n", + "
\n", + "
\n", + "
\n", + " index\n", + " (\n", + " ) with 4 events\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " timestamp\n", + " \n", + " \n", + " \n", + " feature_1\n", + " \n", + " \n", + " \n", + " feature_2\n", + " \n", + "
\n", + " 2023-03-13 00:00:00+00:00\n", + " \n", + " 1\n", + " \n", + " a\n", + "
\n", + " 2023-03-14 12:00:00+00:00\n", + " \n", + " 4\n", + " \n", + " d\n", + "
\n", + " 2023-03-14 13:30:05+00:00\n", + " \n", + " 2\n", + " \n", + " b\n", + "
\n", + " 2023-04-22 12:00:00+00:00\n", + " \n", + " 3\n", + " \n", + " c\n", + "
\n", + "
\n" + ], + "text/plain": [ + "indexes: []\n", + "features: [('feature_1', int64), ('feature_2', str_)]\n", + "events:\n", + " (4 events):\n", + " timestamps: ['2023-03-13T00:00:00' '2023-03-14T12:00:00' '2023-03-14T13:30:05'\n", + " '2023-04-22T12:00:00']\n", + " 'feature_1': [1 4 2 3]\n", + " 'feature_2': [b'a' b'd' b'b' b'c']\n", + "memory usage: 0.7 kB" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "from datetime import datetime\n", "\n", @@ -257,10 +546,139 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "4869f529-350b-43a5-af07-fded47ccad54", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "
\n", + "
\n", + " \n", + " features\n", + " [3]:\n", + " \n", + " calendar_year\n", + " (int32)\n", + " , \n", + " calendar_hour\n", + " (int32)\n", + " , \n", + " calendar_second\n", + " (int32)\n", + "
\n", + "
\n", + " \n", + " indexes\n", + " [0]:\n", + " \n", + " none\n", + "
\n", + "
\n", + " events: \n", + " 3\n", + "
\n", + "
\n", + " index values: \n", + " 1\n", + "
\n", + "
\n", + " memory usage: \n", + " 0.8 kB\n", + "
\n", + "
\n", + "
\n", + " index\n", + " (\n", + " ) with 3 events\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " timestamp\n", + " \n", + " \n", + " \n", + " calendar_year\n", + " \n", + " \n", + " \n", + " calendar_hour\n", + " \n", + " \n", + " \n", + " calendar_second\n", + " \n", + "
\n", + " 1970-01-01 00:00:00+00:00\n", + " \n", + " 1970\n", + " \n", + " 0\n", + " \n", + " 0\n", + "
\n", + " 1970-01-01 00:00:01+00:00\n", + " \n", + " 1970\n", + " \n", + " 0\n", + " \n", + " 1\n", + "
\n", + " 1970-01-01 00:00:02+00:00\n", + " \n", + " 1970\n", + " \n", + " 0\n", + " \n", + " 2\n", + "
\n", + "
\n" + ], + "text/plain": [ + "indexes: []\n", + "features: [('calendar_year', int32), ('calendar_hour', int32), ('calendar_second', int32)]\n", + "events:\n", + " (3 events):\n", + " timestamps: ['1970-01-01T00:00:00' '1970-01-01T00:00:01' '1970-01-01T00:00:02']\n", + " 'calendar_year': [1970 1970 1970]\n", + " 'calendar_hour': [0 0 0]\n", + " 'calendar_second': [0 1 2]\n", + "memory usage: 0.8 kB" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "a_evset = tp.event_set(\n", " timestamps=[0, 1, 2],\n", @@ -286,10 +704,103 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "id": "899fee67-01d0-4680-a223-7b7b144a46ca", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "
\n", + "
\n", + " \n", + " features\n", + " [1]:\n", + " \n", + " count\n", + " (int32)\n", + "
\n", + "
\n", + " \n", + " indexes\n", + " [0]:\n", + " \n", + " none\n", + "
\n", + "
\n", + " events: \n", + " 3\n", + "
\n", + "
\n", + " index values: \n", + " 1\n", + "
\n", + "
\n", + " memory usage: \n", + " 0.5 kB\n", + "
\n", + "
\n", + "
\n", + " index\n", + " (\n", + " ) with 3 events\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " timestamp\n", + " \n", + " \n", + " \n", + " count\n", + " \n", + "
\n", + " 2023-03-13 00:00:00+00:00\n", + " \n", + " 1\n", + "
\n", + " 2023-03-14 00:00:00+00:00\n", + " \n", + " 2\n", + "
\n", + " 2023-03-15 00:00:00+00:00\n", + " \n", + " 2\n", + "
\n", + "
\n" + ], + "text/plain": [ + "indexes: []\n", + "features: [('count', int32)]\n", + "events:\n", + " (3 events):\n", + " timestamps: ['2023-03-13T00:00:00' '2023-03-14T00:00:00' '2023-03-15T00:00:00']\n", + " 'count': [1 2 2]\n", + "memory usage: 0.5 kB" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "a = tp.event_set(timestamps=[\"2023-03-13\", \"2023-03-14\", \"2023-03-15\"])\n", "\n", @@ -331,10 +842,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "id": "cbf42f42", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "evset = tp.event_set(\n", "\ttimestamps=[1, 2, 3, 4, 5],\n", @@ -365,10 +887,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "id": "82552e04", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYYAAAEiCAYAAAD9DXUdAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAAA2fklEQVR4nO3de1xUdf7H8fcAOqJcFJRF5eYFUIFhQGApxUuu6RZrhJu6hekSqGU9fmVtqOWW5S6WKevalpSJFeaadzftspoJPbwgq6CioSA3AxwhnBmucvn+/mA563BzhjkzZ+acz+vxmEfOzJl5fmeW5cs5Z+YcGWOMgaIoiqL+m43QA6AoiqIsK5oYKIqiKJ1oYqAoiqJ0oomBoiiK0okmBoqiKEonmhgoiqIonWhioCiKonSiiYGiKIrSyU7oAVhabW1tKC8vh6OjI2QymdDDoSiK4iXGGLRaLUaMGAEbm97XCWhi6FR5eTk8PT2FHgZFUZRJKisrg4eHR6/LWNzEcP36dSxatAhVVVVwdnbGjh07EBAQoLNMW1sbXn31VXzzzTdoaWnBpEmT8OGHH6J///4AgK+++gqvvPIKWltbERQUhB07dsDJyUkv39HREUD7m6fvY+6turoarq6uBj+Oj6Rq9+bf1jTiy+ybmBfmgWFOA8xqmyOyydY3jUYDT09P7ndcrzELa/r06SwtLY0xxtiePXtYWFhYl2U++ugjNn36dNbU1MTa2tpYQkICe/fddxljjGm1Wubm5sauXr3KGGNs+fLl7JVXXtHbV6vVDABTq9V9Gv+lS5f69Dg+kqrdm3/p5h3mnfQVu3Tzjtltc0Q22fpmyO82i9r5rFKpkJ2djbi4OADA3LlzUVZWhoKCAp3lcnNz8Zvf/Ab9+/eHTCbDb3/7W3z++ecAgK+//hohISEYN24cAOC5557Drl27zPYahgwZYjaLbMvwySZbbLZFTQxlZWUYPnw47Ozat3DJZDJ4eXmhtLRUZ7mJEyfi8OHD0Gg0aG5uxpdffoni4mIAQGlpKby9vbllfXx8UFFRgZaWlm7NpqYmaDQanYsx9evXz6jHk82v33HsYFMeQ1iq7zvZ4rUtamLQt8WLF2P27NmYOnUqpk6dCj8/P24yMbTk5GQ4OztzF2N3PKtUKqMeTzZ/flVtE978Vx4A4M1/5aGqtslstrkim2xTZFETg6enp85f94wxlJaWwsvLS2c5mUyGN998ExcuXMCpU6cwYcIEbge1l5cXSkpKuGWLi4t11kI6t2rVKqjVau5SVlZm1GsQcgesVO3u/CMXKzBz00kUVdXhUcVwFFXVYeamkzhyscLktjkjm2xTZFETg5ubG0JDQ5Geng4A2LdvHzw8PDB27Fid5RobG1FTUwMAqKqqwvr16/Hqq68CAGbPno3z58/jp59+AgB88MEHWLBgQY+mXC6Hk5OTzoWy/vJvaRE52hXfvTQF/3gyFN+9NAWRo11x7ZZW6KFRlMVnURMDAKSmpiI1NRV+fn5Yv3490tLSAAAJCQk4fPgwAECtVuPBBx9EQEAAoqKisGzZMvzud78D0P5x023btiEmJgZjx47FzZs3sWbNGrONv7q62mwW2T37L87wxYdxEzHUQQ4AGOogx4dxE/F/M3xNbpszssk2RTLG6NSe96bRaODs7Ay1Wt2ntQeVSgU3NzcTjIxsS/XJJtsabEN+t1ncGoO119zcTLbEfLLJFptNEwPPdez7IFs6Ptlki82miYHn3N3dyZaYTzbZYrNpYuC5+vp6siXmk0222GyaGHjO2G9Ok219Ptlki82miYHnRowYQbbEfLLJFptNEwPPSeGvCUuzhfbJJltsNk0MPFdbW0u2xHyyyRabTRMDzwl59jep2kL7ZJMtNpsmBp6rqqoiW2I+2WSLzaaJgecaGhrIlphPNtlis2li4Ll7TxJEtjR8sskWm00TA89VVlaSLTGfbLLFZtPEwHNNTaY5SxjZluuTTbbYbDrsdqeMPex2fX09Bg4caIKRkW2pPtlkW4NNh90WsNLSUrIl5pNNtthsmhh4ruN81WRLxyebbLHZtCmpU8ZuSmpsbMSAAQNMMDKyLdUnm2xrsGlTkoDduHGDbIn5ZJMtNpsmBp5ra2sjW2I+2WSLzaZNSZ0ydlNSc3Mz+vXrZ4KRkW2pPtlkW4NNm5IELD8/n2yJ+WSTLTabJgaKoihKJ7NsSqquroarq6tey16/fh2LFi1CVVUVnJ2dsWPHDgQEBOgsk5aWhs2bN3PXb968iSlTpmD//v0oLi7GmDFjEBQUxN2/b98+jBkzRi+fNiVZny20TzbZ1mBb3KakkJAQvZddunQplixZgmvXriEpKQmLFy/usswf//hH5OTkcBd3d3c89dRT3P2Ojo469+s7KfCRFFYzLc0W2iebbLHZdnw90eHDh3u8r7GxUa/nUKlUyM7OxnfffQcAmDt3Lp5//nkUFBRg7Nix3T7m7NmzUKlUmDNnjuGDpiiKorrE28Tw+OOPY+rUqehuy5RWq9XrOcrKyjB8+HDY2bUPSyaTwcvLC6WlpT1ODJ988gkWLlyos3pVV1eH8PBwtLa2IiYmBq+99hpsbW27fXxTU5POgamMPaeqv7+/UY8n2/p8sskWm83bpiRfX19s374dJ06c6HIZOnQoX4xOdXV1+Oc//4lnnnmGu2348OH4+eefce7cORw7dgyZmZnYuHFjj8+RnJwMZ2dn7mLsqfOksJppabbQPtlki83mbWLo2GHcXcuWLdPrOTw9PVFRUcEdD4QxhtLSUnh5eXW7/J49exAQEIAJEyZwt8nlcri5uQEAXFxcEB8fj8zMzB7NVatWQa1Wc5eysjK9xtpTNjbCfdBLqrbQPtlki85mZu7GjRu93j916lSWlpbGGGNsz549bOLEiT0uO3nyZPbxxx/r3Hbr1i129+5dxhhjjY2N7Pe//z1bs2aN3uNTq9UMAFOr1Xo/5t4aGhr69Dg+kqottE822dZgG/K7zexT39y5c3u9PzU1FampqfDz88P69euRlpYGAEhISNDZwZ2fn4+cnBzMnz9f5/E//vgjQkJCEBwcjNDQULi7u+O1117j/4X0UEFBgdkssi3DJ5tssdm87XzWN3afr034+/vj9OnTXW7ftm1bl+W626kdGxuL2NhY4wZpRB07zsmWjk822WKzzb7GIJPJzE2atZ72h5AtXp9sssVm0yExeE4Kh+S1NFton2yyxWabfWK436Yka08ul5MtMZ9sssVmm31iEHL7vzlyd3cnW2I+2WSLzeZ9YigrK0N0dDSUSiUAICcnBykpKdz9a9as4Zu0qEpKSsiWmE822WKzeZ8Yli5digULFnCbjAIDA7F9+3a+GYvN3t6ebIn5ZJMtNpv3iUGlUiEuLo77hp6dnZ3gH2U0Z6Y6/AfZluuTTbbYbN4nBjs7O50dzDU1NaLf4Xxvxh5Sg2zr88kmW2w27xPDE088gaVLl0Kj0WDbtm2YOXMmEhIS+GYsNgcHB7Il5pNNtths3rfxvPzyy9i1axfUajW+++47rFixAk8++STfjMXWl7O+kW3dPtlki83mdWJobW3FrFmzcOzYMfzhD3/g86mtpvLycri4uJAtIZ9sssVm87opydbWFvX19Whra+Pzaa0qKfw1YWm20D7ZZIvN5n1TUnh4OKKjoxEXF6ezPUwqp94cOHAg2RLzySZbbDbvE8PFixcBAB9//DF3m0wmk8zEUFlZKdjH2aRqC+2TTbbYbN4nhhMnTvD9lFbVkCFDyJaYTzbZYrN5nxgyMjK6vX3KlCl8UxZZv379yJaYTzbZYrNN8nHVjhobG5Gfn4/AwECcP3+eb8oiU6lU3DmnyZaGTzbZYrN5nxjOnTuncz0rKws7duzgm7HYXF1dyZaYTzbZYrNNftjtiIiIbk/VSVEURVlmvE8MFy9e5C4XLlzA1q1b0dzczDdjsVVXV5MtMZ9sssVm874p6bHHHvvfk9vZwdfXF59++infjMUm5HZ2qdpC+2STLTab94mhqKiI76e0qoRcO5KqLbRPNtlis3nflBQTE6PXbT11/fp1PPjgg/Dz80N4eDjy8vK6Xe7SpUuYNm0axo8fj/Hjx2P//v3cfZ988gl8fX0xZswYJCYm9unNvK1pNPgxQPthxoVKqrbQPtlki83mfWIoLS3tclthYaHej1+6dCmWLFmCa9euISkpCYsXL+6yTH19PR577DGsW7cOV69exeXLlxEVFQWgfY1lzZo1yMzMREFBAW7duoWPPvrI4Ndxu7bJ4McA0jgfrKXZQvtkky02m7eJITU1FSEhIcjPz0doaCh3GTNmDEaNGqXXc6hUKmRnZyMuLg4AMHfuXJSVlaGgoEBnuS+++AKRkZGYPHkygPaD9w0bNgwAsHfvXsyZMwfu7u6QyWRYtmwZdu3axdfLvG/19fVms8i2DJ9sssVm87aPYfbs2fD398ezzz6LlJQU7nYnJycoFAq9nqOsrAzDhw/nTgUqk8ng5eWF0tJSjB07llvuypUrkMvliI6Oxs2bN6FQKLBx40YMGzYMpaWl8Pb25pb18fHpdi2mo6amJjQ1/W/tQKPRAAD6etK5jscLkVRtoX2yyRabzdvE4O3tDW9vb1y9epWvp+yxlpYWHDt2DGfOnMGIESOwevVqPPvss9i7d6/Bz5WcnIy1a9d2vf3rn7Dd0w1DHeQGPd+IESMMHgNfSdUW2iebbLHZvO9jaGhowLvvvosnn3wSsbGx3EWfPD09UVFRgZaWFgAAYwylpaXw8vLSWc7LywvTp0/HyJEjIZPJEBcXhzNnznD3lZSUcMsWFxd3efy9rVq1Cmq1mrt0nFO1pLoOMzedxJGLFQa9fin8NWFpttA+2WSLzeZ9YkhMTERxcTFOnTqF6dOno6SkRGfTTm+5ubkhNDQU6enpAIB9+/bBw8NDZzMSAMybNw/nzp3j3qSjR48iODgYQPt+icOHD6OyshKMMWzduhULFizo0ZTL5XByctK5AMDB5ZMQOdoV125pDXr9tbW1Bi3PZ1K1hfbJJlt0NuO5wMBAxhhjQUFBjDHGNBoNi4qK0vvxP/30E4uMjGS+vr5s4sSJ7OLFi4wxxp555hl26NAhbrnPPvuMBQQEsKCgIDZ79mxWWlrK3ffRRx+x0aNHs9GjR7P4+Hh29+5dvX21Ws0AMLVazRhjrLW1Te/HMsbYnTt3DFqez6RqC+2TTbY12J1/t/UW719ws7e3B9D+ree6ujo4Ojri9u3bej/e39+/22Mrbdu2Tef6woULsXDhwm6fIzExEYmJiQaMuudsbGQGLV9VVQVnZ2debEOTqi20TzbZYrN5nxhcXFxQU1ODRx55BLNmzcLQoUPh4eHBN2OxNTQ0kC0xn2yyxWbLGOvrBzO7r7W1Fba2tmCM4YsvvkBNTQ2efvppwU8Wr28ajQbOzs5Qq9V9GrNWq4Wjo6MJRka2pfpkk20NtiG/23jf+Wxra4uKigqcPHkSTz31FJYuXYoBAwbwzVhslZWVZEvMJ5tssdm8Twx79+5FZGQkdyiLK1euGHSsJGvv3i/LkS0Nn2yyxWbzPjEkJyfj/Pnz3Emrg4ODdb5XIPZGjx5NtsR8sskWm22STUmdTz/Xv39/vhmLrbfDb5AtTp9sssVm8z4xODo64tatW5DJ2j/mefz4cbi4uPDNWGwd39omWzo+2WSLzebtU0l5eXkICAhAdnY2lixZghs3biAwMBBFRUU4cuQIlEolH4zJM/ZTSY2NjYLtbJeqLbRPNtnWYAvyqaSOL5u9+OKLOHHiBHbt2oXVq1cjLy/PaiYFPrpx4wbZEvPJJltsNm9fcGtsbMTu3btRUVGBjIwMdKyIZGRkAADmzJnDF2XRtbW1kS0xn2yyxWbztinp8OHD2Lp1KzIzMxEWFqaLyGT4/vvv+WBMnrGbkpqbm9GvXz8TjIxsS/XJJtsabEE2Jc2ZMwdHjx5FfHw8Tpw4oXOxlkmBj/Lz88mWmE822WKzef9U0ubNm/l+SoqiKMqM8X6sJGuPNiVZny20TzbZ1mALeqwkqSeF1UxLs4X2ySZbbDZNDBRFUZROtCmpU7QpyfpsoX2yybYGmzYlCZgUVjMtzRbaJ5tssdk0MfCcjY1wb6lUbaF9sskWm02bkjpFx0qyPlton2yyrcGmTUkCVlBQQLbEfLLJFptNEwPP2dnxdvgpsq3EJ5tssdkWNzFcv34dDz74IPz8/BAeHo68vLwel2WM4aGHHsLgwYO524qLi2FrawulUsldCgsLzTDy9ry8vMxmkW0ZPtlki822uIlh6dKlWLJkCa5du4akpCTu3NHdlZKSgjFjxnS53dHRETk5Odylu2VMlRQOyWtpttA+2WSLzbaoiUGlUiE7OxtxcXEAgLlz56KsrKzb7Wp5eXk4ePAgVq5cae5h9ppcLidbYj7ZZIvNtqiJoaysDMOHD+e2o8lkMnh5eXU5z2lzczMSExORmpoKW1vbLs9TV1eH8PBwhIaG4q233kJra2uPZlNTEzQajc7FmNzd3Y16PNnW55NNtthsi5oY9G3t2rWIjY3F+PHju9w3fPhw/Pzzzzh37hyOHTuGzMxMbNy4scfnSk5OhrOzM3fx9PQ0amwlJSVGPZ5s6/PJJltstkVNDJ6enqioqOBOeM0YQ2lpaZcdLidPnsSWLVvg4+ODyZMnQ6PRwMfHB7dv34ZcLoebmxsAwMXFBfHx8cjMzOzRXLVqFdRqNXcpKysz6jXY29sb9Xiyrc8nm2yx2cJ+xrBTbm5uCA0NRXp6OhYvXox9+/bBw8MDY8eO1Vnu3l/0xcXFUCqVKC4uBtC+n2LIkCHo168fmpqasH//foSEhPRoyuVyXrfbDR06lLfnIts6fLLJFpttUWsMAJCamorU1FT4+flh/fr1SEtLAwAkJCTg8OHD9338jz/+iJCQEAQHByM0NBTu7u547bXXTD1sLmPXOMi2Pp9sssVmW9QaAwD4+/vj9OnTXW7ftm1bt8v7+Pjgzp073PXY2FjExsaaanj3zcHBgWyJ+WSTLTbb4tYYrL2+HF+JbOv2ySZbbDZNDDxXXl5OtsR8sskWm00TA8+ZakZXaRqR8u9rUGkazW7fL5WmEXt/auh1bKZOCn/FkU02rTFYaQMHDjTJ86q0Tdh8/DpU2iaz2/dLpW3CjmxVr2MzdUK9drLJFqNNEwPPVVZWStIWOqm+72STbYpoYuC5IUOGmOR5O06n1NtplUxl3y99xmbqhHrtZJMtRpsmBp4zxUnCq2qb8Oa/2g8//ua/8lBV2/0mGyFOUK7v2EydUCdnJ5tsMdo0MfCcSqXi9fmOXKzAzE0nUVRVh0cVw1FUVYeZm07iyMUKk9uGjC3Ke2CvYzN15n7tZJMtZtvivuBm7bm6uvL6fPm3tIgc7Yq3YwIx1EGOqtomrDl4GdduafEohpvUNmRszdpf0M/RpcexmTpzv3ayyRazTRODhffiDF/Y2Mi460Md5PgwbiLa2gTcoP/f7h1bhdayxkZRVN+jiaFT7L97UPt6XoaSkhIMGjSIzyGRbeE+2WRbg93xO43p8SkRmhg6pdVqAcDo8zJQFEVZYlqtFs7Ozr0uI2P6TB8Sqq2tDeXl5XB0dIRMJrv/A+5Jo9HA09MTZWVlZv92pFRtoX2yybYWmzEGrVaLESNGwMam988d0RpDp2xsbODh4WHUczg5OQn2tXmp2kL7ZJNtDfb91hQ6oo+rUhRFUTrRxEBRFEXpRBMDj8nlcrzxxhu8niqUbMv2ySZbjDbtfKYoiqJ0ojUGiqIoSieaGCiKoiidaGKgKIqidKKJgaIoitKJJgaKoihKJ5oYKIqiKJ1oYqAoiqJ0oomBoiiK0okmBoqiKEonmhgoiqIonWhioCiKonSiiYGiKIrSiU7U0yljzuBGURRlqdEZ3IyovLyczvdMUZRoKysru+9ZKmli6JSjoyMA9Pm8qtXV1XB1deV7WGT31dfeAi6kAyFxgOOvzGubIbLJ1reOc0Z3/I7rLYucGFpaWmBnJ8zQOjYf9fW8qqWlpRg1ahTfwyK7r37tDSD7b0Do44CJztEr1fedbOu09dlEbvadz4cOHcL48eMRHByMpKQkDB06FMXFxfDx8UFSUhIiIiKwaNEiNDc3Y+XKlYiIiIBSqcS8efNQU1MDANBqtUhMTERERAQUCgWWLFmCu3fvAgCmTZuGV155BVFRURgzZgyWLVtm1tc3ZMgQs3pkC++TTbbYbLNODCqVCvHx8Thw4AByc3Mxbtw4VFdXc/dXV1fj7Nmz2LlzJzZs2IBBgwYhKysLOTk5CAoKwuuvvw4AePnllxEVFYWsrCzk5uaira0Nmzdv5p6nsLAQJ06cwOXLl/Htt9/i9OnTPY6pqakJGo1G52JM/fr1M+rxZPPts07/Nadt+sgm2xSZdWI4c+YMFAoFxo0bBwBYtGgR+vfvz92/ePFibjXn4MGDSE9Ph1KphFKpxK5du1BUVMTdt2HDBiiVSoSEhCAzMxMFBQXc88yfPx92dnawt7eHUqlEYWFhj2NKTk6Gs7MzdzF2x7NKpTLq8WTz6NfeBr5Oav/310nt181lmymyyTZFFrWPwcHBgfs3YwxbtmzBww8/3GU5xhj27dsHPz+/bp9nwIAB3L9tbW3R0tLSo7lq1SqsWLGCu96xg6avCbkDVqp2t37eAeCrFYBMBgQ8DhRlAP+IAKI3tV83pW3GyCbbFJl1jSEyMhIXL15Efn4+ACA9PZ3bN9C5mJgYpKSkoL6+HgBQX1+PvLw87r533nmH+4VfU1Ojs8ZgSHK5nNvR3NcdzpQFproK+EwGnjsLPLGj/b8+kwHVT0KPjKIsPrNODG5ubti2bRtiYmKgVCpx6dIlODg4YPDgwV2WTUpKQnh4OH79619DoVAgMjISOTk5AICUlBRuM5FCocCMGTNQXFxszpfSY/fuMyFbQH/qSmD+54DDsPbrDsPar09NMr1txsgm2xTJGGOm2yvXTVqtlvsc7cGDB7Fq1SpcvXrVnEPoNY1GA2dnZ6jV6j6tPahUKri5uZlgZGRbqk822dZgG/K7zez7GLZs2YLdu3ejtbUVTk5O2Llzp7mHYNKam5vJlphPNtlis83+PYbVq1cjNzcXly9fxqlTpxAaGmruIZi0ju9akC0dn2yyxWbT0VV5zt3dnWyJ+WSTLTabJgae6/gUFdnS8ckmW2w2TQw8Z+w3p8m2Pp9sssVm08TAcyNGjCBbYj7ZZIvNpomB56Tw14Sl2UL7ZJMtNpsmBp6rra0lW2I+2WSLzaaJgeeEPPubVG2hfbLJFptNEwPPVVVVkS0xn2yyxWbTxMBzDQ0NZEvMJ5tssdk0MfCct7c32RLzySZbbDZNDDxXWVlJtsR8sskWm00TA881NTWRLTGfbLLFZpv9sNuWnrGH3a6vr8fAgQNNMDKyLdUnm2xrsA353UZrDDxXWlpKtsR8sskWm00TA8/1dn5pssXpk0222GzalNQpYzclNTY2YsCAASYYGdmW6pNNtjXYVr8pSei/Po3pxo0bZEvMJ5tssdlmnxgOHTqE8ePHIzg4GElJSRg6dCiKi4vh4+ODpKQkREREYNGiRWhubsbKlSsREREBpVKJefPmcWcv0mq1SExMREREBBQKBZYsWYK7d+8CAKZNm4ZXXnkFUVFRGDNmDJYtW2bW19fW1mZWj2zhfbLJFptt1olBpVIhPj4eBw4cQG5uLsaNG4fq6mru/urqapw9exY7d+7Ehg0bMGjQIGRlZSEnJwdBQUF4/fXXAQAvv/wyoqKikJWVhdzcXLS1tWHz5s3c8xQWFuLEiRO4fPkyvv32W5w+fbrHMTU1NUGj0ehcjMnf39+ox5NtfT7ZZIvNNuvEcObMGSgUCowbNw4AsGjRIvTv35+7f/HixZDJZACAgwcPIj09HUqlEkqlErt27UJRURF334YNG6BUKhESEoLMzEwUFBRwzzN//nzY2dnB3t4eSqUShYWFPY4pOTkZzs7O3MXYg1Tl5+cb9Xiyrc8nm2yx2XZmUfTMwcGB+zdjDFu2bMHDDz/cZTnGGPbt2wc/P79un+fenTO2tra97rNYtWoVVqxYwV3XaDSCHymUoihKyAxeY+huG1fHtv/7FRkZiYsXL3KzXnp6OrdvoHMxMTFISUnhznFaX1+PvLw87r533nmH+4VfU1Ojs8ZgSHK5HE5OTjoXY5LCaqal2UL7ZJMtNlvviSE7OxujRo2Cvb09Hn/8cdy+fZu7b8aMGXo9h5ubG7Zt24aYmBgolUpcunQJDg4OGDx4cJdlk5KSEB4ejl//+tdQKBSIjIxETk4OACAlJYXbTKRQKDBjxgwUFxfr+1JMmhRWMy3NFtonm2yx2XpvSnrppZfw/vvvIzIyEn/7298wZcoUHDt2DCNHjoQhX4X4zW9+g8cffxxA+76Cr776CoMHD+7yi93Ozg5vvfUW3nrrrS7P4eDggPfff7/b5//hhx90ru/du1fvsVEURVEGTAy1tbV49NFHAQBvv/02/P398dBDD+HYsWPcDmN92rJlC3bv3o3W1lY4OTlh586dho/agpPCaqal2UL7ZJMtNlvvTUn19fU6+xfi4uLw1ltvYcaMGTofOb1fq1evRm5uLi5fvoxTp04hNDTUsBFbeFJYzbQ0W2ifbLLFZus9MUyaNAlHjx7VuW3+/PlYt24dKioqeB+YtWZjI9yXyaVqC+2TTbbYbN6PlVRUVIRRo0bx+ZRmjY6VZH220D7ZZFuDLeixkubOncv3U1pVff3YLNnW65NNtths3icGqR+s1c5OuO8MStUW2iebbLHZvE8MhnxCSYx5eXmRLTGfbLLFZlvkYbetOSkcktfSbKF9sskWm02bknhOLpeTLTGfbLLFZvM+McTGxvL9lFaVu7s72RLzySZbbLbBE0NZWRmio6OhVCoBADk5OUhJSeHuX7NmDW+Ds8ZKSkrIlphPNtlisw2eGJYuXYoFCxZwm4wCAwOxfft23gdmrdnb25MtMZ9sssVmGzwxqFQqxMXFcd/As7OzE/yjipbU0KFDyZaYTzbZYrMNnhjs7Ox0djDX1NRIfofzvZWVlZEtMZ9sssVmGzwxPPHEE1i6dCk0Gg22bduGmTNnIiEhwRRjs8ruPQsd2dLwySZbbLbB24Befvll7Nq1C2q1Gt999x1WrFiBJ5980hRjs8qMPQMc2dbnk0222GyDJobW1lbMmjULx44dwx/+8AdTjcmqKy8vh4uLC9kS8skmW2y2QZuSbG1tu5yXgdJNCn9NWJottE822WKzDd6UFB4ejujoaMTFxels75ozZw6vA+Or3//+94iOjsbixYvN4g0cONA0T6ytBLLTgLA/Ao7df8nFZLYeCWkL7ZNNtthsgyeGixcvAgA+/vhj7jaZTGa2iaGlpcWiPx5bWVlpmo+UaSuBk+sB/9/2ODGYzNYjIW2hfbLJFptt8G/YEydOmGIcvSaTyfDnP/8ZR48exbRp0/DnP/8ZK1asQG5uLhobGxEZGYn3338f/fv3x08//YT4+Hio1Wr4+vqivr7erGMdMmSIWT2yhffJJltstsETQ0ZGRre3T5kyxejB9JatrS3OnTsHAFiyZAmioqLw8ccfgzGGxMREbN68GX/605+wcOFCLFu2DM888wwuXbqEsLCwXj811dTUhKamJu66RqMxapz9+vUz6vE9xzr915z2/RPSFtonm2yx2X36uGpHjY2NyM/PR2BgIM6fP8/rwDoXHx/P/fvgwYM4ffo0Nm3aBABoaGiAra0tNBoNcnJyuP0JQUFBmDx5cq/Pm5ycjLVr1/I2TpVKBTc3N96eDwBQexv4Oqn9318nAfN3Ag7DzGPrmZC20D7ZZIvNNnhi6PirvaOsrCzs2LGDr/H02L07uhlj2LdvH/z8/HSW6e6v/fudOGjVqlVYsWKFznN4enr2eZyurq59fmy35R0AvloByGRAwONAUQbwjwggelP7dVPaBiSkLbRPNtlis40+7HZERAROnz7Nx1j0LiYmBu+88w5aWloAtB+Wo6CgAE5OTggJCcFnn30GAMjLy8OPP/7Y63PJ5XI4OTnpXCwq1VXAZzLw3FngiR3t//WZDKh+EnpkFEWJNIMnhosXL3KXCxcuYOvWrWhubjbF2HosJSUF9vb2UCqVUCgUmDFjBoqLiwEAn332GT766CMEBgbi9ddfN/m+j85VV1fz+4RTVwLzP//fpiOHYe3XpyaZ3jYgIW2hfbLJFptt8Kakxx577H8PtrODr68vPv30U14H1bnOB+lzcHDA+++/3+2y48aNM/sazL3xvv3Ppoe5u5vbhdzGL6QttE822WKzDZ4YioqKTDEO0WTutSeyhffJJltstsGbkmJiYvS6TarV1NSQLTGfbLLFZhs8MZSWlna5rbCwkJfBiCEpnA/W0myhfbLJFput96ak1NRUbN26FdeuXUNoaCh3u1qtRkBAgEkGZ42Z+5vWZAvvk0222Gy9J4bZs2fD398fzz77LFJSUrjbnZycoFAoTDI4a8zYb06TbX0+2WSLzdZ7YvD29oa3tzeuXr1qyvFYfSNGjCBbYj7ZZIvNNvhTSQ0NDdiyZQtycnLQ2NjI3b5//35eB2ataTQawU7iIVVbaJ9sssVmG7zzOTExEcXFxTh16hSmT5+OkpISeHt7m2JsVlltbS3ZEvPJJltstsETQ25uLj744AM4OTnhhRdewA8//ID//Oc/phibVWbMcZbItk6fbLLFZhs8Mdjb2wNo/9ZzXV0dHB0dcfv2bd4HZq1VVVWRLTGfbLLFZhu8j8HFxQU1NTV45JFHMGvWLAwdOhQeHh6mGJtV1tDQQLbEfLLJFpstY50PRHSfWltbYWtrC8YYvvjiC9TU1ODpp5+2vKOS9jGNRgNnZ2eo1eo+vSatVgtHR0cTjIxsS/XJJtsabEN+txm8KcnW1hYVFRU4efIknnrqKSxduhQDBgzo00DFWGVlJdkS88kmW2y2wRPD3r17ERkZyZ0l7cqVK3SspHu69zShZEvDJ5tssdkGTwzJyck4f/48d1Lq4OBglJSU8D4wa2306NFkS8wnm2yx2X3alNT59HL9+/fnbUDWXncHGSRb3D7ZZIvNNnhicHR0xK1bt7hzKR8/flzQb7xaWh2nGyVbOj7ZZIvN1vtTSXl5eQgICEB2djaWLFmCGzduIDAwEEVFRThy5AiUSiU/A5LJUFNTg8GDBxt0H18Z+6mkxsZGwXbGS9UW2iebbGuwTfKppIULFwIAXnzxRZw4cQK7du3C6tWrkZeXx9ukIIZu3LhBtsR8sskWm633xNDY2Ijdu3ejoqICGRkZaG5uRktLCzIyMnD48GFeB/Xee+8hJCQEfn5+2LlzZ7fL+Pj4ICcnh7seFhaGH374AUD7R7rmzZuHiIgIBAUF4fXXX+d1fL3V1tZmNotsy/DJJltstt7ffF6/fj22bt0KlUqFTZs26dwnk8kwZ84c3gYlk8lw4cIF3LhxA2FhYZg0aRJ8fHz0fvyiRYuwevVqTJ06FS0tLYiOjsaePXvwxBNPdFm2qalJ5yNgxh7v3N/f36jHk219Ptlki83We41hzpw5OHr0KOLj43HixAmdy/fff8/roBISEgC0fzRrypQpyMjI0PuxdXV1OH78OP7v//4PSqUSYWFhKCgoQH5+frfLJycnw9nZmbsYe5CqnhxzJFVbaJ9sssVmG3yspM2bN5tiHL3W8Qmoe7Ozs0Nrayt3vePcEB370s+cOaPXTppVq1ZhxYoV3HWNRiP4kUIpiqKEzOCPq5qjtLQ0AEBxcTEyMzMRFRXVZZmxY8fi7NmzAICsrCxuJnVwcMD06dOxfv16btny8nLcvHmzW0sul8PJyUnnYkxSWM20NFton2yyxWZb5MTQ2tqKkJAQPPzww/j73//e7f6FdevW4R//+AeCg4Oxfft2BAQEcPft3LkTBQUFCAwMRFBQEGJjY1FdXW2WsUthNdPSbKF9sskWm23wpiRT17Ep6O233+7xPqD9U0h5eXndPoebmxvS09NNM0CKoiiRZ/Bht8WesV9wa25uRr9+/UwwMrIt1SebbGuwTXrYbar3pLCaaWm20D7ZZIvNpomB52xshHtLpWoL7ZNNtths2pTUKTpWkvXZQvtkk20NNm1KErCCggKyJeaTTbbYbJoYeM7OTrgPeknVFtonm2yx2TQx8JyXlxfZEvPJJltsNk0MPCeFQ/Jami20TzbZYrNpYuA5uVxOtsR8sskWm00TA8+5u7uTLTGfbLLFZtPEwHMlJSVkS8wnm2yx2TQx8Jy9vT3ZEvPJJltsNk0MPDd06FCyJeaTTbbYbJoYeK6srIxsiflkky02myYGnnNwcCBbYj7ZZIvNpomB54w9AxzZ1ueTTbbYbJoYeK68vJxsiflkky022+ImBplMhjt37hh8H+9pb/XpYVL4a6JL2kp4FqQD2kphfEj0fSebbBNlcRODxVTbt4lh4MCBPA/ECmxtJZxzPhR0YpDk+0422SbKIieG9957DyEhIfDz88POnTu7XcbHxwc5OTnc9bCwMPzwww8AgMrKSsybNw8REREICgrC66+/boZRg7OFSkhb6KT6vpNNtimyyIlBJpPhwoUL+Oabb/DCCy+guLjYoMcvWrQIy5cvR1ZWFi5cuIDs7Gzs2bOn22Wbmpqg0Wh0Lu317fxFQ4YM6dPj+Eg4m3X6r/mT5vtONtmmSdiD6PdQQkICAGD06NGYMmUKMjIy4OPjo9dj6+rqcPz4cdy69b9NQbW1tT2eKzU5ORlr167tese/3wBG7gYchhk0dqFOEi6YXXsb+Dqp/d9fJwHzdxr8nvGR5N53ssk2YRa5xtA5mUzW5TY7Ozu0trZy1xsbGwEAHWcqPXPmDHJycpCTk4OCgoIeNyetWrUKarWau3BfIPnlBvCPCCDvgEFjValUBi3PZ2a38w60v0fVBVB7PARUF/TpPeMjSb3vZJNt4ixyYkhLSwMAFBcXIzMzE1FRUV2WGTt2LM6ePQsAyMrK4tYIHBwcMH36dKxfv55btry8HDdv3uzWksvlcHJy0rkAABK+B3wmA6qfDBq7q6urQcvzmdlt1dX29+i5s6h/9APgubN9es/4SFLvO9lkmziL3JTU2tqKkJAQ1NXV4e9//3u3m5HWrVuHRYsWITU1FQ888AACAgK4+3bu3IkVK1YgMDAQMpkMgwYNQmpqKjw8PPQfhMNQYP7nQFsbD69IpE1dCdj8928LbUX7JiR6zyjK6rO4iaFjU9Dbb7/d431A+6eQ8vLyun0ONzc3pKenG+X/bye0YZWUlGDQoEF9eqyxSdUW2iebbGuwO36n3ft7tKcsbmIQOq1WCwDw9PQUeCQURVH8p9Vq4ezs3OsyMqbP9CGh2traUF5eDkdHx253eveWRqOBp6cnysrKzP7tSKnaQvtkk20tNmMMWq0WI0aMgI1N77uXaY2hUzY2Nobti+gmnZ3YZk6qttA+2WRbg32/NYWOLPJTSRRFUZRw0cRAURRF6UQTA4/J5XK88cYbkMvlZEvEJ5tsMdq085miKIrSidYYKIqiKJ1oYqAoiqJ0oomBoiiK0okmBgNrbGxETEwM/Pz8EBwcjJkzZ6KgoKDXxyxevJi305I+/PDDUCgUUCqViIqKwoULF7os8/333yMiIgITJkxAQEAAXn31VbTxePyitLQ0yGQyHDx4sNv7v/rqK4wbNw6+vr6IjY3t8+FF+mK/8847mDBhApRKJSIjI5GVlcWL6+PjA39/fyiVSiiVSuzevbvb5S5duoRp06Zh/PjxGD9+PPbv32+03dTUhOeffx6+vr4ICgpCXFxcj8syxvDQQw9h8ODBRrvV1dXc61UqlfDz84OdnR1++eUXneUuXbqEKVOmYNy4cQgMDER8fDwaGhqM9o8ePYrQ0FAolUoEBgbi008/7XY5U/y86Wub4uftm2++QVhYGBQKBSIjI5Gbm9vtcqWlpfjd734Hf39/TJgwAVu2bDHa5mKUQTU0NLAjR46wtrY2xhhjW7ZsYVOnTu1x+X379rGEhAQGgNXU1Bjt3/sc+/fvZwqFossy58+fZ4WFhdx4J02axNLS0oy2GWOsqKiIPfDAAywyMpIdOHCgy/1arZa5ubmxq1evMsYYW758OXvllVfMYl+4cIF5eXkxrVbLGGPs888/Z+Hh4bzY3t7e7MKFC70uU1dXx0aNGsUyMzMZY4y1tLQwlUpltP3iiy+y559/nvuZq6io6HHZjRs3soSEBObs7Gy027kNGzaw6OjoLrdfu3aN5ebmMsbaX/O8efPYG2+8YZTV1tbGhgwZwj1vUVERk8vlTKPR6Cxnip83fW1T/Lz98ssvzMXFhV2+fJkxxlhGRgYLCAjodoyhoaHsyy+/5G6rrKw0yr43WmMwsAEDBuCRRx7hDpcRGRnZ4xnmbt26hb/+9a/YtGkTb/69fwmq1epuD9sREhKC0aNHc+NVKpUGnwWvu9ra2pCQkIAtW7b0+JG5r7/+GiEhIRg3bhwA4LnnnsOuXbvMYstkMjQ3N6Ourg4AcOfOHaO/xW5IX3zxBSIjIzF58mQAgK2tLYYNM+6kRXV1dfjkk0/wl7/8hfvf2t3dvdtl8/LycPDgQaxcudIos6c++eQTPPPMM11u9/X1hUKhAND+msPDw3n5ebt3LVuj0cDV1bXL//am+nnTxzbFz1thYSFcXV25o0VHRUWhtLQU58+f11nu+PHjkMvleOKJJ7jbfvWrXxll3xsdEsPINm/ejMcee6zb+xITE/Huu+/C0dGRV/Ppp5/GiRMnALSv8vZWZWUl9u7di6+++spod9OmTZg0aRImTpzY4zKlpaXw9vbmrvv4+KCiogItLS2ws+v7j5s+dnBwMF566SWMGjUKLi4ukMvlyMjI6LPZuaeffhqMMURERGD9+vVdfulfuXIFcrkc0dHRuHnzJhQKBTZu3GjU5FBYWAgXFxf89a9/xbFjx2Bvb48333wTM2bM0FmuubkZiYmJ+OSTT2Bra9tnr6dOnTqFmpoaREdH97pcXV0dtm3bhuTkZKM8mUyG3bt3IzY2FoMGDUJNTQ3279+P/v376yxnip83fW1T/Lz5+vqiuroap06dwoMPPojDhw9Dq9WiuLgYoaGh3HJXrlzBsGHDsGDBAuTn58PHxwcbN27k/iA0Ot7WPSTYX/7yFxYZGcnq6uq63Pfxxx+z5cuXc9fB06ake9uxYwf77W9/2+P9arWahYWFsY0bNxptXbp0iUVGRrK7d+8yxhibOnVqt5tz3nvvPbZkyRLuel1dHbOxsWHNzc0mt2/cuMEiIyPZzz//zBhr38w3adKkPrv3VlJSwhhj7O7du+zVV1/t9n1/4YUXmIeHB7t58yZra2tjK1euZHPnzjXK/c9//sMAsE8//ZQx1r6Z0NXVtctmg9dee41t2LCBMda+6YPvTUnx8fHsT3/6U6/LNDU1sUcffZS98MILRnvNzc1s6tSp7OTJk4wxxrKyspi7uzu7ffu2znKm+HnT1zbVz9v333/PpkyZwkJDQ9ny5cvZhAkT2KFDh3SW2bhxI3NwcOA2OX344Yds4sSJRtsd0cTQxzZs2MAmTpzY4y/7J598knl4eDBvb2/m7e3NADBPT092/vx5XscxYMAAVlVV1eV2jUbDHnjgAfb222/z4nzwwQfM3d2dez1yuZwNGzaMffDBBzrLffnll2zWrFnc9by8PDZy5Eiz2Bs2bGCJiYnc9draWgaANTU1GeV3rry8nDk4OHS5fcOGDWzhwoXc9cuXLxv92m/fvs1sbGxYS0sLd1tYWBj797//rbPc5MmTmZeXF/P29mYjR45kMpmMeXt787KPQ6vVMgcHB247fnfdvXuXxcTEsISEBG5fiDGdO3eO+fr66twWFhbGvvvuO53bTPHzpq9tjp+3xsZGNnjwYHb9+nWd2/fs2cOioqJ0bJlMxv3xZGw0MfShjRs3stDQUPbLL7/o/Rg+1hhqamq4v04YY+zAgQNs5MiRXf6PqNVq2YMPPsjWrl1rlNdbPf3VrtFo2LBhw3R2Br788stmsfft28cmTJjA7Qz85z//yfz8/Iz2amtrdf6327hxo87/KTsqKSlh48aNY2q1mjHG2LvvvsseeeQRo/2ZM2eyI0eOMMba/0p1dXVlN2/e7HF5vtcYtm3b1utfws3NzSw2NpbFx8fzMikw1r4j1cHBgV25coUxxtj169fZkCFDuDW3jkzx86avbaqft/Lycu7fr732GouNje2yTG1tLRs1ahT3c/Dll1+yCRMmGG13RBODgZWVlTEAbPTo0Sw4OJgFBweziIgIxhhja9asYR9++GG3j+NjYiguLmbh4eEsMDCQKRQKNmPGDO6TMs888wy3urlu3TpmZ2fHjS84OJitW7fOKLtz9/5y7vy6Dx06xPz9/dmYMWPYY489xu7cuWMWu2Pzjb+/P1MoFOyBBx5g2dnZRnuFhYVMqVSyoKAgFhgYyObMmcOKiooYY7rvO2OMffbZZywgIIAFBQWx2bNns9LSUl78adOmcf+77927t1u7I74nhgceeIBt375d57Z73/f09HQGgCkUCu7n7bnnnjPa/eKLL7jXHBgYyHbu3NnFZsw0P2/62Kb6eUtISOBeT1xcHPd7o/Pr/vbbb1lwcDBTKBQsKiqKXbx40Wi7IzpWEkVRFKUTfVyVoiiK0okmBoqiKEonmhgoiqIonWhioCiKonSiiYGiKIrSiSYGiqIoSieaGCiKoiidaGKgKIqidKKJgaIoitKJJgaKoihKJ5oYKIqiKJ3+H/ooPvHPgYivAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "figure = evset.plot(\n", " style=\"marker\",\n", @@ -394,10 +927,351 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "id": "37feddd0", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\u001b[33mWARNING: There was an error checking the latest version of pip.\u001b[0m\u001b[33m\n", + "\u001b[0m" + ] + }, + { + "data": { + "application/javascript": [ + "(function(root) {\n", + " function now() {\n", + " return new Date();\n", + " }\n", + "\n", + " const force = true;\n", + "\n", + " if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n", + " root._bokeh_onload_callbacks = [];\n", + " root._bokeh_is_loading = undefined;\n", + " }\n", + "\n", + "const JS_MIME_TYPE = 'application/javascript';\n", + " const HTML_MIME_TYPE = 'text/html';\n", + " const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", + " const CLASS_NAME = 'output_bokeh rendered_html';\n", + "\n", + " /**\n", + " * Render data to the DOM node\n", + " */\n", + " function render(props, node) {\n", + " const script = document.createElement(\"script\");\n", + " node.appendChild(script);\n", + " }\n", + "\n", + " /**\n", + " * Handle when an output is cleared or removed\n", + " */\n", + " function handleClearOutput(event, handle) {\n", + " const cell = handle.cell;\n", + "\n", + " const id = cell.output_area._bokeh_element_id;\n", + " const server_id = cell.output_area._bokeh_server_id;\n", + " // Clean up Bokeh references\n", + " if (id != null && id in Bokeh.index) {\n", + " Bokeh.index[id].model.document.clear();\n", + " delete Bokeh.index[id];\n", + " }\n", + "\n", + " if (server_id !== undefined) {\n", + " // Clean up Bokeh references\n", + " const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n", + " cell.notebook.kernel.execute(cmd_clean, {\n", + " iopub: {\n", + " output: function(msg) {\n", + " const id = msg.content.text.trim();\n", + " if (id in Bokeh.index) {\n", + " Bokeh.index[id].model.document.clear();\n", + " delete Bokeh.index[id];\n", + " }\n", + " }\n", + " }\n", + " });\n", + " // Destroy server and session\n", + " const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", + " cell.notebook.kernel.execute(cmd_destroy);\n", + " }\n", + " }\n", + "\n", + " /**\n", + " * Handle when a new output is added\n", + " */\n", + " function handleAddOutput(event, handle) {\n", + " const output_area = handle.output_area;\n", + " const output = handle.output;\n", + "\n", + " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n", + " if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n", + " return\n", + " }\n", + "\n", + " const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", + "\n", + " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n", + " toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n", + " // store reference to embed id on output_area\n", + " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", + " }\n", + " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", + " const bk_div = document.createElement(\"div\");\n", + " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", + " const script_attrs = bk_div.children[0].attributes;\n", + " for (let i = 0; i < script_attrs.length; i++) {\n", + " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n", + " toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n", + " }\n", + " // store reference to server id on output_area\n", + " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", + " }\n", + " }\n", + "\n", + " function register_renderer(events, OutputArea) {\n", + "\n", + " function append_mime(data, metadata, element) {\n", + " // create a DOM node to render to\n", + " const toinsert = this.create_output_subarea(\n", + " metadata,\n", + " CLASS_NAME,\n", + " EXEC_MIME_TYPE\n", + " );\n", + " this.keyboard_manager.register_events(toinsert);\n", + " // Render to node\n", + " const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", + " render(props, toinsert[toinsert.length - 1]);\n", + " element.append(toinsert);\n", + " return toinsert\n", + " }\n", + "\n", + " /* Handle when an output is cleared or removed */\n", + " events.on('clear_output.CodeCell', handleClearOutput);\n", + " events.on('delete.Cell', handleClearOutput);\n", + "\n", + " /* Handle when a new output is added */\n", + " events.on('output_added.OutputArea', handleAddOutput);\n", + "\n", + " /**\n", + " * Register the mime type and append_mime function with output_area\n", + " */\n", + " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", + " /* Is output safe? */\n", + " safe: true,\n", + " /* Index of renderer in `output_area.display_order` */\n", + " index: 0\n", + " });\n", + " }\n", + "\n", + " // register the mime type if in Jupyter Notebook environment and previously unregistered\n", + " if (root.Jupyter !== undefined) {\n", + " const events = require('base/js/events');\n", + " const OutputArea = require('notebook/js/outputarea').OutputArea;\n", + "\n", + " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", + " register_renderer(events, OutputArea);\n", + " }\n", + " }\n", + " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", + " root._bokeh_timeout = Date.now() + 5000;\n", + " root._bokeh_failed_load = false;\n", + " }\n", + "\n", + " const NB_LOAD_WARNING = {'data': {'text/html':\n", + " \"
\\n\"+\n", + " \"

\\n\"+\n", + " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", + " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", + " \"

\\n\"+\n", + " \"
    \\n\"+\n", + " \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n", + " \"
  • use INLINE resources instead, as so:
  • \\n\"+\n", + " \"
\\n\"+\n", + " \"\\n\"+\n", + " \"from bokeh.resources import INLINE\\n\"+\n", + " \"output_notebook(resources=INLINE)\\n\"+\n", + " \"\\n\"+\n", + " \"
\"}};\n", + "\n", + " function display_loaded() {\n", + " const el = document.getElementById(null);\n", + " if (el != null) {\n", + " el.textContent = \"BokehJS is loading...\";\n", + " }\n", + " if (root.Bokeh !== undefined) {\n", + " if (el != null) {\n", + " el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n", + " }\n", + " } else if (Date.now() < root._bokeh_timeout) {\n", + " setTimeout(display_loaded, 100)\n", + " }\n", + " }\n", + "\n", + " function run_callbacks() {\n", + " try {\n", + " root._bokeh_onload_callbacks.forEach(function(callback) {\n", + " if (callback != null)\n", + " callback();\n", + " });\n", + " } finally {\n", + " delete root._bokeh_onload_callbacks\n", + " }\n", + " console.debug(\"Bokeh: all callbacks have finished\");\n", + " }\n", + "\n", + " function load_libs(css_urls, js_urls, callback) {\n", + " if (css_urls == null) css_urls = [];\n", + " if (js_urls == null) js_urls = [];\n", + "\n", + " root._bokeh_onload_callbacks.push(callback);\n", + " if (root._bokeh_is_loading > 0) {\n", + " console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", + " return null;\n", + " }\n", + " if (js_urls == null || js_urls.length === 0) {\n", + " run_callbacks();\n", + " return null;\n", + " }\n", + " console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", + " root._bokeh_is_loading = css_urls.length + js_urls.length;\n", + "\n", + " function on_load() {\n", + " root._bokeh_is_loading--;\n", + " if (root._bokeh_is_loading === 0) {\n", + " console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n", + " run_callbacks()\n", + " }\n", + " }\n", + "\n", + " function on_error(url) {\n", + " console.error(\"failed to load \" + url);\n", + " }\n", + "\n", + " for (let i = 0; i < css_urls.length; i++) {\n", + " const url = css_urls[i];\n", + " const element = document.createElement(\"link\");\n", + " element.onload = on_load;\n", + " element.onerror = on_error.bind(null, url);\n", + " element.rel = \"stylesheet\";\n", + " element.type = \"text/css\";\n", + " element.href = url;\n", + " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n", + " document.body.appendChild(element);\n", + " }\n", + "\n", + " for (let i = 0; i < js_urls.length; i++) {\n", + " const url = js_urls[i];\n", + " const element = document.createElement('script');\n", + " element.onload = on_load;\n", + " element.onerror = on_error.bind(null, url);\n", + " element.async = false;\n", + " element.src = url;\n", + " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", + " document.head.appendChild(element);\n", + " }\n", + " };\n", + "\n", + " function inject_raw_css(css) {\n", + " const element = document.createElement(\"style\");\n", + " element.appendChild(document.createTextNode(css));\n", + " document.body.appendChild(element);\n", + " }\n", + "\n", + " const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.1.1.min.js\"];\n", + " const css_urls = [];\n", + "\n", + " const inline_js = [ function(Bokeh) {\n", + " Bokeh.set_log_level(\"info\");\n", + " },\n", + "function(Bokeh) {\n", + " }\n", + " ];\n", + "\n", + " function run_inline_js() {\n", + " if (root.Bokeh !== undefined || force === true) {\n", + " for (let i = 0; i < inline_js.length; i++) {\n", + " inline_js[i].call(root, root.Bokeh);\n", + " }\n", + "} else if (Date.now() < root._bokeh_timeout) {\n", + " setTimeout(run_inline_js, 100);\n", + " } else if (!root._bokeh_failed_load) {\n", + " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", + " root._bokeh_failed_load = true;\n", + " } else if (force !== true) {\n", + " const cell = $(document.getElementById(null)).parents('.cell').data().cell;\n", + " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", + " }\n", + " }\n", + "\n", + " if (root._bokeh_is_loading === 0) {\n", + " console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", + " run_inline_js();\n", + " } else {\n", + " load_libs(css_urls, js_urls, function() {\n", + " console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n", + " run_inline_js();\n", + " });\n", + " }\n", + "}(window));" + ], + "application/vnd.bokehjs_load.v0+json": "(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n const el = document.getElementById(null);\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.1.1.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n const cell = $(document.getElementById(null)).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));" + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "text/html": [ + "\n", + "
\n" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "data": { + "application/javascript": [ + "(function(root) {\n", + " function embed_document(root) {\n", + " const docs_json = {\"44c6b85f-9b8f-4b65-b24c-9efd2b909138\":{\"version\":\"3.1.1\",\"title\":\"Bokeh Application\",\"defs\":[],\"roots\":[{\"type\":\"object\",\"name\":\"GridPlot\",\"id\":\"p1165\",\"attributes\":{\"rows\":null,\"cols\":null,\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1164\",\"attributes\":{\"logo\":null,\"tools\":[{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p1155\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1032\",\"attributes\":{\"dimensions\":\"width\"}},{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1092\",\"attributes\":{\"dimensions\":\"width\"}}]}},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p1156\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1033\"},{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1093\"}]}},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p1157\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1034\",\"attributes\":{\"dimensions\":\"width\"}},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1094\",\"attributes\":{\"dimensions\":\"width\"}}]}},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p1158\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1035\",\"attributes\":{\"dimensions\":\"height\"}},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1095\",\"attributes\":{\"dimensions\":\"height\"}}]}},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p1159\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1036\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1037\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1096\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1097\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}}]}},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p1160\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1038\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1098\"}]}},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p1161\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"UndoTool\",\"id\":\"p1039\"},{\"type\":\"object\",\"name\":\"UndoTool\",\"id\":\"p1099\"}]}},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1162\"},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p1163\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"HoverTool\",\"id\":\"p1041\",\"attributes\":{\"renderers\":\"auto\"}},{\"type\":\"object\",\"name\":\"HoverTool\",\"id\":\"p1101\",\"attributes\":{\"renderers\":\"auto\"}}]}}]}},\"toolbar_location\":\"right\",\"children\":[[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1001\",\"attributes\":{\"width\":500,\"height\":150,\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1002\",\"attributes\":{\"js_property_callbacks\":{\"type\":\"map\",\"entries\":[[\"change:start\",[{\"type\":\"object\",\"name\":\"CustomJS\",\"id\":\"p1122\",\"attributes\":{\"args\":{\"type\":\"map\",\"entries\":[[\"p1_x_range\",{\"id\":\"p1002\"}],[\"p2_x_range\",{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1064\",\"attributes\":{\"js_property_callbacks\":{\"type\":\"map\",\"entries\":[[\"change:start\",[{\"id\":\"p1122\"}]],[\"change:end\",[{\"id\":\"p1122\"}]]]}}}]]},\"code\":\"\\n if (cb_obj == p1_x_range) {\\n const start = p1_x_range.start;\\n const end = p1_x_range.end;\\n \\n p2_x_range.start = start;\\n p2_x_range.end = end;\\n \\n }\\n \\n if (cb_obj == p2_x_range) {\\n const start = p2_x_range.start;\\n const end = p2_x_range.end;\\n \\n p1_x_range.start = start;\\n p1_x_range.end = end;\\n \\n }\\n \"}}]],[\"change:end\",[{\"id\":\"p1122\"}]]]}}},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1003\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1014\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1016\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1004\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1059\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1053\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1054\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1055\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAAAA8D8AAAAAAAAAQAAAAAAAAAhAAAAAAAAAEEAAAAAAAAAUQA==\"},\"shape\":[5],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAAAA4D8zMzMzMzPjP5qZmZmZmdk/mpmZmZmZ2T/NzMzMzMzsPw==\"},\"shape\":[5],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1060\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1061\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1056\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1b9e77\"}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1057\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1b9e77\",\"line_alpha\":0.1}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1058\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1b9e77\",\"line_alpha\":0.2}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1007\",\"attributes\":{\"tools\":[{\"id\":\"p1032\"},{\"id\":\"p1033\"},{\"id\":\"p1034\"},{\"id\":\"p1035\"},{\"id\":\"p1036\"},{\"id\":\"p1038\"},{\"id\":\"p1039\"},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1040\"},{\"id\":\"p1041\"}]}},\"toolbar_location\":null,\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1025\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1028\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1027\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1026\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1018\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1021\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1020\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1019\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1024\",\"attributes\":{\"axis\":{\"id\":\"p1018\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1031\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1025\"}}}]}},0,0],[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1062\",\"attributes\":{\"width\":500,\"height\":150,\"x_range\":{\"id\":\"p1064\"},\"y_range\":{\"type\":\"object\",\"name\":\"FactorRange\",\"id\":\"p1073\",\"attributes\":{\"factors\":[\"blue\",\"green\",\"red\"]}},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1075\"},\"y_scale\":{\"type\":\"object\",\"name\":\"CategoricalScale\",\"id\":\"p1077\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1065\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1119\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1113\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1114\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1115\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAAAA8D8AAAAAAAAAQAAAAAAAAAhAAAAAAAAAEEAAAAAAAAAUQA==\"},\"shape\":[5],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":[\"red\",\"blue\",\"red\",\"blue\",\"green\"],\"shape\":[5],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1120\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1121\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1116\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1117\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1118\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1068\",\"attributes\":{\"tools\":[{\"id\":\"p1092\"},{\"id\":\"p1093\"},{\"id\":\"p1094\"},{\"id\":\"p1095\"},{\"id\":\"p1096\"},{\"id\":\"p1098\"},{\"id\":\"p1099\"},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1100\"},{\"id\":\"p1101\"}]}},\"toolbar_location\":null,\"left\":[{\"type\":\"object\",\"name\":\"CategoricalAxis\",\"id\":\"p1086\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"CategoricalTicker\",\"id\":\"p1089\"},\"formatter\":{\"type\":\"object\",\"name\":\"CategoricalTickFormatter\",\"id\":\"p1088\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1087\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1079\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1082\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1081\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1080\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1085\",\"attributes\":{\"axis\":{\"id\":\"p1079\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1091\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1086\"}}}]}},1,0]]}}],\"callbacks\":{\"type\":\"map\"}}};\n", + " const render_items = [{\"docid\":\"44c6b85f-9b8f-4b65-b24c-9efd2b909138\",\"roots\":{\"p1165\":\"e485e37c-f869-44fc-879c-ab34ea07fbda\"},\"root_ids\":[\"p1165\"]}];\n", + " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", + " }\n", + " if (root.Bokeh !== undefined) {\n", + " embed_document(root);\n", + " } else {\n", + " let attempts = 0;\n", + " const timer = setInterval(function(root) {\n", + " if (root.Bokeh !== undefined) {\n", + " clearInterval(timer);\n", + " embed_document(root);\n", + " } else {\n", + " attempts++;\n", + " if (attempts > 100) {\n", + " clearInterval(timer);\n", + " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", + " }\n", + " }\n", + " }, 10, root)\n", + " }\n", + "})(window);" + ], + "application/vnd.bokehjs_exec.v0+json": "" + }, + "metadata": { + "application/vnd.bokehjs_exec.v0+json": { + "id": "p1165" + } + }, + "output_type": "display_data" + } + ], "source": [ "!pip install bokeh -q\n", "\n", @@ -421,10 +1295,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "id": "38ff0e20", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['feature_1', 'feature_2']\n" + ] + } + ], "source": [ "evset = tp.event_set(\n", "\ttimestamps=[0],\n", @@ -450,10 +1332,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "id": "838449d4", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "['feature_1', 'feature_2']" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "evset.moving_sum(window_length=10).schema.feature_names()" ] @@ -473,10 +1366,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 13, "id": "b10fdec3", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "['mult_feature_1_feature_2']" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "(evset[\"feature_1\"] * evset[\"feature_2\"]).schema.feature_names()" ] @@ -497,10 +1401,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 14, "id": "4182d3f8", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['calendar_month']\n" + ] + } + ], "source": [ "date_events = tp.event_set(\n", "\ttimestamps=[\"2020-02-15\", \"2020-06-20\"],\n", @@ -524,10 +1436,87 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 15, "id": "bc36bc1f", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "
\n", + "
\n", + " \n", + " features\n", + " [1]:\n", + " \n", + " renamed_1\n", + " (float64)\n", + "
\n", + "
\n", + " \n", + " indexes\n", + " [0]:\n", + " \n", + " none\n", + "
\n", + "
\n", + " events: \n", + " 1\n", + "
\n", + "
\n", + " index values: \n", + " 1\n", + "
\n", + "
\n", + " memory usage: \n", + " 0.5 kB\n", + "
\n", + "
\n", + "
\n", + " index\n", + " (\n", + " ) with 1 events\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " timestamp\n", + " \n", + " \n", + " \n", + " renamed_1\n", + " \n", + "
\n", + " 0\n", + " \n", + " 0.1\n", + "
\n", + "
\n" + ], + "text/plain": [ + "indexes: []\n", + "features: [('renamed_1', float64)]\n", + "events:\n", + " (1 events):\n", + " timestamps: [0.]\n", + " 'renamed_1': [0.1]\n", + "memory usage: 0.5 kB" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Rename a single feature.\n", "evset[\"feature_1\"].rename(\"renamed_1\")" @@ -535,10 +1524,99 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 16, "id": "a44f6e7a", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "
\n", + "
\n", + " \n", + " features\n", + " [2]:\n", + " \n", + " renamed_1\n", + " (float64)\n", + " , \n", + " renamed_2\n", + " (float64)\n", + "
\n", + "
\n", + " \n", + " indexes\n", + " [0]:\n", + " \n", + " none\n", + "
\n", + "
\n", + " events: \n", + " 1\n", + "
\n", + "
\n", + " index values: \n", + " 1\n", + "
\n", + "
\n", + " memory usage: \n", + " 0.6 kB\n", + "
\n", + "
\n", + "
\n", + " index\n", + " (\n", + " ) with 1 events\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " timestamp\n", + " \n", + " \n", + " \n", + " renamed_1\n", + " \n", + " \n", + " \n", + " renamed_2\n", + " \n", + "
\n", + " 0\n", + " \n", + " 0.1\n", + " \n", + " 0.2\n", + "
\n", + "
\n" + ], + "text/plain": [ + "indexes: []\n", + "features: [('renamed_1', float64), ('renamed_2', float64)]\n", + "events:\n", + " (1 events):\n", + " timestamps: [0.]\n", + " 'renamed_1': [0.1]\n", + " 'renamed_2': [0.2]\n", + "memory usage: 0.6 kB" + ] + }, + "execution_count": 16, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Rename all features.\n", "evset.rename({\"feature_1\": \"renamed_1\", \"feature_2\": \"renamed_2\"})" @@ -546,10 +1624,99 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 17, "id": "3126cbed", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "
\n", + "
\n", + " \n", + " features\n", + " [2]:\n", + " \n", + " prefixed.feature_1\n", + " (float64)\n", + " , \n", + " prefixed.feature_2\n", + " (float64)\n", + "
\n", + "
\n", + " \n", + " indexes\n", + " [0]:\n", + " \n", + " none\n", + "
\n", + "
\n", + " events: \n", + " 1\n", + "
\n", + "
\n", + " index values: \n", + " 1\n", + "
\n", + "
\n", + " memory usage: \n", + " 0.6 kB\n", + "
\n", + "
\n", + "
\n", + " index\n", + " (\n", + " ) with 1 events\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " timestamp\n", + " \n", + " \n", + " \n", + " prefixed.feature_1\n", + " \n", + " \n", + " \n", + " prefixed.feature_2\n", + " \n", + "
\n", + " 0\n", + " \n", + " 0.1\n", + " \n", + " 0.2\n", + "
\n", + "
\n" + ], + "text/plain": [ + "indexes: []\n", + "features: [('prefixed.feature_1', float64), ('prefixed.feature_2', float64)]\n", + "events:\n", + " (1 events):\n", + " timestamps: [0.]\n", + " 'prefixed.feature_1': [0.1]\n", + " 'prefixed.feature_2': [0.2]\n", + "memory usage: 0.6 kB" + ] + }, + "execution_count": 17, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Prefix all features.\n", "evset.prefix(\"prefixed.\")" @@ -570,7 +1737,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "id": "852abbdd", "metadata": {}, "outputs": [], @@ -594,7 +1761,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 19, "id": "f7d85e33", "metadata": {}, "outputs": [], @@ -622,7 +1789,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "id": "e1276be1", "metadata": {}, "outputs": [], @@ -657,7 +1824,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "id": "6c2444ba", "metadata": {}, "outputs": [], @@ -680,10 +1847,110 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 22, "id": "05ee00a7", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "
\n", + "
\n", + " \n", + " features\n", + " [2]:\n", + " \n", + " f1\n", + " (str_)\n", + " , \n", + " f2\n", + " (int32)\n", + "
\n", + "
\n", + " \n", + " indexes\n", + " [0]:\n", + " \n", + " none\n", + "
\n", + "
\n", + " events: \n", + " 2\n", + "
\n", + "
\n", + " index values: \n", + " 1\n", + "
\n", + "
\n", + " memory usage: \n", + " 0.7 kB\n", + "
\n", + "
\n", + "
\n", + " index\n", + " (\n", + " ) with 2 events\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " timestamp\n", + " \n", + " \n", + " \n", + " f1\n", + " \n", + " \n", + " \n", + " f2\n", + " \n", + "
\n", + " 0\n", + " \n", + " 0.5\n", + " \n", + " 1\n", + "
\n", + " 1\n", + " \n", + " 1.1\n", + " \n", + " 2\n", + "
\n", + "
\n" + ], + "text/plain": [ + "indexes: []\n", + "features: [('f1', str_), ('f2', int32)]\n", + "events:\n", + " (2 events):\n", + " timestamps: [0. 1.]\n", + " 'f1': [b'0.5' b'1.1']\n", + " 'f2': [1 2]\n", + "memory usage: 0.7 kB" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "evset.cast({\"f1\": str, \"f2\": tp.int32})" ] @@ -703,7 +1970,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 23, "id": "6deaff88", "metadata": {}, "outputs": [], @@ -734,12 +2001,112 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 24, "id": "2c673b17", "metadata": { "lines_to_next_cell": 0 }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "
\n", + "
\n", + " \n", + " features\n", + " [2]:\n", + " \n", + " add_f1_f3\n", + " (int64)\n", + " , \n", + " add_f2_f4\n", + " (float64)\n", + "
\n", + "
\n", + " \n", + " indexes\n", + " [0]:\n", + " \n", + " none\n", + "
\n", + "
\n", + " events: \n", + " 2\n", + "
\n", + "
\n", + " index values: \n", + " 1\n", + "
\n", + "
\n", + " memory usage: \n", + " 0.7 kB\n", + "
\n", + "
\n", + "
\n", + " index\n", + " (\n", + " ) with 2 events\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " timestamp\n", + " \n", + " \n", + " \n", + " add_f1_f3\n", + " \n", + " \n", + " \n", + " add_f2_f4\n", + " \n", + "
\n", + " 1\n", + " \n", + " 100\n", + " \n", + " 1010\n", + "
\n", + " 10\n", + " \n", + " 101\n", + " \n", + " 1020\n", + "
\n", + "
\n" + ], + "text/plain": [ + "indexes: []\n", + "features: [('add_f1_f3', int64), ('add_f2_f4', float64)]\n", + "events:\n", + " (2 events):\n", + " timestamps: [ 1. 10.]\n", + " 'add_f1_f3': [100 101]\n", + " 'add_f2_f4': [1010. 1020.]\n", + "memory usage: 0.7 kB" + ] + }, + "execution_count": 24, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "evset = tp.event_set(\n", " timestamps=[1, 10],\n", @@ -810,7 +2177,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "id": "f1462eea", "metadata": {}, "outputs": [], @@ -836,10 +2203,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 26, "id": "c67262d9-0a72-41ed-b020-12d95c5d2879", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/plain": [ + "False" + ] + }, + "execution_count": 26, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# This is NOT event-wise comparison, just a python boolean\n", "evset[\"f1\"] == evset[\"f2\"]" @@ -855,10 +2233,95 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 27, "id": "c610a0d0", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "
\n", + "
\n", + " \n", + " features\n", + " [1]:\n", + " \n", + " eq_f1_f3\n", + " (bool_)\n", + "
\n", + "
\n", + " \n", + " indexes\n", + " [0]:\n", + " \n", + " none\n", + "
\n", + "
\n", + " events: \n", + " 2\n", + "
\n", + "
\n", + " index values: \n", + " 1\n", + "
\n", + "
\n", + " memory usage: \n", + " 0.5 kB\n", + "
\n", + "
\n", + "
\n", + " index\n", + " (\n", + " ) with 2 events\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " timestamp\n", + " \n", + " \n", + " \n", + " eq_f1_f3\n", + " \n", + "
\n", + " 1\n", + " \n", + " False\n", + "
\n", + " 10\n", + " \n", + " False\n", + "
\n", + "
\n" + ], + "text/plain": [ + "indexes: []\n", + "features: [('eq_f1_f3', bool_)]\n", + "events:\n", + " (2 events):\n", + " timestamps: [ 1. 10.]\n", + " 'eq_f1_f3': [False False]\n", + "memory usage: 0.5 kB" + ] + }, + "execution_count": 27, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# Works element-wise as expected\n", "evset[\"f1\"].equal(evset[\"f3\"])" @@ -919,7 +2382,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 28, "id": "1415ede1-3fbc-43d7-94e6-dd5d5ec93bbb", "metadata": {}, "outputs": [], @@ -953,12 +2416,142 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "id": "58fe7d8e", "metadata": { "lines_to_next_cell": 0 }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "
\n", + "
\n", + " \n", + " features\n", + " [4]:\n", + " \n", + " f1\n", + " (int64)\n", + " , \n", + " f2\n", + " (float64)\n", + " , \n", + " f3\n", + " (int64)\n", + " , \n", + " f4\n", + " (float64)\n", + "
\n", + "
\n", + " \n", + " indexes\n", + " [0]:\n", + " \n", + " none\n", + "
\n", + "
\n", + " events: \n", + " 2\n", + "
\n", + "
\n", + " index values: \n", + " 1\n", + "
\n", + "
\n", + " memory usage: \n", + " 0.9 kB\n", + "
\n", + "
\n", + "
\n", + " index\n", + " (\n", + " ) with 2 events\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " timestamp\n", + " \n", + " \n", + " \n", + " f1\n", + " \n", + " \n", + " \n", + " f2\n", + " \n", + " \n", + " \n", + " f3\n", + " \n", + " \n", + " \n", + " f4\n", + " \n", + "
\n", + " 1\n", + " \n", + " 0\n", + " \n", + " 100\n", + " \n", + " 1000\n", + " \n", + " 1e+04\n", + "
\n", + " 10\n", + " \n", + " 10\n", + " \n", + " 200\n", + " \n", + " 1000\n", + " \n", + " 1e+04\n", + "
\n", + "
\n" + ], + "text/plain": [ + "indexes: []\n", + "features: [('f1', int64), ('f2', float64), ('f3', int64), ('f4', float64)]\n", + "events:\n", + " (2 events):\n", + " timestamps: [ 1. 10.]\n", + " 'f1': [ 0 10]\n", + " 'f2': [100. 200.]\n", + " 'f3': [1000 1000]\n", + " 'f4': [10000. 10000.]\n", + "memory usage: 0.9 kB" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "evset * 10" ] @@ -990,7 +2583,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 30, "id": "087b6fd6", "metadata": { "lines_to_next_cell": 0 @@ -1031,7 +2624,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 31, "id": "df3bbc7d", "metadata": { "lines_to_next_cell": 0 @@ -1107,12 +2700,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 32, "id": "54a71cae", "metadata": { "lines_to_next_cell": 0 }, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA/UAAAEhCAYAAAA+i4DpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABdIUlEQVR4nO3de3Rb1Zk3/u+RdTmSLR3HVymJndR1SEjsOglQrqFcM7TTxYRSBlooCZQCvynDKqx22nTSQuBdTafcCrxl4KWZhDYdmpRbKUMplwYSBoamQIBMgJKrHWL5FluSbd11fn/IPrawHeLEls7x8/2sldXaOpa38s0xfrT3frai67oOIiIiIiIiIrIcW6EHQERERERERERHh0U9ERERERERkUWxqCciIiIiIiKyKBb1RERERERERBbFop6IiIiIiIjIoljUExEREREREVkUi3oiIiIiIiIii2JRT0RERERERGRRLOqJiIiIiIiILIpFPRERkVAnnngiXn755aP++pdffhnPPffcuL/uP/7jP9DY2Ai73Y6f//znR/39iYiIiEU9ERHRlJFKpfL6/Y62qD/hhBOwadMmfP3rX5+EUREREcnCop6IiMjkFEXBqlWrsGjRIhx33HH4zW9+k/PYLbfcgpNOOgkrV65Ee3s7vvKVr6CxsRENDQ146KGHjGtfe+01LFy4EA0NDbjqqqty3gQ466yz8NRTTxkff/WrX8X69esBAKFQCNdccw0aGhrQ1NSEq6++Gtu3b8eDDz6I3/zmN1i4cCFuu+22I349TU1NOP7442Gz8dcQIiKiY2Uv9ACIiIjo0ymKgrfffht79uzBiSeeiNNPPx2zZ88GABQVFWHbtm0AgEsvvRRz587FE088gfb2dpxwwgloamrC4sWLcemll2LdunU477zz8PzzzxtF+6f5zne+A7fbjXfffRc2mw0dHR2orKzE9ddfj56enpwl9EuWLEEkEhn1ed58800UFRUdy18DERERfQKLeiIiIgu45pprAAB1dXU488wzsWXLFqOov/rqq43rXnzxRbz55psAgKqqKnzlK1/Biy++CI/HA7vdjvPOOw8AsHTpUtTV1R3R937mmWfwxhtvGDPrlZWVY167devWcb82IiIiOnos6omIiCxIURTj/5eUlBzRdYd7zG63I51OGx/HYrGjGhdn6omIiPKLm9mIiIgs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+Q0WLlyI22677Yhfzxe/+EW43W4AQGNjI3RdR0dHx1H+7RAREclmL/QAiIiI6NMpioK3334be/bswYknnojTTz8ds2fPBgAUFRVh27ZtAIBLL70Uc+fOxRNPPIH29naccMIJaGpqwuLFi3HppZdi3bp1OO+88/D8888bRfun+c53vgO32413330XNpsNHR0dqKysxPXXX4+enh78/Oc/N65dsmQJIpHIqM/z5ptvoqioKOdz69atQ11dHWbNmjXuvxMiIiJiUU9ERGQJ11xzDQCgrq4OZ555JrZs2WIU9VdffbVx3Ysvvog333wTAFBVVYWvfOUrePHFF+HxeGC323HeeecBAJYuXYq6uroj+t7PPPMM3njjDdhs2QV+lZWVY167devWI35NL730ElavXo0XXngBiqIc8dcRERHREBb1REREFjS8CC4pKTmi6w73mN1uRzqdNj6OxWJHNa4jnal/5ZVXcNVVV+EPf/gD5s6de1Tfi4iIiLinnoiIyBLWrVsHANi3bx+2bt2KJUuWjHrdeeedh4cffhgA0NHRgSeeeALnn38+5s2bh1Qqhc2bNwPIzujv3r3b+Lr6+nq88cYbAIC9e/fi1VdfNR678MILceeddyKTyRjPCwA+nw+hUCjn+2/duhXbt28f9c9gQb9lyxZ84xvfwO9//3s0NTUd898NERGRZCzqiYiILCCdTmPRokVYunQp7rvvPmPp/Sfdd999eP/999HY2Iizzz4b//qv/4qTTz4ZTqcTGzduxE033YTGxkb853/+Z05B/S//8i/YvHkzGhsbsXLlSpx88snGY/fccw/i8TgaGxuxcOFC/PCHPwQAXHTRRdi+ffu4G+V985vfRDwex1VXXYWFCxdi4cKFeO+9947uL4aIiEg4Rdd1vdCDICIiorEpioLu7m6UlpYWeihERERkMpypJyIiIiIiIrIoNsojIiIyOS6qIyIiorFwpp6IiIiIiIjIoljUExEREREREVkUi3oiIiIiIiIii+Ke+gGZTAYHDx6E1+uFoiiFHg4REREREREVkK7riEQimD59Omw2886Hs6gfcPDgQdTU1BR6GERERERERGQiLS0tmDlzZqGHMSYW9QO8Xi+AbGA+n6/Aoxnbzp07MX/+/EIPg/KAWcvCvOVg1rIwbzmYtRzMWo5wOIyamhqjVjQrRTf5OTnr1q3D1Vdf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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "daily_sales = tp.event_set(\n", "\ttimestamps=[\"2020-01-01\", \"2020-01-01\", \"2020-01-02\", \"2020-01-02\"],\n", @@ -1140,7 +2744,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 33, "id": "2c87a680", "metadata": { "lines_to_next_cell": 2 @@ -1179,7 +2783,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 34, "id": "8badbebf", "metadata": {}, "outputs": [], @@ -1210,12 +2814,176 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 35, "id": "479096c3", "metadata": { "lines_to_next_cell": 2 }, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "
\n", + "
\n", + " \n", + " features\n", + " [1]:\n", + " \n", + " sale\n", + " (float64)\n", + "
\n", + "
\n", + " \n", + " indexes\n", + " [2]:\n", + " \n", + " product\n", + " (int64)\n", + " , \n", + " store\n", + " (int64)\n", + "
\n", + "
\n", + " events: \n", + " 4\n", + "
\n", + "
\n", + " index values: \n", + " 3\n", + "
\n", + "
\n", + " memory usage: \n", + " 1.2 kB\n", + "
\n", + "
\n", + "
\n", + " index\n", + " (\n", + " product: \n", + " 1\n", + " , \n", + " store: \n", + " 1\n", + " ) with 2 events\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " timestamp\n", + " \n", + " \n", + " \n", + " sale\n", + " \n", + "
\n", + " 2020-01-01 00:00:00+00:00\n", + " \n", + " 100\n", + "
\n", + " 2020-01-02 00:00:00+00:00\n", + " \n", + " 110\n", + "
\n", + "
\n", + " index\n", + " (\n", + " product: \n", + " 2\n", + " , \n", + " store: \n", + " 1\n", + " ) with 1 events\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " timestamp\n", + " \n", + " \n", + " \n", + " sale\n", + " \n", + "
\n", + " 2020-01-01 00:00:00+00:00\n", + " \n", + " 200\n", + "
\n", + "
\n", + " index\n", + " (\n", + " product: \n", + " 2\n", + " , \n", + " store: \n", + " 2\n", + " ) with 1 events\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " timestamp\n", + " \n", + " \n", + " \n", + " sale\n", + " \n", + "
\n", + " 2020-01-02 00:00:00+00:00\n", + " \n", + " 300\n", + "
\n", + "
\n" + ], + "text/plain": [ + "indexes: [('product', int64), ('store', int64)]\n", + "features: [('sale', float64)]\n", + "events:\n", + " product=1 store=1 (2 events):\n", + " timestamps: ['2020-01-01T00:00:00' '2020-01-02T00:00:00']\n", + " 'sale': [100. 110.]\n", + " product=2 store=1 (1 events):\n", + " timestamps: ['2020-01-01T00:00:00']\n", + " 'sale': [200.]\n", + " product=2 store=2 (1 events):\n", + " timestamps: ['2020-01-02T00:00:00']\n", + " 'sale': [300.]\n", + "memory usage: 1.2 kB" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "sales_per_product_store = daily_sales.add_index([\"product\", \"store\"])\n", "sales_per_product_store" @@ -1237,7 +3005,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 36, "id": "4df0d8cf", "metadata": { "lines_to_next_cell": 0 @@ -1263,7 +3031,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 38, "id": "8d9448a2", "metadata": { "lines_to_next_cell": 0 @@ -1271,7 +3039,7 @@ "outputs": [], "source": [ "# Weekly sales by store (including all products)\n", - "per_store_weekly = per_week.drop_index(\"product\", keep=False).moving_sum(tp.duration.weeks(1))" + "per_store_weekly = per_product_weekly.drop_index(\"product\", keep=False).moving_sum(tp.duration.weeks(1))" ] }, { @@ -1291,7 +3059,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 39, "id": "4e12a9e0", "metadata": { "lines_to_next_cell": 0 @@ -1327,10 +3095,83 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 40, "id": "c07453fa", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "
\n", + "
\n", + " \n", + " features\n", + " [0]:\n", + " \n", + " none\n", + "
\n", + "
\n", + " \n", + " indexes\n", + " [0]:\n", + " \n", + " none\n", + "
\n", + "
\n", + " events: \n", + " 2\n", + "
\n", + "
\n", + " index values: \n", + " 1\n", + "
\n", + "
\n", + " memory usage: \n", + " 416 B\n", + "
\n", + "
\n", + "
\n", + " index\n", + " (\n", + " ) with 2 events\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " timestamp\n", + " \n", + "
\n", + " 9\n", + "
\n", + " 19\n", + "
\n", + "
\n" + ], + "text/plain": [ + "indexes: []\n", + "features: []\n", + "events:\n", + " (2 events):\n", + " timestamps: [ 9. 19.]\n", + " \n", + "memory usage: 416 B" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "a = tp.event_set(timestamps=[10, 20])\n", "b = a.leak(1)\n", @@ -1349,20 +3190,36 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 41, "id": "ab15c133", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "False\n" + ] + } + ], "source": [ "print(tp.has_leak(a.node()))" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 42, "id": "cd455fc1", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "True\n" + ] + } + ], "source": [ "print(tp.has_leak(b.node()))" ] @@ -1385,17 +3242,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 43, "id": "7da63117", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.194430Z", - "iopub.status.busy": "2023-07-24T15:01:00.194277Z", - "iopub.status.idle": "2023-07-24T15:01:00.198829Z", - "shell.execute_reply": "2023-07-24T15:01:00.198424Z" + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "IndexData(features=[array([0.1, 0.2, 0.3])], timestamps=array([1., 2., 3.]))" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" } - }, - "outputs": [], + ], "source": [ "evset = tp.event_set(\n", "\ttimestamps=[1, 2, 3, 5, 6],\n", @@ -1474,10 +3335,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 44, "id": "da239494", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "WARNING:root:Feature \"f2\" is an array of numpy.object_ and will be casted to numpy.string_ (Note: numpy.string_ is equivalent to numpy.bytes_).\n" + ] + } + ], "source": [ "df = pd.DataFrame({\n", " \"timestamp\": [1, 2, 3, 5, 6],\n", @@ -1511,10 +3380,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 45, "id": "d5405837-c801-40e9-8b41-4d4dc901d429", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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Hu+99x6A80eyHD9+vMXREnb5PkDn1AsAID8/H9u2bUNFRQV+/OMfo3v37iguLkZeXh4mT56MyZMnY9myZfjss89QW1vrf1mhadOm4cknn7R4ensz0+ahhx7CV199hfT0dHTq1AkxMTFYvny51aPb3okTJ/DLX/4SycnJuPnmmwEAkZGR+Pe//42nnnoK/fr102kQFqmursa0adNQV1eHiIgI9OnTB1u3boXD4Wj22ElOTsbChQsxZswYAMC4ceOQn59v8fT2ZraNy+XCr3/9a4wePRoRERHo378/VqxYYfX4Yenif8/eeustbNy4EWlpaf7Fy5gxY/CnP/3J4inD08Vt7rrrLuzevRsjRoxAZGQkunbtirVr11o9oq1VVlZi6tSp+O6772AYBpKTk7F69WoAaPbvmVhj+fLluP/++zFv3jxERESgoKAA/fv3t+X3AQ7DMAyrhxARERERERGRttPh9yIiIiIiIiIhSot6ERERERERkRClRb2IiIiIiIhIiNKiXkRERERERCREaVEvIiIiIiIiEqK0qBcREREREREJUVrUi4iIiIiIiIQoLepFREREREREQpQW9SIiIiIiIiIhSot6ERERERERkRClRb2IiIiIiIhIiPr/n9DMo7mF+w8AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Eager mode\n", "#\n", @@ -1525,10 +3405,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 46, "id": "9c854408-0804-4435-8d44-f521ef1b379e", "metadata": {}, - "outputs": [], + "outputs": [ + { + "data": { + "image/png": "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Hu+99x6A80eyHD9+vMXREnb5PkDn1AsAID8/H9u2bUNFRQV+/OMfo3v37iguLkZeXh4mT56MyZMnY9myZfjss89QW1vrf1mhadOm4cknn7R4ensz0+ahhx7CV199hfT0dHTq1AkxMTFYvny51aPb3okTJ/DLX/4SycnJuPnmmwEAkZGR+Pe//42nnnoK/fr102kQFqmursa0adNQV1eHiIgI9OnTB1u3boXD4Wj22ElOTsbChQsxZswYAMC4ceOQn59v8fT2ZraNy+XCr3/9a4wePRoRERHo378/VqxYYfX4Yenif8/eeustbNy4EWlpaf7Fy5gxY/CnP/3J4inD08Vt7rrrLuzevRsjRoxAZGQkunbtirVr11o9oq1VVlZi6tSp+O6772AYBpKTk7F69WoAaPbvmVhj+fLluP/++zFv3jxERESgoKAA/fv3t+X3AQ7DMAyrhxARERERERGRttPh9yIiIiIiIiIhSot6ERERERERkRClRb2IiIiIiIhIiNKiXkRERERERCREaVEvIiIiIiIiEqK0qBcREREREREJUVrUi4iIiIiIiIQoLepFREREREREQpQW9SIiIiIiIiIhSot6ERERERERkRClRb2IiIiIiIhIiPr/n9DMo7mF+w8AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Graph mode with @tp.compile\n", "\n", @@ -1546,10 +3437,34 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 47, "id": "e4aa008f-aa8e-486f-a96c-854fb5b2bd83", "metadata": {}, - "outputs": [], + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Build schedule\n", + "Run 4 operators\n", + " 1 / 4: SELECT [0.00007 s]\n", + " 2 / 4: SIMPLE_MOVING_AVERAGE [0.00008 s]\n", + " 3 / 4: SIMPLE_MOVING_AVERAGE [0.00003 s]\n", + " 4 / 4: SUBTRACTION [0.00005 s]\n", + "Execution in 0.00075 s\n" + ] + }, + { + "data": { + "image/png": "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Hu+99x6A80eyHD9+vMXREnb5PkDn1AsAID8/H9u2bUNFRQV+/OMfo3v37iguLkZeXh4mT56MyZMnY9myZfjss89QW1vrf1mhadOm4cknn7R4ensz0+ahhx7CV199hfT0dHTq1AkxMTFYvny51aPb3okTJ/DLX/4SycnJuPnmmwEAkZGR+Pe//42nnnoK/fr102kQFqmursa0adNQV1eHiIgI9OnTB1u3boXD4Wj22ElOTsbChQsxZswYAMC4ceOQn59v8fT2ZraNy+XCr3/9a4wePRoRERHo378/VqxYYfX4Yenif8/eeustbNy4EWlpaf7Fy5gxY/CnP/3J4inD08Vt7rrrLuzevRsjRoxAZGQkunbtirVr11o9oq1VVlZi6tSp+O6772AYBpKTk7F69WoAaPbvmVhj+fLluP/++zFv3jxERESgoKAA/fv3t+X3AQ7DMAyrhxARERERERGRttPh9yIiIiIiIiIhSot6ERERERERkRClRb2IiIiIiIhIiNKiXkRERERERCREaVEvIiIiIiIiEqK0qBcREREREREJUVrUi4iIiIiIiIQoLepFREREREREQpQW9SIiIiIiIiIhSot6ERERERERkRClRb2IiIiIiIhIiPr/n9DMo7mF+w8AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], "source": [ "# Graph mode without @tp.compile\n", "\n", @@ -1572,9 +3487,7 @@ "attachments": {}, "cell_type": "markdown", "id": "6f961cee-c813-46b8-bf49-cecd95916b31", - "metadata": { - "jp-MarkdownHeadingCollapsed": true - }, + "metadata": {}, "source": [ "## More on graph mode\n", "\n", @@ -1598,26 +3511,18 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 50, "id": "dd4142a0-df47-4ca3-aafe-7a105b4f2deb", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:00:57.631693Z", - "iopub.status.busy": "2023-07-24T15:00:57.631532Z", - "iopub.status.idle": "2023-07-24T15:00:57.636094Z", - "shell.execute_reply": "2023-07-24T15:00:57.635717Z" - } - }, + "metadata": {}, "outputs": [], "source": [ - "input_node = tp.input_node([(\"value\", tp.float64)])\n", - "result_1_node = input_node.simple_moving_average(window_length=0.5)\n", - "result_2_node = input_node.simple_moving_average(window_length=1.0)\n", + "input_node = tp.input_node([(\"f1\", tp.float64), (\"f2\", tp.str_)])\n", + "feat_1_node = input_node[\"f1\"]\n", + "result_1_node = feat_1_node.simple_moving_average(window_length=2)\n", + "result_2_node = feat_1_node.simple_moving_average(window_length=4)\n", "result_3_node = result_1_node - result_2_node\n", "\n", - "result = tp.run([result_1_node,result_2_node, result_3_node], {input_node: evset})\n", - " \n", - "print(result)" + "result = tp.run([result_1_node,result_2_node, result_3_node], {input_node: evset})" ] }, { @@ -1645,16 +3550,9 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 51, "id": "b0b0220b-9869-454c-8f3b-afeabaca06bc", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:00:57.638508Z", - "iopub.status.busy": "2023-07-24T15:00:57.638232Z", - "iopub.status.idle": "2023-07-24T15:00:57.642016Z", - "shell.execute_reply": "2023-07-24T15:00:57.641623Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "@tp.compile\n", @@ -1683,16 +3581,9 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 52, "id": "945d8f39-18ad-44df-a4d2-9d8986e7825b", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:00:57.644118Z", - "iopub.status.busy": "2023-07-24T15:00:57.643976Z", - "iopub.status.idle": "2023-07-24T15:00:57.646561Z", - "shell.execute_reply": "2023-07-24T15:00:57.646187Z" - } - }, + "metadata": {}, "outputs": [], "source": [ "@tp.compile\n", @@ -1713,17 +3604,19 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 53, "id": "941a5fc4-edfc-4fba-8bc8-22f3a7387e91", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:00:57.648616Z", - "iopub.status.busy": "2023-07-24T15:00:57.648475Z", - "iopub.status.idle": "2023-07-24T15:00:57.651921Z", - "shell.execute_reply": "2023-07-24T15:00:57.651456Z" + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[('a_branch', float64)]\n", + "[('non_a_branch', float64)]\n" + ] } - }, - "outputs": [], + ], "source": [ "@tp.compile\n", "def my_function(x : tp.types.EventSetOrNode, a:bool) -> tp.types.EventSetOrNode:\n", @@ -1748,17 +3641,95 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 54, "id": "a9ab68f3-91a6-445e-99c2-7f2379185f21", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:00:57.654090Z", - "iopub.status.busy": "2023-07-24T15:00:57.653930Z", - "iopub.status.idle": "2023-07-24T15:00:57.658773Z", - "shell.execute_reply": "2023-07-24T15:00:57.658419Z" + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "
\n", + "
\n", + " \n", + " features\n", + " [1]:\n", + " \n", + " value\n", + " (int64)\n", + "
\n", + "
\n", + " \n", + " indexes\n", + " [0]:\n", + " \n", + " none\n", + "
\n", + "
\n", + " events: \n", + " 2\n", + "
\n", + "
\n", + " index values: \n", + " 1\n", + "
\n", + "
\n", + " memory usage: \n", + " 0.5 kB\n", + "
\n", + "
\n", + "
\n", + " index\n", + " (\n", + " ) with 2 events\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " timestamp\n", + " \n", + " \n", + " \n", + " value\n", + " \n", + "
\n", + " 1\n", + " \n", + " 10\n", + "
\n", + " 2\n", + " \n", + " 11\n", + "
\n", + "
\n" + ], + "text/plain": [ + "indexes: []\n", + "features: [('value', int64)]\n", + "events:\n", + " (2 events):\n", + " timestamps: [1. 2.]\n", + " 'value': [10 11]\n", + "memory usage: 0.5 kB" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" } - }, - "outputs": [], + ], "source": [ "@tp.compile\n", "def my_function(x : tp.types.EventSetOrNode) -> tp.types.EventSetOrNode:\n", @@ -1817,15 +3788,9 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 55, "id": "d4fc33b0", "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:00:57.661104Z", - "iopub.status.busy": "2023-07-24T15:00:57.660955Z", - "iopub.status.idle": "2023-07-24T15:00:57.664631Z", - "shell.execute_reply": "2023-07-24T15:00:57.664234Z" - }, "lines_to_next_cell": 0 }, "outputs": [], @@ -1873,17 +3838,103 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 56, "id": "56a28657", - "metadata": { - "execution": { - "iopub.execute_input": "2023-07-24T15:01:00.214709Z", - "iopub.status.busy": "2023-07-24T15:01:00.214556Z", - "iopub.status.idle": "2023-07-24T15:01:00.222789Z", - "shell.execute_reply": "2023-07-24T15:01:00.222432Z" + "metadata": {}, + "outputs": [ + { + "data": { + "text/html": [ + "
\n", + "
\n", + "
\n", + " \n", + " features\n", + " [1]:\n", + " \n", + " count\n", + " (int32)\n", + "
\n", + "
\n", + " \n", + " indexes\n", + " [0]:\n", + " \n", + " none\n", + "
\n", + "
\n", + " events: \n", + " 3\n", + "
\n", + "
\n", + " index values: \n", + " 1\n", + "
\n", + "
\n", + " memory usage: \n", + " 0.5 kB\n", + "
\n", + "
\n", + "
\n", + " index\n", + " (\n", + " ) with 3 events\n", + "
\n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + " \n", + "
\n", + " \n", + " timestamp\n", + " \n", + " \n", + " \n", + " count\n", + " \n", + "
\n", + " 1\n", + " \n", + " 1\n", + "
\n", + " 2\n", + " \n", + " 1\n", + "
\n", + " 3\n", + " \n", + " 1\n", + "
\n", + "
\n" + ], + "text/plain": [ + "indexes: []\n", + "features: [('count', int32)]\n", + "events:\n", + " (3 events):\n", + " timestamps: [1. 2. 3.]\n", + " 'count': [1 1 1]\n", + "memory usage: 0.5 kB" + ] + }, + "execution_count": 56, + "metadata": {}, + "output_type": "execute_result" } - }, - "outputs": [], + ], "source": [ "# Define a graph.\n", "evset = tp.event_set(\n", @@ -1907,6 +3958,14 @@ "# Run data on the restored graph.\n", "tp.run(loaded_outputs[\"output_b\"], {loaded_inputs[\"input_a\"]: evset})" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "942b9568-9cd2-455a-b750-1bd877d0fcf1", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { From 6d3484a192c278bfdd2bf0e8d80c7d5645c61fa4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Braulio=20R=C3=ADos?= Date: Thu, 26 Oct 2023 19:21:33 -0300 Subject: [PATCH 5/9] Typos and broken links fixes --- docs/src/getting_started.ipynb | 173 +- docs/src/recipes/aggregate_calendar.ipynb | 5 +- docs/src/recipes/aggregate_interval.ipynb | 2 +- docs/src/user_guide.ipynb | 2287 +-------------------- 4 files changed, 101 insertions(+), 2366 deletions(-) diff --git a/docs/src/getting_started.ipynb b/docs/src/getting_started.ipynb index 231af61d3..b01eebab9 100644 --- a/docs/src/getting_started.ipynb +++ b/docs/src/getting_started.ipynb @@ -50,7 +50,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "c71dc843", "metadata": {}, "outputs": [], @@ -70,178 +70,23 @@ "\n", "The most basic unit of data in Temporian is an **event**. An event consists of a timestamp and a set of feature values.\n", "\n", - "Events are not handled individually. Instead, events are grouped together into an **[`EventSet`][temporian.EventSet]**.\n", + "Events are not handled individually. Instead, events are grouped together into an **`EventSet`**.\n", "\n", - "[`EventSets`][temporian.EventSet] are the main data structure in Temporian, and represent **[multivariate and multi-index time sequences](../user_guide/#what-is-temporal-data)**. Let's break that down:\n", + "`EventSets` are the main data structures in Temporian, and represent **[multivariate and multi-index time sequences](../user_guide/#what-is-temporal-data)**. Let's break that down:\n", "\n", "- \"multivariate\" indicates that each event in the time sequence holds several feature values.\n", "- \"multi-index\" indicates that the events can represent hierarchical data, and be therefore grouped by one or more of their features' values.\n", "- \"sequence\" indicates that the events are not necessarily sampled at a uniform rate (in which case we would call it a time \"series\").\n", "\n", - "You can create an [`EventSet`][temporian.EventSet] from a pandas DataFrame, NumPy arrays, CSV files, and more. Here is an example of an [`EventSet`][temporian.EventSet] containing four events and three features (one of which is used as an `index`):" + "You can create an `EventSet` from a pandas DataFrame, NumPy arrays, CSV files, and more. Here is an example containing four events and three features (one of which is used as an `index`):" ] }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "46ebad7f-f4b4-4850-bc12-8552e55a3f6b", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "
\n", - "
\n", - " \n", - " features\n", - " [2]:\n", - " \n", - " feature_1\n", - " (float64)\n", - " , \n", - " feature_3\n", - " (float64)\n", - "
\n", - "
\n", - " \n", - " indexes\n", - " [1]:\n", - " \n", - " feature_2\n", - " (str_)\n", - "
\n", - "
\n", - " events: \n", - " 4\n", - "
\n", - "
\n", - " index values: \n", - " 2\n", - "
\n", - "
\n", - " memory usage: \n", - " 1.1 kB\n", - "
\n", - "
\n", - "
\n", - " index\n", - " (\n", - " feature_2: \n", - " blue\n", - " ) with 2 events\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - " \n", - " timestamp\n", - " \n", - " \n", - " \n", - " feature_1\n", - " \n", - " \n", - " \n", - " feature_3\n", - " \n", - "
\n", - " 2023-02-06 00:00:00+00:00\n", - " \n", - " 0.6\n", - " \n", - " -1\n", - "
\n", - " 2023-02-07 00:00:00+00:00\n", - " \n", - " 0.9\n", - " \n", - " 5\n", - "
\n", - "
\n", - " index\n", - " (\n", - " feature_2: \n", - " red\n", - " ) with 2 events\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - " \n", - " timestamp\n", - " \n", - " \n", - " \n", - " feature_1\n", - " \n", - " \n", - " \n", - " feature_3\n", - " \n", - "
\n", - " 2023-02-04 00:00:00+00:00\n", - " \n", - " 0.5\n", - " \n", - " 10\n", - "
\n", - " 2023-02-07 00:00:00+00:00\n", - " \n", - " nan\n", - " \n", - " 5\n", - "
\n", - "
\n" - ], - "text/plain": [ - "indexes: [('feature_2', str_)]\n", - "features: [('feature_1', float64), ('feature_3', float64)]\n", - "events:\n", - " feature_2=b'blue' (2 events):\n", - " timestamps: ['2023-02-06T00:00:00' '2023-02-07T00:00:00']\n", - " 'feature_1': [0.6 0.9]\n", - " 'feature_3': [-1. 5.]\n", - " feature_2=b'red' (2 events):\n", - " timestamps: ['2023-02-04T00:00:00' '2023-02-07T00:00:00']\n", - " 'feature_1': [0.5 nan]\n", - " 'feature_3': [10. 5.]\n", - "memory usage: 1.1 kB" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "evset = tp.event_set(\n", " timestamps=[\"2023-02-04\", \"2023-02-06\", \"2023-02-07\", \"2023-02-07\"],\n", @@ -260,11 +105,11 @@ "id": "effc4483-9a1a-4e21-b376-3ed188ced821", "metadata": {}, "source": [ - "An [`EventSet`][temporian.EventSet] can hold one or several time sequences, depending on what its **[index](../user_guide/#index-horizontal-and-vertical-operators)** is.\n", + "An `EventSet` can hold one or several time sequences, depending on what its `index` is.\n", "\n", - "If the [`EventSet`][temporian.EventSet] has no index, it will hold a single multivariate time sequence, which means that all events will be considered part of the same group and will interact with each other when operators are applied to the [`EventSet`][temporian.EventSet].\n", + "If it has no index, it will hold a single multivariate time sequence, which means that all events will be considered part of the same group and will interact with each other when operators are applied.\n", "\n", - "If the [`EventSet`][temporian.EventSet] has one (or many) indexes, its events will be grouped by their indexes' values, so it will hold one multivariate time sequence for each unique value (or unique combination of values) of its indexes, and most operators applied to the [`EventSet`][temporian.EventSet] will be applied to each time sequence independently.\n", + "If it has one (or many) indexes, its events will be grouped by their `indexes` values, so it will hold one multivariate time sequence for each unique value (or unique combination of values) of its indexes, and operators will be applied to each time sequence independently.\n", "\n", "See the last part of this tutorial to see some examples using `indexes` and operators." ] diff --git a/docs/src/recipes/aggregate_calendar.ipynb b/docs/src/recipes/aggregate_calendar.ipynb index 8ed5fb961..ab98a86b3 100644 --- a/docs/src/recipes/aggregate_calendar.ipynb +++ b/docs/src/recipes/aggregate_calendar.ipynb @@ -65,7 +65,7 @@ "metadata": {}, "source": [ "## Solution\n", - "We want to calculate every month, the accumulated sales from the last 2 months. So this is what we can do:\n", + "We want to calculate for every month, the accumulated sales from the last 2 months. So this is what we can do:\n", "1. Create a tick on the first day of every month.\n", "1. Use a `moving_sum` with variable window length, at each tick covering the duration since the last 2 months.\n", "\n", @@ -173,8 +173,7 @@ "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.4" + "pygments_lexer": "ipython3" } }, "nbformat": 4, diff --git a/docs/src/recipes/aggregate_interval.ipynb b/docs/src/recipes/aggregate_interval.ipynb index f63ede092..e0693f214 100644 --- a/docs/src/recipes/aggregate_interval.ipynb +++ b/docs/src/recipes/aggregate_interval.ipynb @@ -165,7 +165,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.4" + "version": "3.10.13" } }, "nbformat": 4, diff --git a/docs/src/user_guide.ipynb b/docs/src/user_guide.ipynb index b10f4cccd..ca7602e5a 100644 --- a/docs/src/user_guide.ipynb +++ b/docs/src/user_guide.ipynb @@ -46,7 +46,7 @@ "feature_3: 10\n", "```\n", "\n", - "Events are not handled individually. Instead, events are grouped together into [EventSet][temporian.EventSet]s. When representing an `EventSet`, it is convenient to group similar features together and to sort them according to the timestamps in increasing order.\n", + "Events are not handled individually. Instead, events are grouped together into `EventSets`. When creating one, it is convenient to put similar features together and to sort them according to the timestamps in increasing order.\n", "\n", "Here is an example of an `EventSet` containing four events and three features:\n", "\n", @@ -72,7 +72,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": null, "id": "1d23b4c0", "metadata": {}, "outputs": [], @@ -106,154 +106,10 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "id": "17c712f6", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "
\n", - "
\n", - " \n", - " features\n", - " [3]:\n", - " \n", - " feature_1\n", - " (float64)\n", - " , \n", - " feature_2\n", - " (str_)\n", - " , \n", - " feature_3\n", - " (int64)\n", - "
\n", - "
\n", - " \n", - " indexes\n", - " [0]:\n", - " \n", - " none\n", - "
\n", - "
\n", - " events: \n", - " 4\n", - "
\n", - "
\n", - " index values: \n", - " 1\n", - "
\n", - "
\n", - " memory usage: \n", - " 0.8 kB\n", - "
\n", - "
\n", - "
\n", - " index\n", - " (\n", - " ) with 4 events\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - " \n", - " timestamp\n", - " \n", - " \n", - " \n", - " feature_1\n", - " \n", - " \n", - " \n", - " feature_2\n", - " \n", - " \n", - " \n", - " feature_3\n", - " \n", - "
\n", - " 2023-02-04 00:00:00+00:00\n", - " \n", - " 0.5\n", - " \n", - " red\n", - " \n", - " 10\n", - "
\n", - " 2023-02-06 00:00:00+00:00\n", - " \n", - " 0.6\n", - " \n", - " blue\n", - " \n", - " -1\n", - "
\n", - " 2023-02-07 00:00:00+00:00\n", - " \n", - " nan\n", - " \n", - " red\n", - " \n", - " 5\n", - "
\n", - " 2023-02-07 00:00:00+00:00\n", - " \n", - " 0.9\n", - " \n", - " blue\n", - " \n", - " 5\n", - "
\n", - "
\n" - ], - "text/plain": [ - "indexes: []\n", - "features: [('feature_1', float64), ('feature_2', str_), ('feature_3', int64)]\n", - "events:\n", - " (4 events):\n", - " timestamps: ['2023-02-04T00:00:00' '2023-02-06T00:00:00' '2023-02-07T00:00:00'\n", - " '2023-02-07T00:00:00']\n", - " 'feature_1': [0.5 0.6 nan 0.9]\n", - " 'feature_2': [b'red' b'blue' b'red' b'blue']\n", - " 'feature_3': [10 -1 5 5]\n", - "memory usage: 0.8 kB" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "evset" ] @@ -272,21 +128,10 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "id": "e3f29b64", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "evset.plot()" ] @@ -324,21 +169,10 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": null, "id": "f0c059c3-1412-47d5-8f21-8c034f16a551", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Create an event set with a random walk\n", "np.random.seed(1)\n", @@ -386,135 +220,12 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "id": "92ec9711", "metadata": { "lines_to_next_cell": 0 }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "
\n", - "
\n", - " \n", - " features\n", - " [2]:\n", - " \n", - " feature_1\n", - " (int64)\n", - " , \n", - " feature_2\n", - " (str_)\n", - "
\n", - "
\n", - " \n", - " indexes\n", - " [0]:\n", - " \n", - " none\n", - "
\n", - "
\n", - " events: \n", - " 4\n", - "
\n", - "
\n", - " index values: \n", - " 1\n", - "
\n", - "
\n", - " memory usage: \n", - " 0.7 kB\n", - "
\n", - "
\n", - "
\n", - " index\n", - " (\n", - " ) with 4 events\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - " \n", - " timestamp\n", - " \n", - " \n", - " \n", - " feature_1\n", - " \n", - " \n", - " \n", - " feature_2\n", - " \n", - "
\n", - " 2023-03-13 00:00:00+00:00\n", - " \n", - " 1\n", - " \n", - " a\n", - "
\n", - " 2023-03-14 12:00:00+00:00\n", - " \n", - " 4\n", - " \n", - " d\n", - "
\n", - " 2023-03-14 13:30:05+00:00\n", - " \n", - " 2\n", - " \n", - " b\n", - "
\n", - " 2023-04-22 12:00:00+00:00\n", - " \n", - " 3\n", - " \n", - " c\n", - "
\n", - "
\n" - ], - "text/plain": [ - "indexes: []\n", - "features: [('feature_1', int64), ('feature_2', str_)]\n", - "events:\n", - " (4 events):\n", - " timestamps: ['2023-03-13T00:00:00' '2023-03-14T12:00:00' '2023-03-14T13:30:05'\n", - " '2023-04-22T12:00:00']\n", - " 'feature_1': [1 4 2 3]\n", - " 'feature_2': [b'a' b'd' b'b' b'c']\n", - "memory usage: 0.7 kB" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "from datetime import datetime\n", "\n", @@ -546,139 +257,10 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": null, "id": "4869f529-350b-43a5-af07-fded47ccad54", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "
\n", - "
\n", - " \n", - " features\n", - " [3]:\n", - " \n", - " calendar_year\n", - " (int32)\n", - " , \n", - " calendar_hour\n", - " (int32)\n", - " , \n", - " calendar_second\n", - " (int32)\n", - "
\n", - "
\n", - " \n", - " indexes\n", - " [0]:\n", - " \n", - " none\n", - "
\n", - "
\n", - " events: \n", - " 3\n", - "
\n", - "
\n", - " index values: \n", - " 1\n", - "
\n", - "
\n", - " memory usage: \n", - " 0.8 kB\n", - "
\n", - "
\n", - "
\n", - " index\n", - " (\n", - " ) with 3 events\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - " \n", - " timestamp\n", - " \n", - " \n", - " \n", - " calendar_year\n", - " \n", - " \n", - " \n", - " calendar_hour\n", - " \n", - " \n", - " \n", - " calendar_second\n", - " \n", - "
\n", - " 1970-01-01 00:00:00+00:00\n", - " \n", - " 1970\n", - " \n", - " 0\n", - " \n", - " 0\n", - "
\n", - " 1970-01-01 00:00:01+00:00\n", - " \n", - " 1970\n", - " \n", - " 0\n", - " \n", - " 1\n", - "
\n", - " 1970-01-01 00:00:02+00:00\n", - " \n", - " 1970\n", - " \n", - " 0\n", - " \n", - " 2\n", - "
\n", - "
\n" - ], - "text/plain": [ - "indexes: []\n", - "features: [('calendar_year', int32), ('calendar_hour', int32), ('calendar_second', int32)]\n", - "events:\n", - " (3 events):\n", - " timestamps: ['1970-01-01T00:00:00' '1970-01-01T00:00:01' '1970-01-01T00:00:02']\n", - " 'calendar_year': [1970 1970 1970]\n", - " 'calendar_hour': [0 0 0]\n", - " 'calendar_second': [0 1 2]\n", - "memory usage: 0.8 kB" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "a_evset = tp.event_set(\n", " timestamps=[0, 1, 2],\n", @@ -704,103 +286,10 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "id": "899fee67-01d0-4680-a223-7b7b144a46ca", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "
\n", - "
\n", - " \n", - " features\n", - " [1]:\n", - " \n", - " count\n", - " (int32)\n", - "
\n", - "
\n", - " \n", - " indexes\n", - " [0]:\n", - " \n", - " none\n", - "
\n", - "
\n", - " events: \n", - " 3\n", - "
\n", - "
\n", - " index values: \n", - " 1\n", - "
\n", - "
\n", - " memory usage: \n", - " 0.5 kB\n", - "
\n", - "
\n", - "
\n", - " index\n", - " (\n", - " ) with 3 events\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - " \n", - " timestamp\n", - " \n", - " \n", - " \n", - " count\n", - " \n", - "
\n", - " 2023-03-13 00:00:00+00:00\n", - " \n", - " 1\n", - "
\n", - " 2023-03-14 00:00:00+00:00\n", - " \n", - " 2\n", - "
\n", - " 2023-03-15 00:00:00+00:00\n", - " \n", - " 2\n", - "
\n", - "
\n" - ], - "text/plain": [ - "indexes: []\n", - "features: [('count', int32)]\n", - "events:\n", - " (3 events):\n", - " timestamps: ['2023-03-13T00:00:00' '2023-03-14T00:00:00' '2023-03-15T00:00:00']\n", - " 'count': [1 2 2]\n", - "memory usage: 0.5 kB" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "a = tp.event_set(timestamps=[\"2023-03-13\", \"2023-03-14\", \"2023-03-15\"])\n", "\n", @@ -842,21 +331,10 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": null, "id": "cbf42f42", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA/UAAAEiCAYAAAC4H/JHAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABsPklEQVR4nO3deXyU5b3///ckkz2ZISvZEwh7Qgh7EAQUtypF1FatoiDK1vbXnkLV4tba9lR7rHI80gqKBa3LsQVL/ao9x6NF2TchbEqEhOwJgRBmss0kM3P//rjDQCAhE5jkns897+fjkUebZJhc4eXN5Mp93ddtUBRFARERERERERGJE6D1AIiIiIiIiIjoynBST0RERERERCQUJ/VEREREREREQnFST0RERERERCQUJ/VEREREREREQnFST0RERERERCQUJ/VEREREREREQnFST0RERERERCSUUesB+BqXy4WqqipERUXBYDBoPRwiIiIiIiLyQ4qioKGhAcnJyQgI6Pp8PCf1F6mqqkJaWprWwyAiIiIiIiJCeXk5UlNTu/y8z03qjx07hrlz5+L06dMwm81Yt24dsrOzOzzG5XLhsccew//8z//A4XBg8uTJePXVVxEcHAwA+Oijj/Dzn/8cTqcTI0eOxLp162AymTz6+lFRUQDUvzhP/4xW6urqEBsbq/UwqBvsJAdbycBOMrCTHGwlAzvJwE4ySOlktVqRlpbmnqN2xecm9YsWLcLChQsxb948rF+/HvPmzcOePXs6POaNN97Avn37sG/fPgQFBWHhwoV4+eWX8eijj6KxsREPP/wwvvzySwwbNgw//vGP8Zvf/AYvvPCCR1//3JJ7k8nk85P6srIyDBgwQOthUDfYSQ62koGdZGAnOdhKBnaSgZ1kkNapu8vCfWqjvNraWuzduxdz5swBANx1110oLy/H8ePHOzzuwIEDuOGGGxAcHAyDwYDvfOc7+Mtf/gIA+Oc//4nRo0dj2LBhAIAf/vCHeO+99/r2G+kj0dHRWg+BPMBOcrCVDOwkAzvJwVYysJMM7CSD3jr51KS+vLwcSUlJMBrVBQQGgwHp6ekoKyvr8LixY8fiww8/hNVqRVtbG/7617+ipKQEgPpbl4yMDPdjMzMzUV1dDYfD0enXtNvtsFqtHd6kCAoK0noI5AF2koOtZGAnGdhJDraSgZ1kYCcZWpz62hDdpyb1npo3bx5uueUWTJs2DdOmTcOQIUPcvwjoqeeeew5ms9n9JmmTvNraWq2HQB5gJznYSgZ2koGd5GArGdhJBnbybV9XWfGT9/bjj5uKtB6KV/nUpD4tLa3DWXVFUVBWVob09PQOjzMYDPjVr36F/fv3Y/v27RgxYoR7M7309HSUlpa6H1tSUtLh7P/Fli9fDovF4n4rLy/vpe/O+yRs7kDsJAlbycBOMrCTHGwlAzvJwE6+6XClBT96dx/e3lWKR28eisduGqT1kLzKpyb1CQkJGDNmDN5++20AwIYNG5CamopBgzr+pdtsNtTX1wMATp8+jeeffx6PPfYYAOCWW27Bvn37cPToUQDAn/70J9x7771dfs2QkBD3pngSNscjIiIiIiKi7hWUn8WSt7/C+3vK8cStw/G7O0YiLSZc62F5nU9N6gFg9erVWL16NYYMGYLnn38ea9euBQA88sgj+PDDDwEAFosF11xzDbKzs3Httddi8eLF+O53vwtAvSXdmjVrMHv2bAwaNAgVFRV4+umnNft+elNdXZ3WQyAPsJMcbCUDO8nATnKwlQzsJAM7+YavSuux6C97sXF/JX753Wz8ZnYOUvqFuT+vt04GRVEUrQfhS6xWK8xmMywWi8+fta+trUVCQoLWw6BusJMcbCUDO8nATnKwlQzsJAM7aWtPyRm8trkYGTHhWDh1IBJMoZ0+TkonT+emPnefevJcW1ub1kMgD7CTHGwlAzvJwE5ysJUM7CQDO/U9RVGws/gM1mwpxqCESDx350jERYZc9s/orZPPLb8nz53bV4B8GzvJwVYysJMM7CQHW8nATjKwU99RFAVbj53G/HV7sOXYKfzH93Kx/Nbh3U7oAf114pl6wRITE7UeAnmAneRgKxnYSQZ2koOtZGAnGdip9ymKgi+/PYV120uQm2LGinvy0C88uEfPobdOnNQL1tzcrPUQyAPsJAdbycBOMrCTHGwlAzvJwE69R1EUbCqsxbrtpRibHo2X7x0Nc1jQFT2X3jpxUi+Y1WrVegjkAXaSg61kYCcZ2EkOtpKBnWRgJ+9TFAX/9/VJ/GVnKSYOiMHK+0bDFHplk/lz9NaJk3rBkpOTtR4CeYCd5GArGdhJBnaSg61kYCcZ2Ml7XC4F/3ukBu/sKsPkQXF4dc5YRIZ4Z/qqt07cKE8wvf2GSa/YSQ62koGdZGAnOdhKBnaSgZ2untOl4P8dqMIDf96FivoWvPbgWCyZnuW1CT2gv048Uy9YY2Oj1kMgD7CTHGwlAzvJwE5ysJUM7CQDO105h9OFjw5W429flWPGsP5Y8+B4hAUH9srX0lsnTuoFS0tL03oI5AF2koOtZGAnGdhJDraSgZ1kYKeeczhd+EdBFTbsq8AtOYl4Y+54hAb1zmT+HL114vJ7wU6fPq31EMgD7CQHW8nATjKwkxxsJQM7ycBOnmtzuvDXPeV48M+70dLmxNqHxuPBSZm9PqEH9NeJZ+oFa2lp0XoI5AF2koOtZGAnGdhJDraSgZ1kYKfutTpcWP9VBT46WIVZo5Kx7qEJCDb27blmvXXipF6wjIwMrYdAHmAnOdhKBnaSgZ3kYCsZ2EkGduqa3eHEX/eU45+Ha3DH6BS8OX8CggK1WTiut05cfi9YTU2N1kMgD7CTHGwlAzvJwE5ysJUM7CQDO13K1ubEum0nMH/dHkSGGvHW/An4/rg0zSb0gP468Uy9YHa7XeshkAfYSQ62koGdZGAnOdhKBnaSgZ3Oa2l14p1dpdhUWIu7x6XhrfkTERhg0HpYAPTXyaAoiqL1IHyJ1WqF2WyGxWKByWTSejiX1dzcjPDwcK2HQd1gJznYSgZ2koGd5GArGdhJBnYCmuwOvL2zFFuOncYPJqTjOzmJCPCRyfw5Ujp5Ojfl8nvBysrKtB4CeYCd5GArGdhJBnaSg61kYCcZ/LlTg60Nf9x0HIvf/goZsRF4a/4E3Jab5HMTekB/nbj8XjCHw6H1EMgD7CQHW8nATjKwkxxsJQM7yeCPnSwtbXhzewn2lJzB3EmZ+OH0LBgMvjeRv5DeOnH5/UUkLb+32WwIDQ3VehjUDXaSg61kYCcZ2EkOtpKBnWTwp06W5jb8edsJFJSfxbzJmZg+JN7nJ/PnSOnE5fd+oLi4WOshkAfYSQ62koGdZGAnOdhKBnaSwR861Te14g//W4ifvr8fYzOise6h8bhuaIKYCT2gv05cfi+Yy+XSegjkAXaSg61kYCcZ2EkOtpKBnWTQc6e6Rjte33ICx0424OEpA7DspiGiJvIX0lsnLr+/iKTl921tbQgKCtJ6GNQNdpKDrWRgJxnYSQ62koGdZNBjp1MNdry+pRjFp5rwyLUDkD8wVushXTUpnbj83g8UFhZqPQTyADvJwVYysJMM7CQHW8nATjLoqdNJqw2//n9f48m/H8JNI/pjzdxxupjQA/rqBHD5PREREREREbWrtrRg1RdFOGm1Y+G0gRiTHq31kKgbfbL8vq6uDrGxnv1W59ixY5g7dy5Onz4Ns9mMdevWITs7u8Nj1q5di5dfftn9fkVFBaZOnYoPPvgAJSUlyMrKwsiRI92f37BhA7Kysjz6+lx+T97GTnKwlQzsJAM7ycFWMrCTDJI7VdQ3Y9WXRahvasOiaQORm9pP6yH1GimdfGr5/ejRoz1+7KJFi7Bw4UJ8++23ePzxxzFv3rxLHvPQQw+hoKDA/ZaYmIj777/f/fmoqKgOn/d0Qi+N3paN6BU7ycFWMrCTDOwkB1vJwE4ySOxUVteM5R8cxPP/PIp7x6fjj/eP0fWEHpDZ6XK8tvz+ww8/7PJzNpvNo+eora3F3r178emnnwIA7rrrLvz4xz/G8ePHMWjQoE7/zK5du1BbW4tZs2b1fNBERERERER+qOR0E179ogg2hxNLpmdhWKJvr1KmrnltUn/HHXdg2rRp6Gw1f0NDg0fPUV5ejqSkJBiN6rAMBgPS09NRVlbW5aT+jTfewAMPPNBh+URTUxPGjx8Pp9OJ2bNn48knn0RgYGCnf95ut8Nut7vft1qtHo3VFwwdOlTrIZAH2EkOtpKBnWRgJznYSgZ2kkFCp6JTjXj1iyK4XAqWTM/C4P5RWg+pz0no1BNeW34/ePBg/PnPf8amTZsueYuLi/PWl+mgqakJ//3f/42HH37Y/bGkpCRUVlZiz549+Oyzz7Blyxa8+OKLXT7Hc889B7PZ7H5LS0vrlbH2Br0tG9ErdpKDrWRgJxnYSQ62koGdZPDlTsdONuBn7xfgT5uKsGR6Fl66J88vJ/SAb3e6El6b1J/b3K4zixcv9ug50tLSUF1dDYfDAQBQFAVlZWVIT0/v9PF/+9vfkJ2djREjRrg/FhISgoSEBABATEwM5s+fjy1btnT5NZcvXw6LxeJ+Ky8v92isviAggHcklICd5GArGdhJBnaSg61kYCcZfLHT0RorfvLefqzZcgI/nTEYL949ClnxkVoPS1O+2Olq9Mnu9xc6ceIEBgwY0OXnp0+fjnnz5mHevHlYv349nn/+eezdu7fTx1577bWYO3cuHnnkEffHamtrER0djaCgINjtdsyZMwfDhw/Hr3/9a4/GJ2n3e5vNhtDQUK2HQd1gJznYSgZ2koGd5GArGdhJBl/qdKTKgle/KEJUaBCWTMtCemy41kPyGb7U6XJ8avf7C911112X/fzq1auxevVqDBkyBM8//zzWrl0LAHjkkUc6bMZXWFiIgoIC3HPPPR3+/NatWzF69GiMGjUKY8aMQWJiIp588knvfyM+4Pjx41oPgTzATnKwlQzsJAM7ycFWMrCTDL7Q6WDFWfzwna/w3u4y/OI7w/DcnSM5ob+IL3TyJq9tlOep7hYGDB06FDt27Ljk42vWrLnkcZ1twHfnnXfizjvvvLpBCnFuQ0HybewkB1vJwE4ysJMcbCUDO8mgZaf9ZfVY/WUx+ptC8NRtI5DcL0yzsfg6vR1Pff7dGAyGvv6SutXVXgPkW9hJDraSgZ1kYCc52EoGdpJBi057S85g9eZipEWH49nbs9Hf5PvLyrWmt+NJXzsE+Jni4mKth0AeYCc52EoGdpKBneRgKxnYSYa+7LSzuA6PvLkHn359Ev9+Rw6e+e4ITug9pLfjyeeW35PnQkJCtB4CeYCd5GArGdhJBnaSg61kYCcZeruToijYUVSHNVtPYGhiFH5/Vy5iI/nfRk/p7Xjq80m9v1zv3hcSExO1HgJ5gJ3kYCsZ2EkGdpKDrWRgJxl6q5OiKNhy7DTWbjuBnBQzXvz+KERHBPfK1/IHejuevL78vry8HDNnzkReXh4AoKCgACtWrHB//umnn/b2l/RbpaWlWg+BPMBOcrCVDOwkAzvJwVYysJMM3u6kKAo2Ha3FvLV78FVpPf7zntFYdtNQTuivkt6OJ69P6hctWoR7773Xvcw+JycHf/7zn739ZQhAWBh3tJSAneRgKxnYSQZ2koOtZGAnGbzVSVEUfPb1ScxduweHKy145b7R+NmNQ2AOD/LK8/s7vR1PXp/U19bWYs6cOQgIUJ/aaDTq7pYBviIuLk7rIZAH2EkOtpKBnWRgJznYSgZ2kuFqO7lcCv7ncA0e/PNufFvbgD/eNxr/34zBMIVyMu9NejuevD6pNxqNHTbDq6+v5+Z4vaS8vFzrIZAH2EkOtpKBnWRgJznYSgZ2kuFKO7lcCj4+WI0H/7wbpXVNWDVnLH44fRCiOJnvFXo7nrx+Cv373/8+Fi1aBKvVijVr1mDVqlV45JFHvP1lCEBkZKTWQyAPsJMcbCUDO8nATnKwlQzsJENPOzldCj46WIW/7i3HdUMT8PqD4xAWHNhLo6Nz9HY8eX1Sv2zZMrz33nuwWCz49NNPsXTpUtx3333e/jIEwGQyaT0E8gA7ycFWMrCTDOwkB1vJwE4yeNrJ4XThwwNVWP9VBW4a0R9vzB2P0CBO5vuK3o4nr07qnU4nbr75Znz22Wf4wQ9+4M2npk5UVVUhJiZG62FQN9hJDraSgZ1kYCc52EoGdpKhu05tThc27q/E3/dX4jsjk/DneZzMa0Fvx5NXJ/WBgYFobm6Gy+Vyb5RHvUdvv2HSK3aSg61kYCcZ2EkOtpKBnWToqlOrw4UP9lXgwwNV+O6oZKx7aAKCjZwvaUVvx5PXl9+PHz8eM2fOxJw5czpcqzBr1ixvfym/Fx4ervUQyAPsJAdbycBOMrCTHGwlAzvJcHEnu8OJv+2twCeHqjF7dArenD8BQYGczGtNb8eT1yf1Bw8eBAC8/vrr7o8ZDAZO6ntBTU2N7m7HoEfsJAdbycBOMrCTHGwlAzvJcK6Trc2J9/eU43+P1OCuMal4a/4EGDmZ9xl6O568PqnftGmTt5+SuhAdHa31EMgD7CQHW8nATjKwkxxsJQM7yRAWacaft57A50dP4u5xafjLwxMRGGDQelh0Eb0dT16f1G/evLnTj0+dOtXbX8rvBQXxvpUSsJMcbCUDO8nATnKwlQzs5NuaWx14Z2cZ/u9wJR6ckoW35nMy78v0djz1yi3tzrHZbCgsLEROTg727dvn7S/l92pra5GQkKD1MKgb7CQHW8nATjKwkxxsJQM7+aZGuwN/2VGKbcdP4/6J6Xjq2n7IHZms9bCoG3o7nrw+qd+zZ0+H93fv3o1169Z5+8sQgNjYWK2HQB5gJznYSgZ2koGd5GArGdjJt1htbXhrewl2nTiDB/IzsGjqQAQEGFBdrfXIyBN6O568Pqm/2IQJE7Bo0aLe/jJERERERES9ytLShrXbTmBf2VnMuyYDP7puEAwGLrMnbfXa7vcA4HQ6sWvXLrS1tXn7yxCAuro6JCUlaT0M6gY7ycFWMrCTDOwkB1vJwE7aOtvcij9vPYGDlRY8NHkAfjpjcKeTeXaSQW+dvD6pv/32288/udGIwYMH48033/T2lyFAV9eB6Bk7ycFWMrCTDOwkB1vJwE7aONPUijVbinG0pgEPTxmAn9045LJn5tlJBr118vqk/sSJE95+SuoCV0DIwE5ysJUM7CQDO8nBVjKwU9861WDHmi3FKDrViIenDMRjtwzz6M+xkwx66xTg7SecPXu2Rx/ryrFjx3DNNddgyJAhGD9+PI4cOdLp4w4dOoTp06dj+PDhGD58OD744AP359544w0MHjwYWVlZWLBgge6inVNfX6/1EMgD7CQHW8nATjKwkxxsJQM79Y1aqw2/+ehrPPH3Q5gxvD/WzB2PSVmeb6rGTjLorZPXz9SXlZVd8rGioiKP//yiRYuwcOFCzJs3D+vXr8e8efMu2VG/ubkZt99+O9566y1MmTIFTqcTZ86cAaCuFHj66aexb98+9O/fH7fffjtee+01/OhHP7q6b8wHJSYmaj0E8gA7ycFWMrCTDOwkB1vJwE69q8Ziw6ovi1BjsWHB1IEYmxF9Rc/DTjLorZPXztSvXr0ao0ePRmFhIcaMGeN+y8rKwoABAzx6jtraWuzduxdz5swBANx1110oLy/H8ePHOzzu3XffRX5+PqZMmQIACAwMRHx8PABg/fr1mDVrFhITE2EwGLB48WK899573vo2fUpzc7PWQyAPsJMcbCUDO8nATnKwlQzs1Dsqz7bg6Y2H8euPjuCO0SlY9cDYK57QA+wkhd46ee1M/S233IKhQ4diyZIlWLFihfvjJpMJubm5Hj1HeXk5kpKSYDSqwzIYDEhPT0dZWRkGDRrkftzXX3+NkJAQzJw5ExUVFcjNzcWLL76I+Ph4lJWVISMjw/3YzMzMTlcPnGO322G3293vW61Wj79nrUkaqz9jJ9+lKAqsNgdONdhQ19iKplNnkJaWxlvT+DgeUzKwkxxsJQM7eVf5mWa8+mURLC1tWDItCzkpZq88LzvJoLdOXpvUZ2RkICMjA9988423nrJLDocDn332GXbu3Ink5GQ88cQTWLJkCdavX9/j53ruuefw7LPP9sIoe19ycrLWQyAPsFPfUxQF9c1tqG2wodZqR22DHSetNpxqsKO2wQZ7mwtK+2NNoUYkmEIRExGMY1UO/OXrPQgMCMCQ/pHISTFjZIoZqdFhnOj7EB5TMrCTHGwlAzt5R2ldE/60qQgtbU4snpaFEckmrz4/O8mgt05ev6a+paUFr7zyCgoKCmCz2dwfv3Aju66kpaWhuroaDocDRqMRiqKgrKwM6enpHR6Xnp6O6667DikpKQCAOXPm4Oabb3Z/7sJr+EtKSi758xdavnw5li5d6n7farUiLS3Ns29WY1arFTExMVoPg7rBTt7jcimoa2q9YLJ+ftJe22BDm1PBuam3OTwI/U2hSIgKQUJUKCYMiEH/qFDER4UgLDiw0+cvKSlBZmYm2pwuHDvZiMOVFry+pRjlZ5oRYDBgUEIkstsn+hkx4QgI4ERfCzymZGAnOdhKBna6OsWnGvHqF0VwuBQsnpaFoYlRvfJ12EkGvXXy+qR+wYIFMJlM2L59O5YtW4Z169Zh6tSpHv3ZhIQEjBkzBm+//TbmzZuHDRs2IDU1tcPSewC4++678cYbb8BqtcJkMuGTTz7BqFGjAKjX4U+ZMgW/+tWv0L9/f6xatQr33ntvl18zJCQEISEhV/4Na6ixsVHrIZAH2Kl7DqcLpxvPT9ZPXjBZP91oh9OlTtYNBgNiIoKQEBWK/qYQxEeFYnD/KCREhSA+KgQhxs4n65461yooMAAjkk0YkWzC3Uhzj7H4dBMOVVjw1o4SlNap12INiIvAyBQzclJMGBAXiUBO9HsdjykZ2EkOtpKBna7M8doG/OmLIhhgwJLpWRiUENmrX4+dZNBbJ4OiKEr3D/PcyJEjcejQIeTm5uLgwYNoaGjAbbfdhs2bN3v05wsLCzFv3jzU1dXBZDJh7dq1GDlyJB555BHMmjULs2bNAgD85S9/we9//3sEBAQgJSUFr732mvsM++uvv47nn38eADB9+nSsWrUKQUFBHn19q9UKs9kMi8UCk8m7y3G8zWKxwGz2zvU/1Hv8uZPd4Wxf8m5HrdWOUw02nGw/w36mqRWu9n99jAEGxEaGqGfVTSHoHxWKBJN6hj0uMhjGQK/ffbNTPW3ldCk4cboJR6osOFRhwYnTTXApCjJiI5DTPtEfFB/ZZ+P3F/58TEnCTnKwlQzs1DOFNQ149YvjCDYGYMn0QRgQF9EnX5edZJDSydO5qdcn9RMmTMDu3bsxZswYbNmyBRERERg+fHifXGvvDZIm9UVFRcjKytJ6GNQNPXaytTkvOqNuc1+3bmluAwAoAIIDAxAfdX6ynnDBcviYiGCfO6vtjVYul4KyM804XGXBoUoLimob4XQpSI0OR06KCTkpZgxOiEKwkRP9K6XHY0qP2EkOtpKBnTzzdZUVr35ZhIjgQCyZnoWM2L6ZzJ/DTjJI6eTp3NTry+9jYmJQX1+PW2+9FTfffDPi4uKQmprq7S9DUPcvIN8nqVOj3YFaq+2ijeXsqLXaYLU53NerhwQFIOGCs+lZ8ZGYlBWL/lGh6BceJHZTOW+0CggwIDMuAplxEZiZq27CoigKKupbcLjSgk8OVaOw5hgcLheSzGHISTFhZIoZQ/pHITTo6i4f8BeSjil/xk5ysJUM7HR5hystePXLIvQLC8JjNw9FWky4JuNgJxn01snrZ+qdTicCAwOhKAreffdd1NfX48EHH/T5s97nSDpT39DQgKio3tnkg7xH606KosDa4nCfTa89twS+/Qx7S6vT/djwECMSokLQv32yfuEZ9qgQo9jJuqf6spWiKKix2nCowoLDVVYU1ljR6nAhPioEI1PMyE4xY3iiqctN/fyZ1scUeYad5GArGdipcwXlZ7H6yyLER4Vg8bQsJPcL03Q87CSDlE6anakPDAxEdXU1CgsLcf/996OtrQ1e/r0BtaupqRHxH6O/661O527bdrL9zHrtRf/b6nC5H2sKC2qfoKsT9dFp/dz/PyLE6/8MiNWXx5TBYECSOQxJ5jDclJ3o/nit1YbDVRZs+fY0Xt9cjJY2J2Iigts34zNjRJLJ75vx3z4Z2EkOtpKBnTr6qrQer20uQnK/MPzyu9lINIdqPSQA7CSF3jp5/SfD9evXY9myZTAYDCgpKcHXX3+N5cuX45NPPvH2l/J7drtd6yGQB3rayelSUNdk7/SWbaca7HA41V+SGQxAv/Dg9mvUQ9DfFIqB8RFIaL9tG5dy95wvHFMJplBcbwrF9cP6uz92utGOI1VW7D5xBuu2laC51QFzWBByUszITjYjO8UEU6hnm4HqgS90ou6xkxxsJQM7qXafOIPXNhcjMzYcv5mdg4Qo35jMn8NOMuitk9eX348dOxaffvopbrjhBuzfvx8AkJ2djSNHjnjzy/QaScvvm5ubER6uzfVC5LlzndqcLpxutLsn6efOsJ9qsOF0YytcrnOTdQPiItXJenz72fRz91uPiwzhBmu9SNIxdba5FYcrrThcZcGRKisabW2IDA1CdrJ6jX52sgn9woO1HmavkNTJn7GTHGwlgz93UhQFO4rr8MaWExjUPxILrh2IuEjfvCW1P3eSREonTZffx8bGdvhYcLA+f7DUWllZGYYNG6b1MPye3eF0T9RPXbALfK3VjvrmVjQ0NiIyQr1/eXz7zu8JphAkmUMxKrUf+ptCEBPRd7dto65JOqb6hQdjyuA4TBkc5/6Y1daGI5VWHKmy4G97y2FpaUN4sBEjktVd93OSTYj10R+CekJSJ3/GTnKwlQz+2ElRFGw7Xoc/bzuB4UlReOH7oxAT4dvzCn/sJJHeOnl9Uh8VFYWTJ0+6N9T6/PPPERMT4+0vQwAcDofWQ9C1llbn+U3lLlwGb7XB0qLets1gAILab9vW36Que0+PCce4jBgkmEIQEx6Mr78+gpycHI2/G/KE9GPKFBqESVmxmJR1/herjXYHvqm24nClBf8oqER9UytCgwIxPMnkvsWery1d7I70Tv6CneRgKxn8qZOiKPjy21NYt70Euan98NLdo8SsPvOnTpLprZPXlt8fOXIE2dnZ2Lt3LxYuXIji4mLk5OTgxIkT+Pjjj5GXl+eNL9PrJC2/t9lsCA2V9cO41hRFUW/b1nDxNevqGfZG2/kDPDQ40H1Pdfdu8Cb1+nVzmOe3bWMnOfylVUurE9/UqBP9w5UWnGqwI9gYgKGJJuQkmzAy1YxEU6jP3u3AXzpJx05ysJUM/tBJURT862gt3txRirHp0Zg3ORPmMFl7xvhDJz2Q0snTuanXJvVjxozBvn37MGXKFHz88cfYvn07FEXBNddcg379+nnjS/QJSZP6r7/+GiNGjNB6GD5BURRYWto6TtYvuG7d3ubEuf/SI0ON7sl6wkWT9cheuG0bO8nhz61sbU4U1jTgcJUFhyutqLG0wBgYgCH9I9uv0TcjNTrMJyb6/txJEnaSg61k0HMnRVHw6dcn8fbOUuQPjMWDkzIQJXQDWD130hMpnfr8mnqbzYb3338f1dXV2Lx5s/s2dps3bwYAzJo1y1tfitq5XK7uHyScy6Wgvrn1/BL4BjtOXXDbtjbnxbdtO39v9THp0e4z7Fre69sfOumFP7cKDQrEqLR+GJXWz/2xVocL355swJEqC1ZvLkJlfQsCAwzISlAn+jnJZmTEhvf5RN+fO0nCTnKwlQx67ORyKfjfIzV4d3cZJg+Kw6tzxiJS+G1b9dhJj/TWyWtn6j/88EOsWrUKW7Zswbhx4zp+EYMB//rXv7zxZXqdpDP1bW1tCAqS+VtMp0tBXeP5W7WdtJ4/w36qwQ6nS4E6TzAgOjxI3f29/Wx6fPvEXcpt2yR38jds1T2H04XjpxrVnfcrLSg70wwDgIHxEe5b7A2Mi0BAQO9N9NlJBnaSg61k0FMnp0vBJ4eq8f6eckwfGo/7JqYjPFj2ZP4cPXXSMymd+nz5/Tk//elP8fLLL3vzKfuUpEn94cOHfW4DtjanSz2TfsHZ9HP/W9fU6l7BEWAwIDYyGPEXXq/efoY9LjIEQTraCd4XO1Hn2OrKOF0KTpxuxKFKdel+yekmKAAyYsORk2zGyFR1ou+tOzywkwzsJAdbyaCHTg6nCx8drMbfvirHDcP74wcT0kWcoOkJPXTyB1I6aXZLO8kTeuqarc3ZPlm/YBf49jPsZ5tb3Y8zBgQgLirYPUlP6ReGvLR+SDCFIDYiBIG9ePaOiLQRGGDAoIQoDEqIwh2j1Y+5XApKzzTjUKUFG76qQNGpRjhdCtJiwttvr2fG4P6RuvoFHhERdc7hdGFjQRU+2FeBW3IS8cbc8bqbzBNpyetn6qWTdKbeG8tGmlsd7kn6uU3lahtsOGW1w9LShnOXygYbA5AQFdp+n/UQJJjOn2HvFxbUq0ttpZOyvIfYqrcpioLyMy04XGXBoUoLjp1shMPlQnK/MPc1+kMSIxFivPwPeuwkAzvJwVYySOzU5nTh7/sqsbGgErflJuF7Y1O7/TdeOomd/JGUTpotv5dO0qS+q2UjiqKgwe7ocI36Sev5M+zNrRfcti0oUL1evX3p+/ll8KEwhXp/J3h/JGV5D7GVFhRFQZXF5r69XmFNA1qdLiSaQpGdYkZOsgnDk0wdzuiwkwzsJAdbySCpU6vDhfVfVeCjg1W4PS8Zd4xORbDRP1ZmSerkz6R00mz5PfWNUw12fF7ciC2ni3DSqk7c7Q4nAAMABZEhRiSYzk/Qc1P7uf+/9F1FiUg/DAYDUvqFIaVfGG7OTgSgTvRrG+w4VGHBl9+ewuovi2F3OBEbGYKcZBMiWm0Y2OrQzaZKRER6YWtz4m97y/HPwzW4c0wq3pw/gZdZEfUBnqm/iJQz9SetNuwqOoXk6Aj3fdZ5bZJvkrK8h9jK151qsONwlQUHy+pRWNuI5lYnosODkZ1swsgUM0Ykm8Te11iPeDzJwVYy+HInW5sT7+0uw/99fRLfH5eK7+Yme21zVGl8uROdJ6UTz9TrXH9TKAYGWZCTmab1UKgbhYWFIpb3EFv5uvioEFw3NAHxbbX46Y1jAQD1Ta04XGXBvrKz+MvOUjTZHYgKDUJOigk5yeot9szhvv+irUc8nuRgKxl8sVNLqxPv7CrFF4WncPf4NPzl4Yl+vymyL3aiS+mtEyf1ggUE+OdvQKVhJznYSoYLO0VHBOPawfG4dnC8+2OWljYcqVKv0X9/bzksLW2ICDEiO1md6OekmBETEazF0P0Kjyc52EoGX+rUZHfg7Z2l2HLsNO6bmI635k/gpsntfKkTdU1vnbj8/iJSlt8DgM1mQ2hoqNbDoG6wkxxsJcOVdGqwteGb6gYcqrTgSKUF9c2tCAsOxPBEE3JS1Z3346NCemnE/onHkxxsJYMvdGqwteGtHaXYWVyHOfkZuHF4f07mL+ILnah7Ujpx+b0fOH78uK6WjegVO8nBVjJcSaeo0CBMGBCDCQNi3B9rbnXgm2orDlda8fHBapxutCPEGIBhieo1+jkpZvQ3hfAuIFeIx5McbCWDlp0sLW14c3sJ9pbWY+6kDPxwehb/bewCjycZ9NaJk3rBjEbmk4Cd5GArGbzVKTzYiLEZMRibcX6ib2tz4mhNAw5XWvDZNydx0mpDUGAAhiZGITvZjJGpZiSbQ/nDrAd4PMnBVjJo0cnS3IY3tp3AgfKzmDc5E//f9YP47183eDzJoLdOPrf8/tixY5g7dy5Onz4Ns9mMdevWITs7u9PHKoqCGTNmYN++fTh79iwAoKSkBFlZWRg5cqT7cRs2bEBWVpZHX1/S8vvm5maEh4drPQzqBjvJwVYy9HUnu8OJYycbcahSvU6/8mwLjAEGDO4fhZxkM0ammJEWE8YfdC/C40kOtpKhLzvVN7Xija0ncKTKgvlTBmDKoDj+G+chHk8ySOkkdvn9okWLsHDhQsybNw/r16/HvHnzsGfPnk4fu2LFCmRlZWHfvn0dPh4VFYWCgoI+GK22iouLdbVsRK/YSQ62kqGvO4UYA5HTvhz/nDanC8dr1Yn+G1uLUXamGQEGA7ISIt232MuMjfDra015PMnBVjL0Rae6Rjte33ICx2sbMH/KACy7aQgn8z3E40kGvXXyqUl9bW0t9u7di08//RQAcNddd+HHP/4xjh8/jkGDBnV47JEjR7Bx40asXbsWf/vb37QYruZCQripkwTsJAdbyeALnYICAzA8yYThSSZgnHprUadLQfEpdaL/9s4ylNQ1AQAyYyMwMlXdeX9gfKTf3O7JFzqRZ9hKht7sVNtgw+ubi3HidDMWXDsAv/jOsF77WnrH40kGvXXyqUl9eXk5kpKS3Nc4GAwGpKeno6ysrMOkvq2tDQsWLMAbb7yBwMDAS56nqakJ48ePh9PpxOzZs/Hkk092+jgAsNvtsNvt7vetVquXv6vek5iYqPUQyAPsJAdbyeCrnQLbl+QP7h+FO8eoH3O5FJyoa8LhSgv+urccxaea4FIUpMeEu8/+D06IhDFQX7fWAXy3E12KrWTojU4nrTas+rIIlfUtWDh1IMZlxnT/h+iyeDzJoLdOPjWp99Szzz6LO++8E8OHD0dJSUmHzyUlJaGyshIJCQk4c+YM7rnnHrz44ot47LHHOn2u5557Ds8++2wfjNr7SktLdbVsRK/YSQ62kkFSp4AAA7LiI5EVH4nb81IAqPvBlJ1pxuFKK/5RUIXjtY1wulxIiQ5DTrI60R/SPwrBRtkTfUmd/B1byeDNTtWWFqz6ogi1DXYsnDoQo9OjvfK8xONJCr118qlJfVpaGqqrq+FwOGA0GtUffMrKkJ6e3uFxX375JcrKyrBy5Uo4HA5YrVZkZmZiz549iI+PR0JCAgAgJiYG8+fPx7vvvtvlpH758uVYunSp+32r1Yq0tLTe+ya9KCwsTOshkAfYSQ62kkF6J4PBgIzYCGTERuC23CQA6kS/8mwLDlda8D+Ha/Dy58fQ5nQhyRyq7rqfYsbQxCiEBnW+6swXSe/kT9hKBm90qqhvxqovi1Df3IbFU7MwMtXc/R+iHuHxJIPeOvnUpD4hIQFjxozB22+/jXnz5mHDhg1ITU295Hr6LVu2uP9/SUkJ8vLy3Gfsa2trER0djaCgINjtdnzwwQcYPXp0l18zJCRE7DUVcXFxWg+BPMBOcrCVDHrsZDAYkBodjtTocNySc36iX2O14XClFf86Wos/fXEcrQ4X4iJDMDLVjOxkM0YkmRAW7JsTfT120iu2kuFqOpXVNePVL4+j0e7E4mkDkZ3MyXxv4fEkg946+dSkHgBWr16NefPm4Xe/+x1MJhPWrl0LAHjkkUcwa9YszJo167J/fuvWrXjmmWcQGBgIh8OB66+/Hk8++WRfDL3PlZeXw2zmP8q+jp3kYCsZ/KWTwWBAkjkMSeYw3Diiv/vjtQ02HKm0Ytvx01izpRgtbU7EhAe7r9EfkWxCZIj2L+/+0kkP2EqGK+l04nQTXm3/heDi6VkYlujbt2vWAx5PMuitk/av+hcZOnQoduzYccnH16xZ0+njMzMz3feoB4A777wTd955Z28Nz6dERkZqPQTyADvJwVYy+HunhKhQJAwLxXXDEtwfq2u040iVFXtKzuDNHSVotjtgCgtCTrIZ2Skm5KSYYQoN6tNx+nsnSdhKhp50KjrViFe/KILLpWDJ9CwM7h/ViyOjC/F4kkFvnXxuUk+eM5n421YJ2EkOtpKBnS4VGxmCqUPiMXVIvPtjluY2HK6y4FCFBf+9uxwNtjZEhBjd1+hnJ5sQHRHca2NiJznYSgZPOh072YBXvyhCQIABS6ZnISteXxMXCXg8yaC3TpzUC1ZVVYWYGN56xNexkxxsJQM7ecYcHoTJg+IwedD56wYbbG04UmXF4UoLNuyrwNnmVoQFB2JEksm9fD8u0jv7zLCTHGwlw+U6fVNtxaovixAWFIifzBiMzLiIPh4dncPjSQa9deKkXjC9/YZJr9hJDraSgZ2uXFRoEPIHxiJ/YKz7Y012B76pVif6/+9ANc402RFiDMTwJBNyUkwYmWJGgim0x1+LneRgKxk663SkyoJXvyhCVGgQfn7TUKTFhGswMroQjycZ9NaJk3rBwsP5D7cE7CQHW8nATt4VEWLEuMwYjMs8f8aipdWJozXqRP/TIydR22BDUGAAhiVGITtFXb6fZA6FwWDo8nnZSQ62kuHCTgcrzmL1l8WIiQjGL74zDKnRbOgreDzJoLdOnNQLVlNTo7vbMegRO8nBVjKwU+8LCw7E6PRojE6Pdn/M7nCisKYBhyutWLnpOKrPtiAwIABD+kdiZPvS/dToMPdEn53kYCsZampqUNYciNe+LEaiORRPzRyOJLO+7rWtBzyeZNBbJ07qBYuOju7+QaQ5dpKDrWRgJ22EGAORm9oPuan93B9rc7rw7ckGHKm04rXNxaiob0ZggAFZ8ZGINrrwja1cuwGTx+rPspWvcykKPt5/FoOTA/Dr27Ov6JIY6ht8jZJBb504qRcsKKhvb09EV4ad5GArGdjJdwQFBiA72YzsZDPuHp8GAHA4XSg61YSCoipEhfLHDAlcYcFsJcDyGwdg+IAUrYdB3eBrlAx668R/wQWrra1FQkJC9w8kTbGTHGwlAzv5NmNgAIYmRqHtdBtycpK0Hg554PDhOrYS4PDhwwA4qfd1fI2SQW+dArQeAF252NjY7h9EmmMnOdhKBnaSgZ3kYCsZ2EkGdpJBb504qSciIiIiIiISisvvL6IoCgDAarVqPJLulZaWIiIiQuthUDfYSQ62koGdZGAnOdhKBnaSgZ1kkNLp3Jz03By1K5zUX6ShoQEAkJaWpvFIiIiIiIiIyN81NDTAbDZ3+XmD0t2038+4XC5UVVUhKirKfa9dX2S1WpGWloby8nKYTCath0NdYCc52EoGdpKBneRgKxnYSQZ2kkFSJ0VR0NDQgOTkZAQEdH3lPM/UXyQgIACpqalaD8NjJpPJ5/9jJHaShK1kYCcZ2EkOtpKBnWRgJxmkdLrcGfpzuFEeERERERERkVCc1BMREREREREJxUm9UCEhIfjlL3+JkJAQrYdCl8FOcrCVDOwkAzvJwVYysJMM7CSDHjtxozwiIiIiIiIioXimnoiIiIiIiEgoTuqJiIiIiIiIhOKknoiIiIiIiEgoTuqJiIiIiIiIhOKknoiIiIiIiEgoTuqJiIiIiIiIhOKknoiIiIiIiEgoTuqJiIiIiIiIhOKknoiIiIiIiEgoTuqJiIiIiIiIhOKknoiIiIiIiEgoTuqJiIiIiIiIhDJqPQBf43K5UFVVhaioKBgMBq2HQ0RERERERH5IURQ0NDQgOTkZAQFdn4/npP4iVVVVSEtL03oYRERERERERCgvL0dqamqXn+ek/iJRUVEA1L84k8mk8Wgur66uDrGxsVoPg7rBTnKwlQzsJAM7ycFWMrCTDOwkg5ROVqsVaWlp7jlqV3xyUu9wOGA0ajO0c0vuTSaTz0/qy8rKMGDAAK2HQd1gJznYSgZ2koGd5GArGdhJBnaSQVqn7i4L7/ON8v7xj39g+PDhGDVqFB5//HHExcWhpKQEmZmZePzxxzFhwgTMnTsXbW1t+MUvfoEJEyYgLy8Pd999N+rr6wEADQ0NWLBgASZMmIDc3FwsXLgQra2tAIDp06fj5z//Oa699lpkZWVh8eLFff0t9pno6Gith0AeYCc52EoGdpKBneRgKxnYSQZ2kkFvnfp0Ul9bW4v58+fj73//Ow4cOIBhw4ahrq7O/fm6ujrs2rUL77zzDl544QVERERg9+7dKCgowMiRI/HUU08BAJYtW4Zrr70Wu3fvxoEDB+ByufDyyy+7n6eoqAibNm3C4cOH8b//+7/YsWNHl2Oy2+2wWq0d3qQICgrSegjkAXaSg61kYCcZ2EkOtpKBnWRgJxmCDC6th+BVfTqp37lzJ3JzczFs2DAAwNy5cxEcHOz+/Lx589xLCzZu3Ii3334beXl5yMvLw3vvvYcTJ064P/fCCy8gLy8Po0ePxpYtW3D8+HH389xzzz0wGo0ICwtDXl4eioqKuhzTc889B7PZ7H6TtElebW2t1kMgD7CTHGwlAzvJwE5ysJUM7CQDO/mopjrg6w+Bfz4OvH0XAjb9RusReZVPXVMfGRnp/v+KouCVV17BTTfddMnjFEXBhg0bMGTIkE6fJzQ01P3/AwMD4XA4uvyay5cvx9KlS93vn9uMQAIJmzsQO0nCVjKwkwzsJAdbycBOMrCTj2isBUq2AqXbgPoSIDwWyLgGGL8AiM1CW02N1iP0qj6d1Ofn5+PgwYMoLCzE0KFD8fbbb7uvhb/Y7NmzsWLFCkyZMgXh4eFobm7GiRMnkJ2djdmzZ+P3v/89Vq9eDaPRiPr6etTV1WHQoEE9HlNISAhCQkKu9lsjIiIiIiIiLVirgJJtQOlWwFIBRCQAmZOBST8GojOBbjaak65Pl98nJCRgzZo1mD17NvLy8nDo0CFERkaiX79+lzz28ccfx/jx4zFx4kTk5uYiPz8fBQUFAIAVK1a4l9bn5uZixowZKCkp6ctvxSdcuB8B+S52koOtZGAnGdhJDraSgZ1kYKc+crYMKHgP+MePgLfvAjb9O+ByANcuA+ZsAO54FRg9B4gZ0OmEXm+dDIqiKH35BRsaGtz32du4cSOWL1+Ob775pi+HcFlWqxVmsxkWi8Xnb2lXW1uLhIQErYdB3WAnOdhKBnaSgZ3kYCsZ2EkGduoFiqIuoS/dBpRuBxpPAuZUIGOKejbelNzjp5TSydO5aZ9fU//KK6/g/fffh9PphMlkwjvvvNPXQ9CNtrY2rYdAHmAnOdhKBnaSgZ3kYCsZ2EkGdvICRQHqitSl9KXbgeYzQHQGkDEZmPFLIKr/VX8JvXXq80n9E088gSeeeKKvv6wu1dfXIyUlRethUDfYSQ62koGdZGAnOdhKBnaSgZ2ugKIApwrbJ/E7AJsFiM1SJ/E3/w6IiPP6l9RbJ5/a/Z56JjExUeshkAfYSQ62koGdZGAnOdhKBnaSgZ084HIBtV+ry+nLdgD2RiBuiLqU/tYXgPCYXh+C3jpxUi9Yc3Oz1kMgD7CTHGwlAzvJwE5ysJUM7CQDO3XC5QROHlZ3py/fCbS1APHDgMwpwKh7gVBznw9Jb504qRfMarVqPQTyADvJwVYysJMM7CQHW8nATjKwEwCnA6g5oE7iK3YDjlagf7Z6Jn7MA0BIlNYj1F0nTuoFS07u+U6P1PfYSQ62koGdZGAnOdhKBnaSwS87OduAqv1AyVag8iv11nKJueokfvwjQHC41iO8hN46cVIvmNVqRUxM719zQleHneRgKxnYSQZ2koOtZGAnGfyik8OuTt5LtgFV+9SN7pLz1I3t8pcAQWFaj7BbeuvESb1gjY2NWg+BPMBOcrCVDOwkAzvJwVYysJMMuuzU1gJU7FXPxFcXAIYAIGWMek385J8AxhCtR9hjeuvESb1gaWlpWg+BPMBOcrCVDOwkAzvJwVYysJMMuujU2gSU71Z3p68+CAQGAanjgEE3AFN/rr4vnC46XYCTesFOnz4Ns7nvd4uknmEnOdhKBnaSgZ3kYCsZ2EkGkZ3sDUDZLvU+8SePAMZQIG0CMPRWYNovgED9TRlFdroM/RXyIy0tLVoPgTzATnKwlQzsJAM7ycFWMrCTDCI6tZwFynaqk/jao+pGdmn5QPYdwPVPAwGBWo+w14no1AOc1AuWkZGh9RDIA+wkB1vJwE4ysJMcbCUDO8ngk52azwCl29Xl9Ke/BUJMQPokYNQPgPjhQECA1iPscz7Z6SpwUi9YTU0NoqK0v88jXR47ycFWMrCTDOwkB1vJwE4y+ESnptPqBL5kG3CmCAiLVifxY+cBcUMAg0Hb8fkAn+jkRZzUC2a327UeAnmAneRgKxnYSQZ2koOtZGAnGTTp1HBSXUpfsg04WwqExwEZ1wATFwExAzmJ74TejieDoiiK1oPwJVarFWazGRaLBSaTSevhXFZzczPCw8O1HgZ1g53kYCsZ2EkGdpKDrWRgJxn6pJOlsv1M/FbAWglE9lcn8ZlTgH4ZnMR7QMrx5Onc1P8uoNCRsrIyrYdAHmAnOdhKBnaSgZ3kYCsZ2EmGXulUXwoUvAts/BHw9l3AF88BiguY+igwZwMw+0/A6DlAdCYn9B7S2/HE5feCORwOrYdAHmAnOdhKBnaSgZ3kYCsZ2EmGq+6kKED9CXUpfel2oKkWMKepZ+GvfxIwJXtnoH5Ob8cTl99fRNLye5vNhtDQUK2HQd1gJznYSgZ2koGd5GArGdhJhh53UhSg7ri6lL50O9BSr55xz5wMZEwGIhN6baz+TMrxJHr5vd5+c9JbiouLtR4CeYCd5GArGdhJBnaSg61kYCcZuu2kKEDtN8Du14H184F3vgfsWQOExwK3PA/MWQ/c9gf1nvGc0PcavR1Pfb78/h//+Ad+8YtfIDg4GLfccgveeOMN7N27F9OnT8c999yDTZs2YfDgwVi3bh2efvpp/Otf/0JrayuGDBmC1atXIzo6Gg0NDVi6dCkOHDgAm82G/Px8rFy5EsHBwZg+fTrGjRuHXbt2oaqqCjfeeCNWrVrV199mn3C5XFoPgTzATnKwlQzsJAM7ycFWMrCTDJd0crmA2iPqcvqyHUBrExA/VD0Lf9uL6u3mqM/p7Xjq00l9bW0t5s+fj23btmHYsGFYu3Yt6urq3J+vq6vDrl27YDAY8Lvf/Q4RERHYvXs3AOA3v/kNnnrqKfzxj3/EsmXLcO211+L111+HoihYsGABXn75ZTz66KMAgKKiImzatAltbW0YMWIEduzYgUmTJnU6Jrvd3uGWBlartRf/Brxr6NChWg+BPMBOcrCVDOwkAzvJwVYysJMMQwcPAqoK1N3py3YCDhuQMBzImALk/QAINWs9RIL+jqc+ndTv3LkTubm5GDZsGABg7ty5WLx4sfvz8+bNg6F9x8aNGzfCYrFgw4YNAIDW1lZkZma6P7djxw689NJLAICWlhYEBga6n+eee+6B0WiE0WhEXl4eioqKupzUP/fcc3j22We9/r32hcLCQuTk5Gg9DOoGO8nBVjKwkwzsJAdbycBOPsrpAKoPqPeJL9+NlrNnEDR4knomfsxcICRS6xFSJ/R2PPnU7veRkef/o1cUBa+88gpuuummSx6nKAo2bNiAIUOGdPo8F256EBgYeNlr9JcvX46lS5e637darUhLS7uS4RMRERERkZ45WoGq/eokvuIrwOUAkkapu9OPX4Cyb4t1NVkkGXo8qXe5XAgI6Li/Xn19PaKju78eJD8/HwcPHkRhYSGGDh2Kt99+G62trZ0+dvbs2VixYgWmTJmC8PBwNDc348SJE8jOzsbs2bPx+9//HqtXr4bRaER9fT3q6uowaNCgnn47CAkJQUhISI//nC/Q27IRvWInOdhKBnaSgZ3kYCsZ2EkjDjtQsVddTl+5T/1Y8mh1d/r8HwFBHXdQZycZ9NbJ493v9+7diwEDBiAsLAx33HEHTp065f7cjBkzPHqOhIQErFmzBrNnz0ZeXh4OHTqEyMhI9OvX75LHPv744xg/fjwmTpyI3Nxc5Ofno6CgAACwYsUKhIWFIS8vD7m5uZgxYwZKSko8/VZ0o7CwUOshkAfYSQ62koGdZGAnOdhKBnbqI20tQPGXwKbfAe/eA/ztIXWDuwFTgbvfAu77b2D64+qZ+aBLb4nGTjLorZPHZ+p/9rOfYeXKlcjPz8d//ud/YurUqfjss8+QkpKCntzq/oYbbsAdd9wBQL02/qOPPkK/fv0umZQbjUb8+te/xq9//etLniMyMhIrV67s9Pm/+OKLDu+vX7/e47EREREREZEfaW0Cynepu9PXHAICg4DU8cDgm4Cpj6rvE/k4jyf1jY2NuO222wCoO9EPHToU119/PT777DP35naeeOWVV/D+++/D6XTCZDLhnXfe6fmoCYD+lo3oFTvJwVYysJMM7CQHW8nATl5is7ZP4rcCJ4+oZ9vTJgLDZwLTlwOBV7flGDvJoLdOHv9X29zc3OF6+jlz5iAoKAgzZszocEu47jzxxBN44oknej5SuoTedm3UK3aSg61kYCcZ2EkOtpKBna5Qy1l1+XzJVuDUUSA4EkjPB3LuAmY8AwQEdvsUPcFOMuitk8eT+smTJ+OTTz7BzJkz3R+75557YDAYMGfOnF4ZHF3exRsWkm9iJznYSgZ2koGd5GArGdjJQ81n1E3tSrYBdcfU+8KnTwLy7gfihwG9/PfITjLorZNB6ckF8R44ceIEBgwY4M2n7FNWqxVmsxkWiwUmk0nr4VyWzWbrcPs+8k3sJAdbycBOMrCTHGwlAzt1ofGUOokv3QacKQbCYoCMSUDGFCBuMNCDy4S9gZ1kkNLJ07mp139Fcdddd3n7KakLx48f13oI5AF2koOtZGAnGdhJDraSgZ3aNdQAh9YDH/0M+MudwKdPATYLMHExcP964K7XgXHzgfghfT6hB9hJCr11urqdIDrh5RP/dBlGo9fzUS9gJznYSgZ2koGd5GArGfy2k6VCXUpfuhWwVgGR/YGMycDknwL9MjSZuF+O33YSRm+dvP7d9GQnfLo66enpWg+BPMBOcrCVDOwkAzvJwVYy+EUnRQHOlrZP4rcBjScBU7K6lH7a44A5VesRdssvOumA3jrpa4cAP1NcXKz1EMgD7CQHW8nATjKwkxxsJYMuOykKUFcEfPUm8MEi4J3vAdteBowhwPVPA3M2ALNeAUbdI2JCD+i0kw7prROX3wsWEhKi9RDIA+wkB1vJwE4ysJMcbCWDLjopCnD6mLqUvnQH0HIGiB4AZE4BbvotEBmv9Qivmi46+QG9dfL6pP7OO+/09lNSFxITE7UeAnmAneRgKxnYSQZ2koOtZBDZyeVS7w1fug0o3Q7YrUDsYCBzMnDL80BErNYj9DqRnfyQ3jr1ePl9eXk5Zs6ciby8PABAQUEBVqxY4f78008/7bXB0eWVlpZqPQTyADvJwVYysJMM7CQHW8kgopPLBVQfBHa+Cvx1LvDu3UDBO+rS+Zkvqcvpv/M8MPy7upzQA0I6ke469fhM/aJFi3DffffhhRdeAADk5OTggQcewM9+9jOvD44uLywsTOshkAfYSQ62koGdZGAnOdhKBp/s5HICNQeBkq1A+S7AYQcSRqjL6fPuB0K7vq+2XvlkJ7qE3jr1eFJfW1uLOXPm4MUXX1SfwGjU3S0BpIiLi9N6COQBdpKDrWRgJxnYSQ62ksEnOjnbgOoD6iS+Yg/gbAUSR6qT+LEPASGRWo9Qcz7Ribqlt049no0bjcYOm+HV19dzczyNlJeXw2w2az0M6gY7ycFWMrCTDOwkB1vJoEknRytQtU+dxFfuAxQnkDRKvU/8hIVAcHjfjkcAHk8y6K1Tjyf13//+97Fo0SJYrVasWbMGq1atwiOPPNIbY6NuREbyt6ESsJMcbCUDO8nATnKwlQx90qnNBlTuVe8TX7Vf/VjKGHUSP+nHQFBo749BOB5PMuitU48n9cuWLcN7770Hi8WCTz/9FEuXLsV9993XG2OjbphM/nedkkTsJAdbycBOMrCTHGwlQ690am0GKnark/jqA0CAEUgdCwycDkz5GWAM9v7X1DkeTzLorVOPJvVOpxM333wzPvvsM/zgBz/orTGRh6qqqhATE6P1MKgb7CQHW8nATjKwkxxsJYNXOtkb1Q3tSrYCNYcAYwiQNgEYcgsw7XEgkPtkXS0eTzLorVOPjtzAwEA0NzfD5XIhIKDHd8MjL9Pbb5j0ip3kYCsZ2EkGdpKDrWS4ok42K1C2EyjdCpz8GggKA9ImAiNmAdc/BQQEen+gfo7Hkwx669TjX8eNHz8eM2fOxJw5czpcizBr1iyvDMhgMKC+vh79+vXr0ef8UXg4NyeRgJ3kYCsZ2EkGdpKDrWTwqFNLPVC6AyjdBpw6CoREAWn5wMjvAzOyAZ6U63U8nmTQW6ceT+oPHjwIAHj99dfdHzMYDF6b1JPnampqdHc7Bj1iJznYSgZ2koGd5GArGTrt1FSnTuBLtwF1x4FQM5A+CRg9B4gbykm8Bng8yaC3Tj2e1G/atKk3xtHBH/7wB3z88cdoamrCL3/5S9x///2XPCYzMxMbN25EXl4eAGDcuHH4wx/+gOnTp6OmpgY/+clPUFJSgpaWFtx+++347W9/2+vj7mvR0dFaD4E8wE5ysJUM7CQDO8nBVjJER0cDjbXqBL5kK3DmBBAeo+5MP/4RIHYQYDBoPUy/x+NJBr116vGkfvPmzZ1+fOrUqVc9mHMMBgP279+P4uJijBs3DpMnT0ZmZqbHf37u3Ll44oknMG3aNDgcDsycORN/+9vf8P3vf/+Sx9rtdtjtdvf7VqvVG99CnwgKCtJ6COQBdvJhiqKe2SjZClTshTk4DnDcDKSMVTcPIp/EY0oGdpKDrXyYtdo9iY+rPQ7EpAIZ1wD5PwRiBnIS74N4PMmgt05XdEu7c2w2GwoLC5GTk4N9+/Z5bVDn7ns/cOBATJ06FZs3b/Z4Ut/U1ITPP/8cJ0+edH+ssbERhYWFnT7+ueeew7PPPnvVY9ZCbW0tEhIStB4GdYOdfIiiqNcYlmwFynYANot6ZiNjMnD9U6jd9y9Elm4Dtr8CKC4gKQ/InAykjlc3FyKfwGNKBnaSg618yNny82fiG6qByET1dWjKz3CssgE5OTlaj5C6weNJBr116vGkfs+ePR3e3717N9atW+et8XTK0MlvIY1GI5xOp/t9m80GAFAUBQCwc+dOhIaGdvvcy5cvx9KlS93vW61WpKWlXe2Q+0RsbKzWQyAPsJOGXC6g9mv1B6SyHYC9Qb3GMHMycOsf1GWLFwgbej2QlKS+42wDqgrUHYN3rQacrUBirvpn0yYCwRF9//0QAB5TUrCTHGylEUUB6kvaJ/HbgKZawJQCZE4Bpi8HzCkdHh5rq9ZmnNQjPJ5k0Funq74Z5YQJE7Bo0SJvjMVt7dq1+NWvfoWSkhJs2bIF//mf/3nJYwYNGoRdu3Zh7Nix2L17t/tMfGRkJK677jo8//zz+NWvfgVAvQ+hy+VCamrqJc8TEhKCkBAusyXSBZdTve9u6Tb1PrytzUDCcPUHpFH3qhsIeSowCEgbr74BgNMB1BxUn3vvWqCtBeifrT532kQgVF+3RiEiIi9TFOBMMVCyBSjdDjSdBqIz1NeRG34JRCVqPUIiEuqKd78HAKfTiV27dqGtrc2rg3I6nRg9ejSamprwX//1X50uvf/tb3+LuXPnYvXq1Zg0aRKys7Pdn3vnnXewdOlS5OTkwGAwICIiAqtXr+50Ui9ZXV0dks6dVSSfxU69yOkAqg+oZ9PLd6tn0/vnqGfTxzyo3sqnBy7bKtAIpIxR3wD1FwgnD6tnV/b/BWhtUn+BkDEFSM8Hwvpd3fdGXeIxJQM7ycFWvURRgNPfnr/kq6VevQ4+YzJw078DkfE9ejp2koGdZNBbJ4Nybr26hwYMGOD+/0ajEYMHD8ZvfvMbjB071uuD04LVaoXZbIbFYoHJ5Ntn3vR2LYhesZMXOVqBqv3qJL7iK0Bxnl8SnzoBCL66e45eVSuXCzj1jTrJL9sB2K1A3BD1h7eMay5Z6k9XjseUDOwkB1t5SS+/DrCTDOwkg5ROns5Ne3ym/sSJE1c1MPIeb6+QoN7BTlfBYQcq9qpL3ivbN+NMHq1O4vN/BAR1v29GT1xVq4AAdTl+/2xg4sKOZ2j++RjQfAaIzWr/4W5yj8/Q0Hk8pmRgJznY6gpduGKrfGf7JV/D1BVbuXd7fcUWO8nATjLorVOPJ/WzZ8/Gxo0bu/0Y9b76+nqkpKR0/0DSFDv1QFsLULFH/QGpugAwBKjL3TOvBSb/tNdvM+fVVgYDED9UfRv/8AXXUm4FPn0KaDqlXkuZMVm9npLXUnqMx5QM7CQHW3nI6QBqDrRP4nepv3hOzFEn8WMe6PElXz3FTjKwkwx669TjSX1ZWdklHysqKvLKYKhnEhM5CZCAnS6jtUn9wahkm7rBXWAQkDoOGHQDMPXn6vt9qFdbGQzqmfrYLGDsXHWSf7ZUneR/9izQeBIwp6oT/IzJl+x6TOfxmJKBneRgqy5ceBeU8j2Aq+38JV/jH+7zu6CwkwzsJIPeOnk8qV+9ejVWrVqFb7/9FmPGjHF/3GKxdNikjvpOc3Oz1kMgD7DTBWzW9kn8VuDkEXX5fNpEYNht6u17Aq/6hhxXpU9bGQxAdKb6NnqO+rFz9yf+4rmO9yfOmKye1ScAPKakYCc52Kqdw65e6lW6Vf1fxQUk5an/Dk9cDASFaTo8dpKBnWTQWyePf4K+5ZZbMHToUCxZsgQrVqxwf9xkMiE3N7dXBkeXZ7VatR4CecCvO7WcVTcLKtkKnDoKBEeqO8Pn3AXMeAYICNR6hB1o3qpfGtDvXvX2ewBgrVYn+VtXAJZyICJe3WwpY7K6g7LBoO14NaJ5J/IIO8nht63abOolX6Xb1E1YDQFA8hh1En/NT3r9kq+e8ttOwrCTDHrr1OPd7/VO0u73Z86cQUwMd9T2dX7VqfmMeu/d0m3AqUL1vvDpk9QfkOKHq5vJ+TCfb9VYq/7dlmwD6k8AYdHtk/wpQNxgv5nk+3wnAsBOkvhNq9Ym9fanpduA6oPqJV4pY9XLnpLyAGOw1iO8LL/pJBw7ySClU6/tft/S0oJXXnkFBQUFsNls7o9/8MEHVzZSumJWq1XEf4z+TtedGk+pPxyVblM3gQuLVifxY+ept/ERNsn0+VaRCUD2HeobADTVqX/3e98ATh9Td1pOn6T+gBo/TNzfv6d8vhMBYCdJdNvK3nD+kq+aw+qZ97QJwNDvANN+ofklXz2l2046w04y6K1Tj/81W7BgAUwmE7Zv345ly5Zh3bp1mDp1am+MjbrR2Nio9RDIA7rq1FCj/nBUug2oLz2/HHziYl0sBxfXKiIWGDFLfQOAlnqgdAew/211pURwxPmVEgnZPr9SwlPiOvkpdpJDN61sFqBsp/o6VfsNEByu7tsyYjZw/dM+d8lXT+mmk86xkwx669Tj5fcjR47EoUOHkJubi4MHD6KhoQG33XYbNm/e3Ftj7FOSlt9bLBaYzWath0HdEN3JUqEu9S7dClgq1duuZUxWJ4n9MsRP4i8mulVnbBagbJfa7+TX6iZPaRPVfom5Yn/A1V0nnWInOcS2aj7Tvm/LNuB0oXpLufRJ6utUwgjd/CLzHLGd/Aw7ySClU68tvw8LU3f+NBqNaGpqQlRUFE6dOnXlI6Urdvr0aRH/Mfo7UZ3qS8+fiW+oAUzJ6lLuqY+pm7jpnKhWngg1A0NuUt8AwN6oLkX95v8Bm55rv4Xg+PbrSUf1+S0Er5TuOukUO8khplXT6fP7itQdb99XZBIw5kEgfqjuftF8MTGd/Bw7yaC3Tj2e1MfExKC+vh633norbr75ZsTFxSE1NbU3xkbdaGlp0XoI5AGf7aQo6nXwpdvUze2aTgHmNHWCd/3TgClJ6xH2OZ9t5S0hkcCgGeobALQ2qzs/H/sU+PI/1DP3qePUjfeSR/vsplG676QT7CSHz7ZqONk+id+qbg4aHqeuNJqwEIjN0v0k/mI+24k6YCcZ9Napx8vvnU4nAgMDoSgK3n33XdTX1+PBBx/0+aXqnpK0/L6hoQFRUVFaD4O64TOdFEXdTK10qzqJb6kHogecvw96ZILWI9Scz7TSSpsNqNyrngWr2q9+LGWM+t9HylggKFTb8bXz+05CsJMcPtPKWnXBJV8VQESCum9L5mT19crPJvEX85lOdFnsJIOUTr22/D4wMBDV1dUoLCzE/fffj7a2NvCueNqoqakR8R+jv9Osk8ul3hv+3Jl4uxWIHaz+cHTL79VN1qgDvz+mgkLVlRqZU9T3Ha1A1T71LNmOPwKKU12mnzFZXbYfHK7JMP2+kxDsJIdmrc6WnZ/EN9S079syBbh2GdAvve/H4+N4TMnATjLorVOPJ/Xr16/HsmXLYDAYUFJSgq+//hrLly/HJ5980hvjo8uw2+1aD4E80GedXC7g5GF1El+2Q70fb/wwdYI28yX12kO6LB5TFzEGA+n56hsAONuA6gPqJH/3a4CzFUgcqU7y0yaqy/v7ADvJwE5y9EkrRVGX0Jecu+SrFjCnqpP4655U93Chy+IxJQM7yaC3Tj1efj927Fh8+umnuOGGG7B/v7o8Mzs7G0eOHOmVAfY1Scvvm5ubER6uzZky8lyvdXI5gZqD6g9I5buAthag/wj1B6T0ieomadQjPKZ6yOkATh7q4r/BfCC0d/4NZScZ2EmOXmmlKEBdkXoWvmQb0FwHRGeqv2jOmAxE9ffu1/MDPKZkYCcZpHTq1eX3sbEdl+0GB/vmZkp6V1ZWhmHDhmk9DOqG1zpdeJa0Yk/Hs6Rj5/XZWVI94zHVQ4FGdUO95NEAfqz+ounkEXW1SME7QGvj+dUi6ZOAsH5e+bLsJAM7yeGVVooCnCps37dlB2A7C8RktV/y9RwQEeeVsfozHlMysJMMeuvU40l9VFQUTp48CUP7ZiWff/45YmJivD4w6p7D4dB6COSBK+504fXMlV8Biuv89cwTFmp2PbOe8Zi6SgGBQFKu+pa/pOO+Dh8vBWyW8/s6ZEwGwq/stYOdZGAnOa6olcsF1H59/pIvewMQN1Q9vm994YqPb+oajykZ2EkGvXXyePn9kSNHkJ2djb1792LhwoUoLi5GTk4OTpw4gY8//hh5eXm9PNQr873vfQ8zZ87EvHnzPHq8pOX3NpsNoaG+sRs1dc3jTh12Ht8HwOCTO4/rGY+pXtbhDgw71OW4MQN7fAcGdpKBneTwqJXLCdQcap/E71Qvt0kY3r4SJ5+XfPUBHlMysJMMUjp5ffn9Aw88gH379uHf/u3fsGnTJmzfvh2KouCaa65Bv379vDFmjzgcDhiNPV5goEvFxcUYMWKE1sOgbnTZ6dw9wku3AVUF6lnOlLHAwGnAlJ/57D3C9YzHVC8zGID4IerbuPnqJP9MsXoM/N8zQGOtuuP1uWtuTUmdPg07ycBOcnTayukAatov+SrfDTjs6iVfmZOBMQ8CIfrZNVoKHlMysJMMeuvk8ezYZrPh/fffR3V1NTZv3uy+jd3mzZsBALNmzeqdEQIwGAx45pln8Mknn2D69Ol45plnsHTpUhw4cAA2mw35+flYuXIlgoODcfToUcyfPx8WiwWDBw9Gc3Nzr41Lay6XS+shkAfcneyN6mZipdvUsx2BweptwQbfBEx9FAgM0nagxGOqrxkMQGyW+jbmQfVj9aXqJOJfv1FvcWVOUTfey5ys7pQNdpKCneRwuVzqvi1V+89f8uVsUy+lyZgMjH8ECI7Qeph+j8eUDOwkg946ebz8/sMPP8SqVauwZcsWjBs3ruOTGAz417/+1SsDPPf8zz77LJ555hkAwMKFCzFlyhQ8+OCDUBQFCxYswNChQ/Hoo49i/PjxWLx4MR5++GEcOnQI48aNw+rVq7tcfm+32zvc0sBqtSItLU3E8vu2tjYEBXEi6LNsVqBsJ5wnNiPw1FEgKEy97VfmZCAxVz0zTz6Fx5QPslScv4+1tQqI7A9Haj6MWVOBfhnqLwbIJ/F48nEOuzp5L9kGV8VeBBgMQHKeOolPHae+ZpFP4TElAzvJIKWTp8vve3xLu5/+9Kd4+eWXr3qAPWEwGFBeXo7UVPUsTUJCAvr374/AQHVS1NLSgunTp+OFF15AbGwsbDab+3MzZszAAw880OWk/le/+hWeffbZSz4uYVJ/+PBh5OTkaD0MOqelXr1OuHSbujlYSBSQlo/jjv4YdM3tQECA1iOkbvCYEsBajfJt7yPNWQqcLQPC44CMa9Ql+zEDOcn3ITyefExbi3rJV8k2oLoAMAS079syBUfOhiB71BitR0jd4DElAzvJIKVTr93Srq8n9OdERp6/XZeiKNiwYQOGDBnS4TFWq/WSP2fo5ge85cuXY+nSpR2eIy0t7SpHS36hqU6dwJduUzf/Cuun3rZr9Bx1B+D2Sbzt8GFO6Im8xZQES9oNSDv3Qtx4Sj0Gd61Sr88Pi1aPw8wpQNwQTvLJf7U2qZd8lWwDag62X/I1Dhh0AzD15x0u+VIaDms4UCIiulo9PlOvBYPBgPr6eveGfAsWLIDL5cLq1athNBpRX1+Puro6DBo0CBMmTMCSJUvw0EMP4ciRIxg7dixWrVqly93vpSwb0Y3GWnXyULJNnTyExwIZk9TrfeMGdzl5YCc52EqGy3ZqqgPKtqvHad0xIMSknsnPmAzED+Mv2PoQj6c+Zm8Aynapl6rUHFbvmJI6Qf0FV2IuENj1eRy2koGdZGAnGaR06rXl91q4eFLf2NiIX/ziF/jiiy8QEBAAo9GI//iP/8ANN9yAo0eP4qGHHkJDQwMGDx6MpqYm3Hfffbqc1EtZNiKWtbp9Er9VXeYbmXB+ctCDZb7sJAdbydCjTi316u23SrYCpwrVzb7S89XjuH8OJ/m9iMdTL2s5q/63XboVqD0KBIcDafnqvi39c3q0bwtbycBOMrCTDFI69dryey1c/HuHyMhIrFy5stPHDhs2DDt27OiLYZHenC0/P4lvqAYiE9Ufjqb8DIjO0Hp0RHQlwqKBod9R3wB1A8vyXcDhDeoO+8YQdQPLjMndns0k0lTzGaB0e/slX9+qq1DSJwGjfgDED+cvqIiI/JiIM/V9SdKZeinLRnySogBn22+dVbINaDyp3i4rc4p6Nr791lnewE5ysJUMXu1kbwQqdrdfd3xIvc44dZx6WU1yHm81eRV4PF2lc/tFlG4D6oqA8Jhe2y+CrWRgJxnYSQYpnXS1/L4vSZrUS1k24hMURb0OvmSreqaj+TTQL109O5c5BYhK7LUvzU5ysJUMvdqptVndIbx0G1BVoC5hbt8hHClj1DP75BEeTz3UcFJdSl+yFagvASLiz79G9fKdHdhKBnaSgZ1kkNJJV8vvqXMBXGrXNUVRlyeWbAXKdqjX1cYMVH9Auum3QGR8nw2FneRgKxl6tVNwODBwmvoGAG229nt5bwG2vQxAAZLHqJfmpIxTNyOjTvF46oal8vwlX9ZKILK/ulLsmp8A0Zl9eucGtpKBnWRgJxn01oln6i8i6Uy9zWZDaCh/oAQAuFzAqW/UJbRlOwC7VV2emDFZ/SEpPEazobGTHGwlg6adHK1A1X71jGrFV4DLASSNUif5qRPUXwoQAB5Pl6gvPX8HlcYaICqp/ZKvyUA/bW+ly1YysJMM7CSDlE48U+8Hjh8/LmLZSK9wOYGTh9Ufjsp3qktmE4apS2Rz71bvGe8j/LqTMGwlg6adjMFA+kT1DQCcDqD6gDrJ3/064GxVdx7PnKzuRB4Sqc04fYBfH0/nLvkq3aZe8tV0CjCnqZP4658ETMlaj7ADv24lCDvJwE4y6K0TJ/WCGY1+lM/pAGoOqssUy3cBDjvQP1v9AWn0HCDUd1dV+FUn4dhKBp/qFGgEUseqb4D6C8eaQ+q/VV+9CbQ1Awkj1H+r0vOBULO24+1DPtWptykKUHe8fd+WbepO9TED1O43/lq9JaoP86tWgrGTDOwkg946cfn9RSQtv29ubkZ4uE6Xejrb1E2qSrcCFXvV9xNHtp/9mqjea1oIXXfSGbaSQVQnlwuoPXL+0qDWRiB+WPulQZPUW+7plKhOPaUowKmj5/dtsVmA2EHtXScDEbFaj7BHdN1KR9hJBnaSQUonLr/3A8XFxfpZNuKwA5X71El85T5AcQFJeeokfuJiIChM6xFeMV110jm2kkFUp4AA9ReSiSOB/MUdJ4MfLxM/GbwcUZ26c8kvZ5qA+KFqs9teFP/LGV210jF2koGdZNBbJ07qBQsJEXxrpTbbBbeN2g8YAs7vKH3NT3R12yjRnfwMW8kgupPBACQMV98mLOi4bPt/fgE016nLts/dyszHl21fjuhOLmf7JV/b1Eu+2lqA/iPUfVvyfqC7yyhEt/Ij7CQDO8mgt05cfn8RScvvGxoaEBUVpfUwPNPaDFTsVn9wrT4ABAQBqePUH1qT8tTNp3RKVCc/x1Yy6LqTogD1J9TJZOl2oPGkujN6xhT1l54+tsHa5YjqdG7Dw5It6i+c3RseTlEv+dL5hoeiWvkxdpKBnWSQ0onL7/1AaWmp7y4bsTeoZzdKtqm71AcGA2kTgCHfAab9Qt1cyk/4dCfqgK1k0HUngwGIGai+jXlA/di5W6H969+Bhmp1Yu8jt0K7HJ/udLlbE05Y6He3JvTpVuTGTjKwkwx66+Q/MysdCgvzoevMbRagbKd6Jr72G/UHorSJwIjbgeufAgICtR6hZnyqE10WW8ngd52iM9S3vPvU9y2V6iR/8wuAtRKISFAnoxmTgehM9RcDPsCnOrXZgMqv1L+3yn3qx5JHq39v+T8Cgnz/XsW9yadaUZfYSQZ2kkFvnTipFywuLk67L958Rt0sqGQbcLoQCIkC0icBufeot28KCNBubD5G007UI2wlg993MqcAuXerbwDQUKNOVre/ApwtBcJjgYxr1CX7sVmaTfI17dTWApTvbt+3pQAIMAIpY4ABU4HJ/6brS76uhN8fU0KwkwzsJIPeOnFSL1h5eTnM5j7arKfptPrDUck2dVOnsGj1dkxjHlR3APaRM0O+qE870VVhKxnY6SJRiUDOXeobADSeAsq2A7tfA84UAaH91H+vM6b06b/Xfdqptan9kq+tQM0h9ZKv1PHA4JuAqY8CgUF9Mw6heEzJwE4ysJMMeuvESb1gkZG9uHFPw0l1El+6DThz4vyZnwkL1NsvcRLvsV7tRF7FVjKwUzci49VLn0bcrr7ffEbddG/fm8Dpb8+vrMqY3Ksrq3q1k816fhJ/8oi6fD5tIjD8u8D0J/xq3xZv4DElAzvJwE4y6K0TX/UE8+ru/Naq9t2WtwKWCvUazYxrgEk/AqIHcBJ/FXz9Lgp0HlvJwE49FB4DDJ+pvgFAy1l1D5SD/w3UHm3fAyVfvb68f47X9kDxaqeWs+2XfG0FTh0FgiOB9Hx1dcKMZ/x63xZv4DElAzvJwE4y6K0TJ/WCVVVVISYm5sr+8Nmy85P4hhp1+WbGFODaZUC/dO8O1M9dVSfqU2wlAztdpbB+wNBb1DdAvVtJ2S7gyN+Bf/0WMIYAqRPUSX7iqCs+631VnZrPXHDJ1zH1vvDpk4C8+4H4Ydy3xct4TMnATjKwkwx666T7Sf33vvc9zJw5E/PmzdN6KF7n8W+YLnff4+lPqJsuUa/R228C9YytZGAnLwuJAgbfoL4B7den7wYK/wl88Xt1k7nUcept9JJHe3x9eo86NZ5qn8RvBc4Ut1/yNQkYNx+IG8zVYr2Mx5QM7CQDO8mgt07iJvUOhwNGo7hh94rw8C7uo6soQF2Reha+ZBvQXKfe5ihzMnDDL9Wz8tRnuuxEPoetZGCnXhYcAWRdp74B6k7yFXuA458DW14EYABSxqqvKSlj1TP7nbhsp4YadQJfug2oLwUi4tVLvvKXADEDOYnvYzymZGAnGdhJBr11EjE7NhgMeOaZZ/DJJ59g+vTpeOaZZ7B06VIcOHAANpsN+fn5WLlyJYKDg3H06FHMnz8fFosFgwcPRnNzs9bD7zU1NTXq7RgUBThVqE7iS3cAtrNATJb6A9ctzwER+rplgzTuTuTz2EoGdupjQWHqreAGTFXfd9jVe76XbAO2/RcART2DnzFZPaMfpN77t0MnS8X5S76sVUBkf/Xxk38K9MvgJF5jPKZkYCcZ2EkGvXUSMakHgMDAQOzZswcAsHDhQlx77bV4/fXXoSgKFixYgJdffhmPPvooHnjgASxevBgPP/wwDh06hHHjxuG+++7r8nntdjvsdrv7favV2uvfi1c0nkJq5cfAN39Qr4eMG6pO4m99Qd0UiXxGdHS01kMgD7GVDOykMWOIelY94xr1fUcrUF2gnnnftQpwtgFJuUhRIoHjf1Iv+TIlq5d8TXscMKdqOny6FI8pGdhJBnaSQW+dxEzq58+f7/7/GzduxI4dO/DSSy8BAFpaWhAYGAir1YqCggL39fMjR47ElClTLvu8zz33HJ599tleG3evcbWpS+qnLVY3ECKfFRTE+yNLwVYysJOPMQYDaRPUNwBwOoCaAwgoOwKMfxowJWk7PuoWjykZ2EkGdpJBb53EbB974b0EFUXBhg0bUFBQgIKCAhQWFmL16tWd/jlDN0v6li9fDovF4n4rLy/36rh7jSkZFeHZnNALUFtbq/UQyENsJQM7+bhAI5AyFuVRYzihF4LHlAzsJAM7yaC3TmIm9ReaPXs2fv/738PhcAAA6uvrcfz4cZhMJowePRpvvfUWAODIkSPYunXrZZ8rJCQEJpOpw5sUsbGxWg+BPMBOcrCVDOwkAzvJwVYysJMM7CSD3jqJnNSvWLECYWFhyMvLQ25uLmbMmIGSkhIAwFtvvYXXXnsNOTk5eOqppzB16lRtB0tERERERETUS0RcU68oSof3IyMjsXLlyk4fO2zYMOzYseOqv5aEDfNKS0sRERGh9TCoG+wkB1vJwE4ysJMcbCUDO8nATjJI6XRuTnrxfPhiIib1famhoQEAkJaWpvFIiIiIiIiIyN81NDTAbO56LzWD0t2038+4XC5UVVUhKiqq2032tGS1WpGWloby8nJR+wD4G3aSg61kYCcZ2EkOtpKBnWRgJxkkdVIUBQ0NDUhOTkZAQNdXzvNM/UUCAgKQmirnHrrSNvfzV+wkB1vJwE4ysJMcbCUDO8nATjJI6XS5M/TniNwoj4iIiIiIiIg4qSciIiIiIiISi5N6oUJCQvDLX/4SISEhWg+FLoOd5GArGdhJBnaSg61kYCcZ2EkGPXbiRnlEREREREREQvFMPREREREREZFQnNQTERERERERCcVJPREREREREZFQnNT7sJ/85CfIzMyEwWBAQUFBl4974403MHjwYGRlZWHBggVoa2vru0ESAM9affHFFwgLC0NeXp77raWlpW8H6udsNhtmz56NIUOGYNSoUbjxxhtx/PjxTh/70UcfYdiwYRg8eDDuvPNOWK3WPh6t//K0U0lJCQIDAzscU0VFRRqM2H/ddNNNyM3NRV5eHq699lrs37+/08fxdUp7nrTi65TvWLt2LQwGAzZu3Njp5/ka5Rsu14mvUdrLzMzE0KFD3X//77//fqeP08VrlEI+68svv1TKy8uVjIwMZf/+/Z0+pri4WElKSlKqq6sVl8ulfPe731VWrlzZtwMlj1pt2rRJGTVqVJ+OizpqaWlRPv74Y8XlcimKoiivvPKKMm3atEse19DQoCQkJCjffPONoiiK8qMf/Uj5+c9/3pdD9Wuedjpx4oRiNpv7dnDUQX19vfv/f/DBB0pubu4lj+HrlG/wpBVfp3zDiRMnlEmTJin5+fnK3//+90s+z9co39BdJ75Gae9yP5efo5fXKJ6p92FTp05FamrqZR+zfv16zJo1C4mJiTAYDFi8eDHee++9PhohneNJK9JeaGgobr31VhgMBgBAfn4+SkpKLnncP//5T4wePRrDhg0DAPzwhz/kcdWHPO1E2uvXr5/7/1ssFnezC/F1yjd40oq053K58Mgjj+CVV17p8nZbfI3SniedSAa9vEYZtR4AXZ2ysjJkZGS438/MzERZWZmGI6LLKSoqwpgxYxAYGIiHHnoIP/zhD7Uekl97+eWXcfvtt1/y8c6Oq+rqajgcDhiN/Gezr3XVCQCampowfvx4OJ1OzJ49G08++SQCAwP7eIT+7cEHH8SmTZsAAJ988skln+frlO/orhXA1ymtvfTSS5g8eTLGjh3b5WP4GqU9TzoBfI3yBQ8++CAURcGECRPw/PPPIz4+vsPn9fIaxSOfqI+MGTMGFRUVMJvNqKiowK233oq4uDjcfffdWg/NL/3ud7/D8ePH8fnnn2s9FLqMy3VKSkpCZWUlEhIScObMGdxzzz148cUX8dhjj2kwUv/11ltvAQDefPNNPP74411OFkl73bXi65S2Dh8+jA0bNmDz5s1aD4Uuw9NOfI3S3ubNm5Geno62tjY89dRTmDt3rm5fo7j8Xrj09HSUlpa63y8pKUF6erqGI6KumEwmmM1mAEBqaip+8IMfYMuWLRqPyj/94Q9/wAcffIB//vOfCA8Pv+TznR1XSUlJPAPSx7rrFBISgoSEBABATEwM5s+fz2NKQ3PnzsWmTZtQV1fX4eN8nfI9XbXi65S2tmzZgpKSEgwePBiZmZnYuXMnFi5ciFdffbXD4/gapS1PO/E1SnvnXmuCgoLwb//2b53+/evlNYqTeuHuuusufPjhh6ipqYGiKFi1ahXuvfderYdFnaiurobL5QIANDQ04KOPPsLo0aM1HpX/eemll/Dee+/h//7v/zpcY3qhW265Bfv27cPRo0cBAH/60594XPUxTzrV1ta6d6i12+344IMPeEz1obNnz6Kqqsr9/saNGxEbG4uYmJgOj+PrlPY8bcXXKW0tWbIE1dXVKCkpQUlJCfLz8/Haa69hyZIlHR7H1yhtedqJr1HaampqwtmzZ93vv/fee53+/evlNYqTeh+2aNEipKamoqKiAjfffDMGDRoEAHjkkUfw4YcfAgAGDhyIZ599FpMnT8agQYMQHx+PRYsWaTlsv+RJqw0bNmDkyJEYNWoU8vPzceONN+Khhx7Scth+p6KiAsuWLcPZs2dx3XXXIS8vDxMnTgQAPPPMM1i1ahUAICoqCmvWrMHs2bMxaNAgVFRU4Omnn9Zy6H7F005bt27F6NGjMWrUKIwZMwaJiYl48skntRy6X7FYLJg9e7b737WVK1fio48+gsFg4OuUj/G0FV+nfBdfo2Tga5TvOHnyJK677jrk5uZi5MiR+PLLL92XIOnxNcqgKIqi9SCIiIiIiIiIqOd4pp6IiIiIiIhIKE7qiYiIiIiIiITipJ6IiIiIiIhIKE7qiYiIiIiIiITipJ6IiIiIiIhIKE7qiYiIiIiIiITipJ6IiIiIiIhIKE7qiYiIiIiIiITipJ6IiIiIiIhIKE7qiYiIiIiIiITipJ6IiIiIiIhIqP8fBVILjBROof8AAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "evset = tp.event_set(\n", "\ttimestamps=[1, 2, 3, 4, 5],\n", @@ -887,21 +365,10 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": null, "id": "82552e04", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "figure = evset.plot(\n", " style=\"marker\",\n", @@ -927,351 +394,10 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": null, "id": "37feddd0", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "\u001b[33mWARNING: There was an error checking the latest version of pip.\u001b[0m\u001b[33m\n", - "\u001b[0m" - ] - }, - { - "data": { - "application/javascript": [ - "(function(root) {\n", - " function now() {\n", - " return new Date();\n", - " }\n", - "\n", - " const force = true;\n", - "\n", - " if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n", - " root._bokeh_onload_callbacks = [];\n", - " root._bokeh_is_loading = undefined;\n", - " }\n", - "\n", - "const JS_MIME_TYPE = 'application/javascript';\n", - " const HTML_MIME_TYPE = 'text/html';\n", - " const EXEC_MIME_TYPE = 'application/vnd.bokehjs_exec.v0+json';\n", - " const CLASS_NAME = 'output_bokeh rendered_html';\n", - "\n", - " /**\n", - " * Render data to the DOM node\n", - " */\n", - " function render(props, node) {\n", - " const script = document.createElement(\"script\");\n", - " node.appendChild(script);\n", - " }\n", - "\n", - " /**\n", - " * Handle when an output is cleared or removed\n", - " */\n", - " function handleClearOutput(event, handle) {\n", - " const cell = handle.cell;\n", - "\n", - " const id = cell.output_area._bokeh_element_id;\n", - " const server_id = cell.output_area._bokeh_server_id;\n", - " // Clean up Bokeh references\n", - " if (id != null && id in Bokeh.index) {\n", - " Bokeh.index[id].model.document.clear();\n", - " delete Bokeh.index[id];\n", - " }\n", - "\n", - " if (server_id !== undefined) {\n", - " // Clean up Bokeh references\n", - " const cmd_clean = \"from bokeh.io.state import curstate; print(curstate().uuid_to_server['\" + server_id + \"'].get_sessions()[0].document.roots[0]._id)\";\n", - " cell.notebook.kernel.execute(cmd_clean, {\n", - " iopub: {\n", - " output: function(msg) {\n", - " const id = msg.content.text.trim();\n", - " if (id in Bokeh.index) {\n", - " Bokeh.index[id].model.document.clear();\n", - " delete Bokeh.index[id];\n", - " }\n", - " }\n", - " }\n", - " });\n", - " // Destroy server and session\n", - " const cmd_destroy = \"import bokeh.io.notebook as ion; ion.destroy_server('\" + server_id + \"')\";\n", - " cell.notebook.kernel.execute(cmd_destroy);\n", - " }\n", - " }\n", - "\n", - " /**\n", - " * Handle when a new output is added\n", - " */\n", - " function handleAddOutput(event, handle) {\n", - " const output_area = handle.output_area;\n", - " const output = handle.output;\n", - "\n", - " // limit handleAddOutput to display_data with EXEC_MIME_TYPE content only\n", - " if ((output.output_type != \"display_data\") || (!Object.prototype.hasOwnProperty.call(output.data, EXEC_MIME_TYPE))) {\n", - " return\n", - " }\n", - "\n", - " const toinsert = output_area.element.find(\".\" + CLASS_NAME.split(' ')[0]);\n", - "\n", - " if (output.metadata[EXEC_MIME_TYPE][\"id\"] !== undefined) {\n", - " toinsert[toinsert.length - 1].firstChild.textContent = output.data[JS_MIME_TYPE];\n", - " // store reference to embed id on output_area\n", - " output_area._bokeh_element_id = output.metadata[EXEC_MIME_TYPE][\"id\"];\n", - " }\n", - " if (output.metadata[EXEC_MIME_TYPE][\"server_id\"] !== undefined) {\n", - " const bk_div = document.createElement(\"div\");\n", - " bk_div.innerHTML = output.data[HTML_MIME_TYPE];\n", - " const script_attrs = bk_div.children[0].attributes;\n", - " for (let i = 0; i < script_attrs.length; i++) {\n", - " toinsert[toinsert.length - 1].firstChild.setAttribute(script_attrs[i].name, script_attrs[i].value);\n", - " toinsert[toinsert.length - 1].firstChild.textContent = bk_div.children[0].textContent\n", - " }\n", - " // store reference to server id on output_area\n", - " output_area._bokeh_server_id = output.metadata[EXEC_MIME_TYPE][\"server_id\"];\n", - " }\n", - " }\n", - "\n", - " function register_renderer(events, OutputArea) {\n", - "\n", - " function append_mime(data, metadata, element) {\n", - " // create a DOM node to render to\n", - " const toinsert = this.create_output_subarea(\n", - " metadata,\n", - " CLASS_NAME,\n", - " EXEC_MIME_TYPE\n", - " );\n", - " this.keyboard_manager.register_events(toinsert);\n", - " // Render to node\n", - " const props = {data: data, metadata: metadata[EXEC_MIME_TYPE]};\n", - " render(props, toinsert[toinsert.length - 1]);\n", - " element.append(toinsert);\n", - " return toinsert\n", - " }\n", - "\n", - " /* Handle when an output is cleared or removed */\n", - " events.on('clear_output.CodeCell', handleClearOutput);\n", - " events.on('delete.Cell', handleClearOutput);\n", - "\n", - " /* Handle when a new output is added */\n", - " events.on('output_added.OutputArea', handleAddOutput);\n", - "\n", - " /**\n", - " * Register the mime type and append_mime function with output_area\n", - " */\n", - " OutputArea.prototype.register_mime_type(EXEC_MIME_TYPE, append_mime, {\n", - " /* Is output safe? */\n", - " safe: true,\n", - " /* Index of renderer in `output_area.display_order` */\n", - " index: 0\n", - " });\n", - " }\n", - "\n", - " // register the mime type if in Jupyter Notebook environment and previously unregistered\n", - " if (root.Jupyter !== undefined) {\n", - " const events = require('base/js/events');\n", - " const OutputArea = require('notebook/js/outputarea').OutputArea;\n", - "\n", - " if (OutputArea.prototype.mime_types().indexOf(EXEC_MIME_TYPE) == -1) {\n", - " register_renderer(events, OutputArea);\n", - " }\n", - " }\n", - " if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n", - " root._bokeh_timeout = Date.now() + 5000;\n", - " root._bokeh_failed_load = false;\n", - " }\n", - "\n", - " const NB_LOAD_WARNING = {'data': {'text/html':\n", - " \"
\\n\"+\n", - " \"

\\n\"+\n", - " \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n", - " \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n", - " \"

\\n\"+\n", - " \"
    \\n\"+\n", - " \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n", - " \"
  • use INLINE resources instead, as so:
  • \\n\"+\n", - " \"
\\n\"+\n", - " \"\\n\"+\n", - " \"from bokeh.resources import INLINE\\n\"+\n", - " \"output_notebook(resources=INLINE)\\n\"+\n", - " \"\\n\"+\n", - " \"
\"}};\n", - "\n", - " function display_loaded() {\n", - " const el = document.getElementById(null);\n", - " if (el != null) {\n", - " el.textContent = \"BokehJS is loading...\";\n", - " }\n", - " if (root.Bokeh !== undefined) {\n", - " if (el != null) {\n", - " el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n", - " }\n", - " } else if (Date.now() < root._bokeh_timeout) {\n", - " setTimeout(display_loaded, 100)\n", - " }\n", - " }\n", - "\n", - " function run_callbacks() {\n", - " try {\n", - " root._bokeh_onload_callbacks.forEach(function(callback) {\n", - " if (callback != null)\n", - " callback();\n", - " });\n", - " } finally {\n", - " delete root._bokeh_onload_callbacks\n", - " }\n", - " console.debug(\"Bokeh: all callbacks have finished\");\n", - " }\n", - "\n", - " function load_libs(css_urls, js_urls, callback) {\n", - " if (css_urls == null) css_urls = [];\n", - " if (js_urls == null) js_urls = [];\n", - "\n", - " root._bokeh_onload_callbacks.push(callback);\n", - " if (root._bokeh_is_loading > 0) {\n", - " console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n", - " return null;\n", - " }\n", - " if (js_urls == null || js_urls.length === 0) {\n", - " run_callbacks();\n", - " return null;\n", - " }\n", - " console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n", - " root._bokeh_is_loading = css_urls.length + js_urls.length;\n", - "\n", - " function on_load() {\n", - " root._bokeh_is_loading--;\n", - " if (root._bokeh_is_loading === 0) {\n", - " console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n", - " run_callbacks()\n", - " }\n", - " }\n", - "\n", - " function on_error(url) {\n", - " console.error(\"failed to load \" + url);\n", - " }\n", - "\n", - " for (let i = 0; i < css_urls.length; i++) {\n", - " const url = css_urls[i];\n", - " const element = document.createElement(\"link\");\n", - " element.onload = on_load;\n", - " element.onerror = on_error.bind(null, url);\n", - " element.rel = \"stylesheet\";\n", - " element.type = \"text/css\";\n", - " element.href = url;\n", - " console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n", - " document.body.appendChild(element);\n", - " }\n", - "\n", - " for (let i = 0; i < js_urls.length; i++) {\n", - " const url = js_urls[i];\n", - " const element = document.createElement('script');\n", - " element.onload = on_load;\n", - " element.onerror = on_error.bind(null, url);\n", - " element.async = false;\n", - " element.src = url;\n", - " console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n", - " document.head.appendChild(element);\n", - " }\n", - " };\n", - "\n", - " function inject_raw_css(css) {\n", - " const element = document.createElement(\"style\");\n", - " element.appendChild(document.createTextNode(css));\n", - " document.body.appendChild(element);\n", - " }\n", - "\n", - " const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.1.1.min.js\"];\n", - " const css_urls = [];\n", - "\n", - " const inline_js = [ function(Bokeh) {\n", - " Bokeh.set_log_level(\"info\");\n", - " },\n", - "function(Bokeh) {\n", - " }\n", - " ];\n", - "\n", - " function run_inline_js() {\n", - " if (root.Bokeh !== undefined || force === true) {\n", - " for (let i = 0; i < inline_js.length; i++) {\n", - " inline_js[i].call(root, root.Bokeh);\n", - " }\n", - "} else if (Date.now() < root._bokeh_timeout) {\n", - " setTimeout(run_inline_js, 100);\n", - " } else if (!root._bokeh_failed_load) {\n", - " console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n", - " root._bokeh_failed_load = true;\n", - " } else if (force !== true) {\n", - " const cell = $(document.getElementById(null)).parents('.cell').data().cell;\n", - " cell.output_area.append_execute_result(NB_LOAD_WARNING)\n", - " }\n", - " }\n", - "\n", - " if (root._bokeh_is_loading === 0) {\n", - " console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n", - " run_inline_js();\n", - " } else {\n", - " load_libs(css_urls, js_urls, function() {\n", - " console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n", - " run_inline_js();\n", - " });\n", - " }\n", - "}(window));" - ], - "application/vnd.bokehjs_load.v0+json": "(function(root) {\n function now() {\n return new Date();\n }\n\n const force = true;\n\n if (typeof root._bokeh_onload_callbacks === \"undefined\" || force === true) {\n root._bokeh_onload_callbacks = [];\n root._bokeh_is_loading = undefined;\n }\n\n\n if (typeof (root._bokeh_timeout) === \"undefined\" || force === true) {\n root._bokeh_timeout = Date.now() + 5000;\n root._bokeh_failed_load = false;\n }\n\n const NB_LOAD_WARNING = {'data': {'text/html':\n \"
\\n\"+\n \"

\\n\"+\n \"BokehJS does not appear to have successfully loaded. If loading BokehJS from CDN, this \\n\"+\n \"may be due to a slow or bad network connection. Possible fixes:\\n\"+\n \"

\\n\"+\n \"
    \\n\"+\n \"
  • re-rerun `output_notebook()` to attempt to load from CDN again, or
  • \\n\"+\n \"
  • use INLINE resources instead, as so:
  • \\n\"+\n \"
\\n\"+\n \"\\n\"+\n \"from bokeh.resources import INLINE\\n\"+\n \"output_notebook(resources=INLINE)\\n\"+\n \"\\n\"+\n \"
\"}};\n\n function display_loaded() {\n const el = document.getElementById(null);\n if (el != null) {\n el.textContent = \"BokehJS is loading...\";\n }\n if (root.Bokeh !== undefined) {\n if (el != null) {\n el.textContent = \"BokehJS \" + root.Bokeh.version + \" successfully loaded.\";\n }\n } else if (Date.now() < root._bokeh_timeout) {\n setTimeout(display_loaded, 100)\n }\n }\n\n function run_callbacks() {\n try {\n root._bokeh_onload_callbacks.forEach(function(callback) {\n if (callback != null)\n callback();\n });\n } finally {\n delete root._bokeh_onload_callbacks\n }\n console.debug(\"Bokeh: all callbacks have finished\");\n }\n\n function load_libs(css_urls, js_urls, callback) {\n if (css_urls == null) css_urls = [];\n if (js_urls == null) js_urls = [];\n\n root._bokeh_onload_callbacks.push(callback);\n if (root._bokeh_is_loading > 0) {\n console.debug(\"Bokeh: BokehJS is being loaded, scheduling callback at\", now());\n return null;\n }\n if (js_urls == null || js_urls.length === 0) {\n run_callbacks();\n return null;\n }\n console.debug(\"Bokeh: BokehJS not loaded, scheduling load and callback at\", now());\n root._bokeh_is_loading = css_urls.length + js_urls.length;\n\n function on_load() {\n root._bokeh_is_loading--;\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: all BokehJS libraries/stylesheets loaded\");\n run_callbacks()\n }\n }\n\n function on_error(url) {\n console.error(\"failed to load \" + url);\n }\n\n for (let i = 0; i < css_urls.length; i++) {\n const url = css_urls[i];\n const element = document.createElement(\"link\");\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.rel = \"stylesheet\";\n element.type = \"text/css\";\n element.href = url;\n console.debug(\"Bokeh: injecting link tag for BokehJS stylesheet: \", url);\n document.body.appendChild(element);\n }\n\n for (let i = 0; i < js_urls.length; i++) {\n const url = js_urls[i];\n const element = document.createElement('script');\n element.onload = on_load;\n element.onerror = on_error.bind(null, url);\n element.async = false;\n element.src = url;\n console.debug(\"Bokeh: injecting script tag for BokehJS library: \", url);\n document.head.appendChild(element);\n }\n };\n\n function inject_raw_css(css) {\n const element = document.createElement(\"style\");\n element.appendChild(document.createTextNode(css));\n document.body.appendChild(element);\n }\n\n const js_urls = [\"https://cdn.bokeh.org/bokeh/release/bokeh-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-gl-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-widgets-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-tables-3.1.1.min.js\", \"https://cdn.bokeh.org/bokeh/release/bokeh-mathjax-3.1.1.min.js\"];\n const css_urls = [];\n\n const inline_js = [ function(Bokeh) {\n Bokeh.set_log_level(\"info\");\n },\nfunction(Bokeh) {\n }\n ];\n\n function run_inline_js() {\n if (root.Bokeh !== undefined || force === true) {\n for (let i = 0; i < inline_js.length; i++) {\n inline_js[i].call(root, root.Bokeh);\n }\n} else if (Date.now() < root._bokeh_timeout) {\n setTimeout(run_inline_js, 100);\n } else if (!root._bokeh_failed_load) {\n console.log(\"Bokeh: BokehJS failed to load within specified timeout.\");\n root._bokeh_failed_load = true;\n } else if (force !== true) {\n const cell = $(document.getElementById(null)).parents('.cell').data().cell;\n cell.output_area.append_execute_result(NB_LOAD_WARNING)\n }\n }\n\n if (root._bokeh_is_loading === 0) {\n console.debug(\"Bokeh: BokehJS loaded, going straight to plotting\");\n run_inline_js();\n } else {\n load_libs(css_urls, js_urls, function() {\n console.debug(\"Bokeh: BokehJS plotting callback run at\", now());\n run_inline_js();\n });\n }\n}(window));" - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "text/html": [ - "\n", - "
\n" - ] - }, - "metadata": {}, - "output_type": "display_data" - }, - { - "data": { - "application/javascript": [ - "(function(root) {\n", - " function embed_document(root) {\n", - " const docs_json = {\"44c6b85f-9b8f-4b65-b24c-9efd2b909138\":{\"version\":\"3.1.1\",\"title\":\"Bokeh Application\",\"defs\":[],\"roots\":[{\"type\":\"object\",\"name\":\"GridPlot\",\"id\":\"p1165\",\"attributes\":{\"rows\":null,\"cols\":null,\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1164\",\"attributes\":{\"logo\":null,\"tools\":[{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p1155\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1032\",\"attributes\":{\"dimensions\":\"width\"}},{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1092\",\"attributes\":{\"dimensions\":\"width\"}}]}},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p1156\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1033\"},{\"type\":\"object\",\"name\":\"PanTool\",\"id\":\"p1093\"}]}},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p1157\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1034\",\"attributes\":{\"dimensions\":\"width\"}},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1094\",\"attributes\":{\"dimensions\":\"width\"}}]}},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p1158\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1035\",\"attributes\":{\"dimensions\":\"height\"}},{\"type\":\"object\",\"name\":\"WheelZoomTool\",\"id\":\"p1095\",\"attributes\":{\"dimensions\":\"height\"}}]}},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p1159\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1036\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1037\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}},{\"type\":\"object\",\"name\":\"BoxZoomTool\",\"id\":\"p1096\",\"attributes\":{\"overlay\":{\"type\":\"object\",\"name\":\"BoxAnnotation\",\"id\":\"p1097\",\"attributes\":{\"syncable\":false,\"level\":\"overlay\",\"visible\":false,\"left_units\":\"canvas\",\"right_units\":\"canvas\",\"bottom_units\":\"canvas\",\"top_units\":\"canvas\",\"line_color\":\"black\",\"line_alpha\":1.0,\"line_width\":2,\"line_dash\":[4,4],\"fill_color\":\"lightgrey\",\"fill_alpha\":0.5}}}}]}},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p1160\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1038\"},{\"type\":\"object\",\"name\":\"ResetTool\",\"id\":\"p1098\"}]}},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p1161\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"UndoTool\",\"id\":\"p1039\"},{\"type\":\"object\",\"name\":\"UndoTool\",\"id\":\"p1099\"}]}},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1162\"},{\"type\":\"object\",\"name\":\"ToolProxy\",\"id\":\"p1163\",\"attributes\":{\"tools\":[{\"type\":\"object\",\"name\":\"HoverTool\",\"id\":\"p1041\",\"attributes\":{\"renderers\":\"auto\"}},{\"type\":\"object\",\"name\":\"HoverTool\",\"id\":\"p1101\",\"attributes\":{\"renderers\":\"auto\"}}]}}]}},\"toolbar_location\":\"right\",\"children\":[[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1001\",\"attributes\":{\"width\":500,\"height\":150,\"x_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1002\",\"attributes\":{\"js_property_callbacks\":{\"type\":\"map\",\"entries\":[[\"change:start\",[{\"type\":\"object\",\"name\":\"CustomJS\",\"id\":\"p1122\",\"attributes\":{\"args\":{\"type\":\"map\",\"entries\":[[\"p1_x_range\",{\"id\":\"p1002\"}],[\"p2_x_range\",{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1064\",\"attributes\":{\"js_property_callbacks\":{\"type\":\"map\",\"entries\":[[\"change:start\",[{\"id\":\"p1122\"}]],[\"change:end\",[{\"id\":\"p1122\"}]]]}}}]]},\"code\":\"\\n if (cb_obj == p1_x_range) {\\n const start = p1_x_range.start;\\n const end = p1_x_range.end;\\n \\n p2_x_range.start = start;\\n p2_x_range.end = end;\\n \\n }\\n \\n if (cb_obj == p2_x_range) {\\n const start = p2_x_range.start;\\n const end = p2_x_range.end;\\n \\n p1_x_range.start = start;\\n p1_x_range.end = end;\\n \\n }\\n \"}}]],[\"change:end\",[{\"id\":\"p1122\"}]]]}}},\"y_range\":{\"type\":\"object\",\"name\":\"DataRange1d\",\"id\":\"p1003\"},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1014\"},\"y_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1016\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1004\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1059\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1053\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1054\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1055\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAAAA8D8AAAAAAAAAQAAAAAAAAAhAAAAAAAAAEEAAAAAAAAAUQA==\"},\"shape\":[5],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAAAA4D8zMzMzMzPjP5qZmZmZmdk/mpmZmZmZ2T/NzMzMzMzsPw==\"},\"shape\":[5],\"dtype\":\"float64\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1060\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1061\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1056\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1b9e77\"}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1057\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1b9e77\",\"line_alpha\":0.1}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Line\",\"id\":\"p1058\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":\"#1b9e77\",\"line_alpha\":0.2}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1007\",\"attributes\":{\"tools\":[{\"id\":\"p1032\"},{\"id\":\"p1033\"},{\"id\":\"p1034\"},{\"id\":\"p1035\"},{\"id\":\"p1036\"},{\"id\":\"p1038\"},{\"id\":\"p1039\"},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1040\"},{\"id\":\"p1041\"}]}},\"toolbar_location\":null,\"left\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1025\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1028\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1027\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1026\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1018\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1021\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1020\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1019\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1024\",\"attributes\":{\"axis\":{\"id\":\"p1018\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1031\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1025\"}}}]}},0,0],[{\"type\":\"object\",\"name\":\"Figure\",\"id\":\"p1062\",\"attributes\":{\"width\":500,\"height\":150,\"x_range\":{\"id\":\"p1064\"},\"y_range\":{\"type\":\"object\",\"name\":\"FactorRange\",\"id\":\"p1073\",\"attributes\":{\"factors\":[\"blue\",\"green\",\"red\"]}},\"x_scale\":{\"type\":\"object\",\"name\":\"LinearScale\",\"id\":\"p1075\"},\"y_scale\":{\"type\":\"object\",\"name\":\"CategoricalScale\",\"id\":\"p1077\"},\"title\":{\"type\":\"object\",\"name\":\"Title\",\"id\":\"p1065\"},\"renderers\":[{\"type\":\"object\",\"name\":\"GlyphRenderer\",\"id\":\"p1119\",\"attributes\":{\"data_source\":{\"type\":\"object\",\"name\":\"ColumnDataSource\",\"id\":\"p1113\",\"attributes\":{\"selected\":{\"type\":\"object\",\"name\":\"Selection\",\"id\":\"p1114\",\"attributes\":{\"indices\":[],\"line_indices\":[]}},\"selection_policy\":{\"type\":\"object\",\"name\":\"UnionRenderers\",\"id\":\"p1115\"},\"data\":{\"type\":\"map\",\"entries\":[[\"x\",{\"type\":\"ndarray\",\"array\":{\"type\":\"bytes\",\"data\":\"AAAAAAAA8D8AAAAAAAAAQAAAAAAAAAhAAAAAAAAAEEAAAAAAAAAUQA==\"},\"shape\":[5],\"dtype\":\"float64\",\"order\":\"little\"}],[\"y\",{\"type\":\"ndarray\",\"array\":[\"red\",\"blue\",\"red\",\"blue\",\"green\"],\"shape\":[5],\"dtype\":\"object\",\"order\":\"little\"}]]}}},\"view\":{\"type\":\"object\",\"name\":\"CDSView\",\"id\":\"p1120\",\"attributes\":{\"filter\":{\"type\":\"object\",\"name\":\"AllIndices\",\"id\":\"p1121\"}}},\"glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1116\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"}}},\"nonselection_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1117\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.1},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.1},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.1}}},\"muted_glyph\":{\"type\":\"object\",\"name\":\"Circle\",\"id\":\"p1118\",\"attributes\":{\"x\":{\"type\":\"field\",\"field\":\"x\"},\"y\":{\"type\":\"field\",\"field\":\"y\"},\"line_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"line_alpha\":{\"type\":\"value\",\"value\":0.2},\"fill_color\":{\"type\":\"value\",\"value\":\"#1f77b4\"},\"fill_alpha\":{\"type\":\"value\",\"value\":0.2},\"hatch_alpha\":{\"type\":\"value\",\"value\":0.2}}}}}],\"toolbar\":{\"type\":\"object\",\"name\":\"Toolbar\",\"id\":\"p1068\",\"attributes\":{\"tools\":[{\"id\":\"p1092\"},{\"id\":\"p1093\"},{\"id\":\"p1094\"},{\"id\":\"p1095\"},{\"id\":\"p1096\"},{\"id\":\"p1098\"},{\"id\":\"p1099\"},{\"type\":\"object\",\"name\":\"SaveTool\",\"id\":\"p1100\"},{\"id\":\"p1101\"}]}},\"toolbar_location\":null,\"left\":[{\"type\":\"object\",\"name\":\"CategoricalAxis\",\"id\":\"p1086\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"CategoricalTicker\",\"id\":\"p1089\"},\"formatter\":{\"type\":\"object\",\"name\":\"CategoricalTickFormatter\",\"id\":\"p1088\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1087\"}}}],\"below\":[{\"type\":\"object\",\"name\":\"LinearAxis\",\"id\":\"p1079\",\"attributes\":{\"ticker\":{\"type\":\"object\",\"name\":\"BasicTicker\",\"id\":\"p1082\",\"attributes\":{\"mantissas\":[1,2,5]}},\"formatter\":{\"type\":\"object\",\"name\":\"BasicTickFormatter\",\"id\":\"p1081\"},\"major_label_policy\":{\"type\":\"object\",\"name\":\"AllLabels\",\"id\":\"p1080\"}}}],\"center\":[{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1085\",\"attributes\":{\"axis\":{\"id\":\"p1079\"}}},{\"type\":\"object\",\"name\":\"Grid\",\"id\":\"p1091\",\"attributes\":{\"dimension\":1,\"axis\":{\"id\":\"p1086\"}}}]}},1,0]]}}],\"callbacks\":{\"type\":\"map\"}}};\n", - " const render_items = [{\"docid\":\"44c6b85f-9b8f-4b65-b24c-9efd2b909138\",\"roots\":{\"p1165\":\"e485e37c-f869-44fc-879c-ab34ea07fbda\"},\"root_ids\":[\"p1165\"]}];\n", - " root.Bokeh.embed.embed_items_notebook(docs_json, render_items);\n", - " }\n", - " if (root.Bokeh !== undefined) {\n", - " embed_document(root);\n", - " } else {\n", - " let attempts = 0;\n", - " const timer = setInterval(function(root) {\n", - " if (root.Bokeh !== undefined) {\n", - " clearInterval(timer);\n", - " embed_document(root);\n", - " } else {\n", - " attempts++;\n", - " if (attempts > 100) {\n", - " clearInterval(timer);\n", - " console.log(\"Bokeh: ERROR: Unable to run BokehJS code because BokehJS library is missing\");\n", - " }\n", - " }\n", - " }, 10, root)\n", - " }\n", - "})(window);" - ], - "application/vnd.bokehjs_exec.v0+json": "" - }, - "metadata": { - "application/vnd.bokehjs_exec.v0+json": { - "id": "p1165" - } - }, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "!pip install bokeh -q\n", "\n", @@ -1295,18 +421,10 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": null, "id": "38ff0e20", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['feature_1', 'feature_2']\n" - ] - } - ], + "outputs": [], "source": [ "evset = tp.event_set(\n", "\ttimestamps=[0],\n", @@ -1332,21 +450,10 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": null, "id": "838449d4", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['feature_1', 'feature_2']" - ] - }, - "execution_count": 12, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "evset.moving_sum(window_length=10).schema.feature_names()" ] @@ -1366,21 +473,10 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": null, "id": "b10fdec3", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "['mult_feature_1_feature_2']" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "(evset[\"feature_1\"] * evset[\"feature_2\"]).schema.feature_names()" ] @@ -1401,18 +497,10 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": null, "id": "4182d3f8", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "['calendar_month']\n" - ] - } - ], + "outputs": [], "source": [ "date_events = tp.event_set(\n", "\ttimestamps=[\"2020-02-15\", \"2020-06-20\"],\n", @@ -1436,87 +524,10 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": null, "id": "bc36bc1f", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "
\n", - "
\n", - " \n", - " features\n", - " [1]:\n", - " \n", - " renamed_1\n", - " (float64)\n", - "
\n", - "
\n", - " \n", - " indexes\n", - " [0]:\n", - " \n", - " none\n", - "
\n", - "
\n", - " events: \n", - " 1\n", - "
\n", - "
\n", - " index values: \n", - " 1\n", - "
\n", - "
\n", - " memory usage: \n", - " 0.5 kB\n", - "
\n", - "
\n", - "
\n", - " index\n", - " (\n", - " ) with 1 events\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - " \n", - " timestamp\n", - " \n", - " \n", - " \n", - " renamed_1\n", - " \n", - "
\n", - " 0\n", - " \n", - " 0.1\n", - "
\n", - "
\n" - ], - "text/plain": [ - "indexes: []\n", - "features: [('renamed_1', float64)]\n", - "events:\n", - " (1 events):\n", - " timestamps: [0.]\n", - " 'renamed_1': [0.1]\n", - "memory usage: 0.5 kB" - ] - }, - "execution_count": 15, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Rename a single feature.\n", "evset[\"feature_1\"].rename(\"renamed_1\")" @@ -1524,99 +535,10 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": null, "id": "a44f6e7a", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "
\n", - "
\n", - " \n", - " features\n", - " [2]:\n", - " \n", - " renamed_1\n", - " (float64)\n", - " , \n", - " renamed_2\n", - " (float64)\n", - "
\n", - "
\n", - " \n", - " indexes\n", - " [0]:\n", - " \n", - " none\n", - "
\n", - "
\n", - " events: \n", - " 1\n", - "
\n", - "
\n", - " index values: \n", - " 1\n", - "
\n", - "
\n", - " memory usage: \n", - " 0.6 kB\n", - "
\n", - "
\n", - "
\n", - " index\n", - " (\n", - " ) with 1 events\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - " \n", - " timestamp\n", - " \n", - " \n", - " \n", - " renamed_1\n", - " \n", - " \n", - " \n", - " renamed_2\n", - " \n", - "
\n", - " 0\n", - " \n", - " 0.1\n", - " \n", - " 0.2\n", - "
\n", - "
\n" - ], - "text/plain": [ - "indexes: []\n", - "features: [('renamed_1', float64), ('renamed_2', float64)]\n", - "events:\n", - " (1 events):\n", - " timestamps: [0.]\n", - " 'renamed_1': [0.1]\n", - " 'renamed_2': [0.2]\n", - "memory usage: 0.6 kB" - ] - }, - "execution_count": 16, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Rename all features.\n", "evset.rename({\"feature_1\": \"renamed_1\", \"feature_2\": \"renamed_2\"})" @@ -1624,99 +546,10 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": null, "id": "3126cbed", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "
\n", - "
\n", - " \n", - " features\n", - " [2]:\n", - " \n", - " prefixed.feature_1\n", - " (float64)\n", - " , \n", - " prefixed.feature_2\n", - " (float64)\n", - "
\n", - "
\n", - " \n", - " indexes\n", - " [0]:\n", - " \n", - " none\n", - "
\n", - "
\n", - " events: \n", - " 1\n", - "
\n", - "
\n", - " index values: \n", - " 1\n", - "
\n", - "
\n", - " memory usage: \n", - " 0.6 kB\n", - "
\n", - "
\n", - "
\n", - " index\n", - " (\n", - " ) with 1 events\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - " \n", - " timestamp\n", - " \n", - " \n", - " \n", - " prefixed.feature_1\n", - " \n", - " \n", - " \n", - " prefixed.feature_2\n", - " \n", - "
\n", - " 0\n", - " \n", - " 0.1\n", - " \n", - " 0.2\n", - "
\n", - "
\n" - ], - "text/plain": [ - "indexes: []\n", - "features: [('prefixed.feature_1', float64), ('prefixed.feature_2', float64)]\n", - "events:\n", - " (1 events):\n", - " timestamps: [0.]\n", - " 'prefixed.feature_1': [0.1]\n", - " 'prefixed.feature_2': [0.2]\n", - "memory usage: 0.6 kB" - ] - }, - "execution_count": 17, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Prefix all features.\n", "evset.prefix(\"prefixed.\")" @@ -1737,7 +570,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": null, "id": "852abbdd", "metadata": {}, "outputs": [], @@ -1761,7 +594,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": null, "id": "f7d85e33", "metadata": {}, "outputs": [], @@ -1789,7 +622,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": null, "id": "e1276be1", "metadata": {}, "outputs": [], @@ -1824,7 +657,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": null, "id": "6c2444ba", "metadata": {}, "outputs": [], @@ -1847,110 +680,10 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": null, "id": "05ee00a7", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "
\n", - "
\n", - " \n", - " features\n", - " [2]:\n", - " \n", - " f1\n", - " (str_)\n", - " , \n", - " f2\n", - " (int32)\n", - "
\n", - "
\n", - " \n", - " indexes\n", - " [0]:\n", - " \n", - " none\n", - "
\n", - "
\n", - " events: \n", - " 2\n", - "
\n", - "
\n", - " index values: \n", - " 1\n", - "
\n", - "
\n", - " memory usage: \n", - " 0.7 kB\n", - "
\n", - "
\n", - "
\n", - " index\n", - " (\n", - " ) with 2 events\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - " \n", - " timestamp\n", - " \n", - " \n", - " \n", - " f1\n", - " \n", - " \n", - " \n", - " f2\n", - " \n", - "
\n", - " 0\n", - " \n", - " 0.5\n", - " \n", - " 1\n", - "
\n", - " 1\n", - " \n", - " 1.1\n", - " \n", - " 2\n", - "
\n", - "
\n" - ], - "text/plain": [ - "indexes: []\n", - "features: [('f1', str_), ('f2', int32)]\n", - "events:\n", - " (2 events):\n", - " timestamps: [0. 1.]\n", - " 'f1': [b'0.5' b'1.1']\n", - " 'f2': [1 2]\n", - "memory usage: 0.7 kB" - ] - }, - "execution_count": 22, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "evset.cast({\"f1\": str, \"f2\": tp.int32})" ] @@ -1970,7 +703,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": null, "id": "6deaff88", "metadata": {}, "outputs": [], @@ -2001,112 +734,12 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": null, "id": "2c673b17", "metadata": { "lines_to_next_cell": 0 }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "
\n", - "
\n", - " \n", - " features\n", - " [2]:\n", - " \n", - " add_f1_f3\n", - " (int64)\n", - " , \n", - " add_f2_f4\n", - " (float64)\n", - "
\n", - "
\n", - " \n", - " indexes\n", - " [0]:\n", - " \n", - " none\n", - "
\n", - "
\n", - " events: \n", - " 2\n", - "
\n", - "
\n", - " index values: \n", - " 1\n", - "
\n", - "
\n", - " memory usage: \n", - " 0.7 kB\n", - "
\n", - "
\n", - "
\n", - " index\n", - " (\n", - " ) with 2 events\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - " \n", - " timestamp\n", - " \n", - " \n", - " \n", - " add_f1_f3\n", - " \n", - " \n", - " \n", - " add_f2_f4\n", - " \n", - "
\n", - " 1\n", - " \n", - " 100\n", - " \n", - " 1010\n", - "
\n", - " 10\n", - " \n", - " 101\n", - " \n", - " 1020\n", - "
\n", - "
\n" - ], - "text/plain": [ - "indexes: []\n", - "features: [('add_f1_f3', int64), ('add_f2_f4', float64)]\n", - "events:\n", - " (2 events):\n", - " timestamps: [ 1. 10.]\n", - " 'add_f1_f3': [100 101]\n", - " 'add_f2_f4': [1010. 1020.]\n", - "memory usage: 0.7 kB" - ] - }, - "execution_count": 24, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "evset = tp.event_set(\n", " timestamps=[1, 10],\n", @@ -2177,7 +810,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": null, "id": "f1462eea", "metadata": {}, "outputs": [], @@ -2203,21 +836,10 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": null, "id": "c67262d9-0a72-41ed-b020-12d95c5d2879", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "False" - ] - }, - "execution_count": 26, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# This is NOT event-wise comparison, just a python boolean\n", "evset[\"f1\"] == evset[\"f2\"]" @@ -2233,95 +855,10 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": null, "id": "c610a0d0", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "
\n", - "
\n", - " \n", - " features\n", - " [1]:\n", - " \n", - " eq_f1_f3\n", - " (bool_)\n", - "
\n", - "
\n", - " \n", - " indexes\n", - " [0]:\n", - " \n", - " none\n", - "
\n", - "
\n", - " events: \n", - " 2\n", - "
\n", - "
\n", - " index values: \n", - " 1\n", - "
\n", - "
\n", - " memory usage: \n", - " 0.5 kB\n", - "
\n", - "
\n", - "
\n", - " index\n", - " (\n", - " ) with 2 events\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - " \n", - " timestamp\n", - " \n", - " \n", - " \n", - " eq_f1_f3\n", - " \n", - "
\n", - " 1\n", - " \n", - " False\n", - "
\n", - " 10\n", - " \n", - " False\n", - "
\n", - "
\n" - ], - "text/plain": [ - "indexes: []\n", - "features: [('eq_f1_f3', bool_)]\n", - "events:\n", - " (2 events):\n", - " timestamps: [ 1. 10.]\n", - " 'eq_f1_f3': [False False]\n", - "memory usage: 0.5 kB" - ] - }, - "execution_count": 27, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Works element-wise as expected\n", "evset[\"f1\"].equal(evset[\"f3\"])" @@ -2382,7 +919,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": null, "id": "1415ede1-3fbc-43d7-94e6-dd5d5ec93bbb", "metadata": {}, "outputs": [], @@ -2416,142 +953,12 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": null, "id": "58fe7d8e", "metadata": { "lines_to_next_cell": 0 }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "
\n", - "
\n", - " \n", - " features\n", - " [4]:\n", - " \n", - " f1\n", - " (int64)\n", - " , \n", - " f2\n", - " (float64)\n", - " , \n", - " f3\n", - " (int64)\n", - " , \n", - " f4\n", - " (float64)\n", - "
\n", - "
\n", - " \n", - " indexes\n", - " [0]:\n", - " \n", - " none\n", - "
\n", - "
\n", - " events: \n", - " 2\n", - "
\n", - "
\n", - " index values: \n", - " 1\n", - "
\n", - "
\n", - " memory usage: \n", - " 0.9 kB\n", - "
\n", - "
\n", - "
\n", - " index\n", - " (\n", - " ) with 2 events\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - " \n", - " timestamp\n", - " \n", - " \n", - " \n", - " f1\n", - " \n", - " \n", - " \n", - " f2\n", - " \n", - " \n", - " \n", - " f3\n", - " \n", - " \n", - " \n", - " f4\n", - " \n", - "
\n", - " 1\n", - " \n", - " 0\n", - " \n", - " 100\n", - " \n", - " 1000\n", - " \n", - " 1e+04\n", - "
\n", - " 10\n", - " \n", - " 10\n", - " \n", - " 200\n", - " \n", - " 1000\n", - " \n", - " 1e+04\n", - "
\n", - "
\n" - ], - "text/plain": [ - "indexes: []\n", - "features: [('f1', int64), ('f2', float64), ('f3', int64), ('f4', float64)]\n", - "events:\n", - " (2 events):\n", - " timestamps: [ 1. 10.]\n", - " 'f1': [ 0 10]\n", - " 'f2': [100. 200.]\n", - " 'f3': [1000 1000]\n", - " 'f4': [10000. 10000.]\n", - "memory usage: 0.9 kB" - ] - }, - "execution_count": 29, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "evset * 10" ] @@ -2583,7 +990,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": null, "id": "087b6fd6", "metadata": { "lines_to_next_cell": 0 @@ -2624,7 +1031,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": null, "id": "df3bbc7d", "metadata": { "lines_to_next_cell": 0 @@ -2700,23 +1107,12 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": null, "id": "54a71cae", "metadata": { "lines_to_next_cell": 0 }, - "outputs": [ - { - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA/UAAAEhCAYAAAA+i4DpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAABdIUlEQVR4nO3de3Rb1Zk3/u+RdTmSLR3HVymJndR1SEjsOglQrqFcM7TTxYRSBlooCZQCvynDKqx22nTSQuBdTafcCrxl4KWZhDYdmpRbKUMplwYSBoamQIBMgJKrHWL5FluSbd11fn/IPrawHeLEls7x8/2sldXaOpa38s0xfrT3frai67oOIiIiIiIiIrIcW6EHQERERERERERHh0U9ERERERERkUWxqCciIiIiIiKyKBb1RERERERERBbFop6IiIiIiIjIoljUExEREREREVkUi3oiIiIiIiIii2JRT0RERERERGRRLOqJiIiIiIiILIpFPRERkVAnnngiXn755aP++pdffhnPPffcuL/uP/7jP9DY2Ai73Y6f//znR/39iYiIiEU9ERHRlJFKpfL6/Y62qD/hhBOwadMmfP3rX5+EUREREcnCop6IiMjkFEXBqlWrsGjRIhx33HH4zW9+k/PYLbfcgpNOOgkrV65Ee3s7vvKVr6CxsRENDQ146KGHjGtfe+01LFy4EA0NDbjqqqty3gQ466yz8NRTTxkff/WrX8X69esBAKFQCNdccw0aGhrQ1NSEq6++Gtu3b8eDDz6I3/zmN1i4cCFuu+22I349TU1NOP7442Gz8dcQIiKiY2Uv9ACIiIjo0ymKgrfffht79uzBiSeeiNNPPx2zZ88GABQVFWHbtm0AgEsvvRRz587FE088gfb2dpxwwgloamrC4sWLcemll2LdunU477zz8PzzzxtF+6f5zne+A7fbjXfffRc2mw0dHR2orKzE9ddfj56enpwl9EuWLEEkEhn1ed58800UFRUdy18DERERfQKLeiIiIgu45pprAAB1dXU488wzsWXLFqOov/rqq43rXnzxRbz55psAgKqqKnzlK1/Biy++CI/HA7vdjvPOOw8AsHTpUtTV1R3R937mmWfwxhtvGDPrlZWVY167devWcb82IiIiOnos6omIiCxIURTj/5eUlBzRdYd7zG63I51OGx/HYrGjGhdn6omIiPKLm9mIiIgsYN26dQCAffv2YevWrViyZMmo15133nl4+OGHAQAdHR144okncP7552PevHlIpVLYvHkzgOyM/u7du42vq6+vxxtvvAEA2Lt3L1599VXjsQsvvBB33nknMpmM8bwA4PP5EAqFcr7/1q1bsX379lH/sKAnIiKaeCzqiYiILCCdTmPRokVYunQp7rvvPmPp/Sfdd999eP/999HY2Iizzz4b//qv/4qTTz4ZTqcTGzduxE033YTGxkb853/+J5qamoyv+5d/+Rds3rwZjY2NWLlyJU4++WTjsXvuuQfxeByNjY1YuHAhfvjDHwIALrroImzfvn3cjfLWr1+PmTNn4ne/+x1uvfVWzJw5E2+//fbR/cUQEREJp+i6rhd6EERERDQ2RVHQ3d2N0tLSQg+FiIiITIYz9UREREREREQWxUZ5REREJsdFdURERDQWztQTERERERERWRSLeiIiIiIiIiKLYlFPREREREREZFHcUz8gk8ng4MGD8Hq9UBSl0MMhIiIiIiKiAtJ1HZFIBNOnT4fNZt75cBb1Aw4ePIiamppCD4OIiIiIiIhMpKWlBTNnziz0MMbEon6A1+sFkA3M5/MVeDRj27lzJ+bPn1/oYVAeMGtZmLcczFoW5i0Hs5aDWcsRDodRU1Nj1Ipmpeh5PCfnxhtvxNNPP439+/fj7bffxsKFCwEAH330EZYvX47Ozk5omob169djwYIFn/rYJ61duxY//elPkclkcM455+CBBx6Aw+E4orGFw2FomoZQKGTqoj4UCkHTtEIPg/KAWcvCvOVg1rIwbzmYtRzMWg6r1Ih53Rjw1a9+Fa+++ipmzZqV8/nrrrsO1157Lf72t7/h+9//PlasWHFEjw23d+9e/OhHP8LWrVuxa9cutLW14f/9v/83ia+mMDo7Ows9BMoTZi0L85aDWcvCvOVg1nIwazKbvBb1Z5555oi9CO3t7fjrX/+KK664AgBw8cUXo6WlBbt27TrsY5/02GOP4cILL4Tf74eiKLj++uvx6KOPjjmWeDyOcDic88fs/tYWwSPbgnjirQN4bXcn9nb2IZpIF3pYNEmi0Wihh0B5xLzlYNayMG85mLUczJrMpuB76ltaWhAIBGC3Z4eiKApqa2vR3NwMTdPGfKy+vj7neZqbm3NWAMyePRvNzc1jft81a9Zg9erVk/CKJk9AU3F+0yyEkjbsPBjGS++3IxiKIZbMFvaKoqDS60JAU+HXVAQG/vg1N0pcBY+axumTK1poamPecjBrWZi3HMxaDmZNZiO20lu5ciVuvvlm4+PBJghm5lUd8NujWHL8nFEfT2d0dPbG0RqKIRiKYld7L179qBOtoRj64ikAgKIAZcVO+DV3bvHvc8PntvM4PxMJBoOmb8pBE4d5y8GsZWHecjBrOZg1mU3Bi/qamhq0trYilUrBbrdD13U0NzejtrYWPp9vzMc+qba2Frt37zY+3rdv36jXDXK5XHC5XJPymiZTPB4f87Eim4Jqn4pqnwrUlI56TSaj41B/AsFQDK2hGA4c6se2vYcQDMUQiiYx2DWx1O0wCv7hbwCUeZyw2Vj458Phsqaph3nLwaxlYd5yMGs5mDWZTcGL+qqqKixevBgbNmzAihUr8Pjjj2PmzJnG8vrDPTbcxRdfjDPOOAO33norqqur8eCDD+Kyyy7L98uZdHV1dcf09TabgooSFypKXGiYMXrXTl3XEYomszP+4RiCoRje+ziEYCiKQ30JDJ6XUOyy58z2Dxb/FSUuFLHwP2bHmjVZC/OWg1nLwrzlYNZyMGsym7weaXfdddfhv/7rvxAMBlFeXg6v14tdu3bhww8/xIoVK9DV1QWfz4d169ahsbERAA772DXXXIMLL7wQF154IQDg4Ycfxk9/+lMAwFlnnYUHH3xwyh1p98EHH2DevHmFHgYAIBJLoi2cnfHPLvnP/m9HJI7Bf1aqo2hY0T9U/Fd5XXAU5bVPo+WYKWuafMxbDmYtC/OWg1nLwazlsEqNmNeZ+oceemjUz8+dOxevv/76uB/75S9/mfPxt771LXzrW986tkGaXCqVKvQQDF7VAa/qQH3V2HuKook0guEYWkNRBEMx/M+e7FL/tnAM6Uy28HcU2eAfXvT7VAQ0N6p8LqiOony9HNMxU9Y0+Zi3HMxaFuYtB7OWg1mT2eR1pt7MrPIuTCwWg6qqhR7GhIqn0mgPxwdm/KPGjH8wFEMinQGQ7RdQZXT2z23y53EWfBfJpJiKWdPYmLcczFoW5i0Hs5aDWcthlRpxalZDU9iePXswf/78Qg9jQrnsRagp86CmzDPmNal0Bh1GZ/8YPghG8PKH7WgNxRBNDB7pB1SUuEZt8Od1Wa+z/1TMmsbGvOVg1rIwbzmYtRzMmsyGRb3FZDKZQg+hIOxFNgQ0NwKae8xrMhkdnX1xY6Z/X2cfXt/dhWAoikhsaJnUtGJn7h5/X7b4L/U4TFX4S81aKuYtB7OWhXnLwazlYNZkNlx+P8AqSyuSyeQRN/+jkXRdR3d/csQy/9ZQDD39iew1ALRhR/pV+4Ya/VUUu/J2pB+zloV5y8GsZWHecjBrOZi1HFapETlTbzEffvghGhoaCj0My1IUBWXFTpQVO7Fg+thH+oVjqYFiP1v87zwYRjAUQ1df3DjSz+0sGnWPf2WJC/YJ6OzPrGVh3nIwa1mYtxzMWg5mTWbDop7oExRFgeZ2QHM7MNc/dmf/vngKwfDQTP9ruzrRGoqhPRJHZqCzv9NuG7nH35ed/XfaeaQfEREREREdGy6/H2CVpRVc7mMtsWQabeHcZf7BUBTBcAypdPbWsxcpqPaN3ONf7imC18POqlLw3paDWcvCvOVg1nIwazmsUiNypt5iuNzHWlRHEWaVF2NWefGY1yRSGbRHhor+HR+H8MLONnzY0gbVUwIgu3qgyudCwCj+3fBrLvg1N0pcvI2nAt7bcjBrWZi3HMxaDmZNZsNqgKjAnHYbZk7zYOa03CP9duzIGP/BSKUz6OxNGHv8/9YWwZaPOtAaiqEvnu3srwAoL3GO2OMf8Lnhc1vvSD8iIiIiIvp0XH4/wCpLK7jcR47xZp3J6DjUn8hZ5j+47D8UTQLIdvYv9TiG9vgPW/ZfVuxk4V9AvLflYNayMG85mLUczFoOq9SInKm3GC73kWO8WdtsCipKXKgocaFhxtid/UPRZM4e/3cP9KA1FEN3fwK6ni38vao9W+z7hhr8BTQV5SUuFOXpSD9peG/LwaxlYd5yMGs5mDWZDYt6i7HZ2DFdisnIWlEUlHqcKPU4cXxg7HcbI7HksBn/GD4MRhAMR9ERSWBwcY/qLDJm+od3+K/yuuCYgCP9pOG9LQezloV5y8Gs5WDWZDZcfj/AKksrYrEYVJUd0SUwe9b9iRSCw7v6h2NoDUXRHo4jPXCkn6PIllv0+7JN/qo1F1z2ogK/AnMxe940cZi1LMxbDmYtB7OWwyo1omlm6p977jmsWrUKiUQCHo8HDz30EJqamnDyyScjHo8DAFKpFP73f/8X77zzDj73uc+NeA5FUdDQ0ICiomyxcP/992PJkiV5fR2TbdeuXVzuI4TZs/Y47airLEFdZcmY18RTabSH42gNZQv+7S09+OOOINrCMSRSGQDZbQPVPle2o79PNZr8+TUVHqdpfkRNOrPnTROHWcvCvOVg1nIwazIbU/zG3N3djcsvvxxbtmzBggULsHXrVlx++eXYsWMH3njjDeO6xx57DKtXrx61oB+0detWlJaW5mHUhWG3myIyyoOpkLXLXoSaMg9qyjxjXpNMZ9ARiRtL/Xe2hvHnD9rRGo4hlkgDyL5hV+l1wu/L7ezv11R41anRqGYq5E1HhlnLwrzlYNZyMGsyG1P8i9y9ezfKy8uxYMECAMCSJUvQ3NyMt956C4sXLzauW7t2Lb75zW9OyPeMx+PGCgAgu7TCCmpraws9BMoTKVk7imyYXurG9FL3mNekMzq6egdn/GPY09GL/97diWAoht5YyrhuWrEzt+gfeBOg1OMwfWd/KXkTs5aGecvBrOVg1mQ2pijq58yZg66uLrz22ms47bTT8PTTTyMSiWDfvn1GUd/S0oJXXnkFv/71rw/7XOeeey5SqRTOPfdc3H777SguLh71ujVr1mD16tUT/lom2549e7jcRwhmPaTIpqDKp6LKp6KpZvRrdF3Hob6EMeP/cU8Mb+3Pdvbv6U9krwGguR0j9vj7NRXlxU7YCtjZn3nLwaxlYd5yMGs5mDWZjSmKek3T8Nhjj2HlypXo7e3Fqaeeivnz5+csbVm/fj2+/OUvo6KiYszn2b9/P2pra9HX14frr78e3/ve9/DAAw+Meu3KlStx8803Gx+Hw2HU1IxRLZiIy+Uq9BAoT5j1+CiKgvISF8o/5Ui/cCw10NwvimAohv89GEYwFENXXxyDbUM9Lvuwon9w5t+NSu/kHenHvOVg1rIwbzmYtRzMmszGlN3v4/E4/H4/tm3bhvr6eui6js9+9rP493//d/zd3/3dET3H66+/jmuvvRbvvffeEV1vlc6GkUgEXq+30MOgPGDWhdMbH97ZP1v8t4Zj6IjEkRno7O9y2Ebd41/lVeG0j/+oG+YtB7OWhXnLwazlYNZyWKVGNMVMPQC0trYiEAgAAG6//Xacc845qK+vBwD8+c9/RiqVwvnnnz/m13d3d8PlcsHj8SCTyWDjxo1YtGhRXsaeT/v37+dyHyGYdeGUuOyorypBfdXYnf1jyfSw4/yi+Mu+QwiGYmgLx5BK69AB2G3KJ470G3oTQHXkHunHvOVg1rIwbzmYtRzMmszGNEX9j3/8Y2zduhWpVAqnnnoq1q5dazy2du1aXHXVVbDZcme/HnzwQRw8eBC33XYbPvjgA1x33XVQFAWpVAqLFy/Gvffem++XMenc7rGbidHUwqzNTXUUYXZFMWZXjN63AwASqQzawtlCvzUUw46PQ3hhZxuC4SjiyeyRfoqioMrngivVj/djLcYe/4Cmothlmh/RNIF4b8vCvOVg1nIwazIbUy6/LwSrLK0IhULQtNH3C9PUwqxlSKUz6OxN4KOPO9GbLhqY+c++CdAfz3b2VxSgvNiVs8x/sPj3qXbTd/anXLy3ZWHecjBrOZi1HFapETkNZDEtLS38ISIEs5bBXmSDX1PR2dKDJY2jL+XLZHR09SWMPf7Nh/rxxt7scv9wNGlcV+pxjtjj7/epKCt2svA3Ed7bsjBvOZi1HMyazIZFvcWUlIy9x5emFmYty+HyttkUVHpdqPS60Dhz7M7+Pf1JY49/ayiG7S3ZI/26+xIYXJLlVe3Zot+nwq9l9/gHNBXlJZPX2Z9y8d6WhXnLwazlYNZkNizqLcbMyz5oYjFrWY41b0VRMK3YiWnFTsyfPvZzRWLJoQZ/oRg+DEYQDEfREUlgcDeW6iwaKPrVnD3+VV4X7EXj7+xPuXhvy8K85WDWcjBrMhsW9RZz8OBBlJWVFXoYlAfMWpZ85e1VHfCqDsypHvsonv7E8CP9YvifPV1oDUXRHo4jPXCkn9NuQ7Uvd49/QFOzTf/sRWM+N/HeloZ5y8Gs5WDWZDYs6i2G7wzKwaxlMVPeHqcddZUlqKs8/JF+7eE4WkNRBMMxvNXcbbwRkExnO/sX2RRU+9SRDf58KtxOuYW/mbKmyce85WDWcjBrMhsW9Rbj8XgKPQTKE2Yti9XyVh1FqC33oLZ87HEn0xm0R+IIhrJ7/HceDOOl99sRDMUQTaYBADYFqPS64Pe5RzT586qOfL2cvLJa1nRsmLcczFoOZk1mw6LeYoLBICoqKgo9DMoDZi3LVMzbUWTDjFI3ZpSOfZ5vOqOjszduLPXf09GL/97diWAoht5YyriurHiws39u8a+5HZbr7D8Vs6axMW85mLUczJrMhkW9xUybNq3QQ6A8YdaySM17cIl+tU9FU83o1+i6jkN9CaO534GeKP66/xBaQzGE+rNH+ukASt2OYTP9Q8V/mccJm4k6+0vNWirmLQezloNZk9kcdVEfj8fhcrkmcix0BByOqbkclUZi1rIw77EpioLyEhfKS1xomDH2kX7haAqtA8f5BUMxvPdxCMFQFIf6Ehho7I9il/0Ty/yze/wrvfk70o9Zy8K85WDWcjBrMptxF/Xvvvsuvv71r6OnpwcHDhzAm2++iY0bN+JnP/vZZIyPPqG9vR1VVVWFHgblAbOWhXkfG0VRoHkc0DwOzPMf/ki/tnB2qX9rKIa/tXWgNRRDRySOzOCRfg7bqHv8q30qHBNwpB+zloV5y8Gs5WDWZDbjLupvvPFGPPjgg/jnf/5nAMDixYtx5ZVXsqjPk/Ly8kIPgfKEWcvCvPNj8Ei/+qqxj/SLJtJG4R8MR/GXfYcQDMXQFo4hlc4W/vYiBX7fyD3+1T4VquPwnf2ZtSzMWw5mLQezJrMZd1Hf29uLM844w/hYURQ4nc4JHRQREVGhuJ1FmF1RjNkVxWNeE09lj/QLDhT/7x7owZ/+N7vsP5HKHulnsymo8rpG7PFHIp2vl0JEREQCjLuot9vtSCaTRrfhlpYWFBXJPW8437q6uhAIBAo9DMoDZi0L87YWl70INWUe1JSNfaxRKp1BR2/c2OP/QTCClz9sxwfNbXC6WwEAigJUlLjg19SBmX8VAc0Nv6bCp9ot19mfRuK9LQezloNZk9mMu6i/4YYbsGzZMnR0dGDVqlXYsGEDl97nEffvyMGsZWHeU4+9yIaA5kZAyz3Sr729wsg7k9HR2Td0pN/+rn78z55DCIaiiAw70q/U4xyxxz+guTHNY70j/aThvS0Hs5aDWZPZjLuov+KKK1BXV4ff//73SCQS2LBhQ85y/KP13HPPYdWqVUgkEvB4PHjooYfQ1NSEs846C/v374emZTseL1++HDfddNOoz/HMM8/gu9/9LtLpNBobG7F+/Xr4fGM3TLKiZDJZ6CFQnjBrWZi3HMOzzi7RV1HlVfG5maNfr+s6evqTxh7/1lAM21t60BqKobsvkb0GgE+1j9jj79dUVBS7THWknzS8t+Vg1nIwazKbozrS7rTTTsNpp502YYPo7u7G5Zdfji1btmDBggXYunUrLr/8cuzYsQMAcM8992DZsmWHfY7e3l5885vfxCuvvIJ58+bhhhtuwO2334477rhjwsZpBt3d3ZgxY0ahh0F5wKxlYd5yjDdrRVEwrdiJacVOzJ8++hvVuq4jEk8ZM/7BUBTvt4YRDMXQ2Rs3jvRzO4tG7PEPaCoqS1ywT0BnfxqJ97YczFoOZk1mc8RF/UUXXXTYJX5PPPHEUQ9i9+7dKC8vx4IFCwAAS5YsQXNzM956660jfo4//vGPWLRoEebNmwcA+Kd/+icsXbp0zKI+Ho8jHo8bH4fD4aMefz75/f5CD4HyhFnLwrzlmIysFUWBT3XApzpwXPXYnf374ikEwzGj+H9tVydaQzG0R+LIZLKVv9NuQ7Uvd5l/QFNR5XPBZWcPnfHivS0Hs5aDWZPZHHFR/2kz5cdizpw56OrqwmuvvYbTTjsNTz/9NCKRCPbt2wcA+MEPfoAf/ehHmD9/PtasWYO6uroRz9Hc3IxZs2YZH8+ePRutra1IpVKw20e+zDVr1mD16tWT9pomS39/f6GHQHnCrGVh3nIUMutilx2frSzBZytLxrwmlhx2pF8ohjf3d6Nt4I2AZDrb2b/IpqDaN3KPv9+nwu1k4T8c7205mLUczJrM5oiL+uXLl0/aIDRNw2OPPYaVK1eit7cXp556KubPnw+73Y5f//rXqKmpga7r+MUvfoEvf/nL2Llz5zF/z5UrV+Lmm282Pg6Hw6ipqTnm551sVllRQMeOWcvCvOUwe9aqowizyosxq3zsI/2S6QzaI3EEQ9k9/jsPhvHS++0IhmKIJbNH9imKgkrjSL9s8T+49L/EdVS7/yzJ7HnTxGHWcjBrMpuj+q/qpk2bsH37dsRiMeNzd9999zEN5Oyzz8bZZ58NILs03u/3Y/78+UahrSgKbrjhBnz3u99FV1cXysvLc76+trYWL7zwgvHxvn37EAgERp2lBwCXywWXy3VMYy6E6dOnF3oIlCfMWhbmLcdUyNpRZMOMUjdmlLrHvCad0dFpHOkXxa72Xrz6UXa5f18829lfUYCyYueIPf4Bnxs+99Q40m8q5E1HhlnLwazJbMZd1N94443Yu3cv3nzzTXzta1/D7373O5x//vnHPJDW1lbjvMfbb78d55xzDmbPno22tjZUV1cDAB5//HFUV1ePKOgB4IILLsC3v/1tfPDBB5g3bx4eeOABXHbZZcc8LrMJh8MoKysr9DAoD5i1LMxbDilZDy7Rr/apQE3pqNdkMjoO9SeMPf4HDvVj295DCIZiCEWTGOjvh1K3Y9hS/6E3AMo8TtN39peSNzFrSZg1mc24i/rNmzfjnXfewaJFi3DXXXfhe9/73oQszf/xj3+MrVu3IpVK4dRTT8XatWsRj8fx93//94jH47DZbKioqMDTTz+d8zXTp0/H9ddfD6/Xi1/+8pdYtmwZUqkUGhoa8MgjjxzzuMymt7e30EOgPGHWsjBvOZj1EJtNQUWJCxUlLjTM0Ea9Rtd1hKKDR/pl9/a/93EIwVAUh/oSRmf/Ypf9E8f5ZYv/ihIXigpY+DNvOZi1HMyazEbR9cH/HB6Zk046Cdu2bcPChQuxbds2OBwONDY24r333pusMeZFOByGpmkIhUKmPts+FApB00b/xYemFmYtC/OWg1lPjkgsaTT4G2zy1xqKoSMSx+CvOqqj6BPN/bLFf5XXBcckHenHvOVg1nIwazmsUiOOe6be6/Wiv78fZ5xxBq644gr4/X54PJ7JGBuNorOzkz9EhGDWsjBvOZj15PCqDnhVB+qrxj7SL5pIIxiOoTUURTAUw//syS71bwvHkB440s9RZIN/eNHvy3b2r/K5oDrG39mfecvBrOVg1mQ24y7qH330Udjtdtxxxx2466678Pbbb+Pxxx+fjLHRKKLRaKGHQHnCrGVh3nIw68JxO4vwmYpifKZi7M7+8VQa7eH4wIx/FNtbevDHHUEEQzEkhh3pV2V09s9t8udx5v5qxbzlYNZyMGsym3Evv7/gggvw29/+Fna7HQ0NDdB1HcuXL8dtt902WWPMC6ssrYhEIvB6x56FoKmDWcvCvOVg1taXSmfQYXT2jxkd/ltDMUQTg0f6ARUlLpSpNsyq8uUU/17X1OjsT7l4b8vBrOWwSo047pn6trY2lJaWYtOmTVi2bBnuuOMOLF682PJFvVUEg0H+EBGCWcvCvOVg1tZnL7IhoLkR0MY+0i+T0dHZF8df3vsIDo8T+zr78PruLgRDUURiKeO6acXO3D3+vmzxX+pxsPC3GN7bcjBrMptxF/XJZBIAsGXLFlxwwQVwOBwoKhr/HjM6OvF4vNBDoDxh1rIwbzmYtQw2m4Iqr4rZPgUNC/yjXqPrOrr7k8Ye/4M9Mby1vwetoRh6+hPZawBow4/0G9jj79dUlBeb/0g/SXhvy8GsyWzGvfz+sssuQygUwvvvv4+dO3cCAE4//XS8/fbbkzLAfLHK0or+/n42JhSCWcvCvOVg1rIca966riMcSw0s848OW+4fQ1dfHAP9/eBxFo26x7+yxAX7JHX2p1y8t+Vg1nJYpUYc90z9+vXr8dxzz6GpqQkejwcff/wx1qxZMxljo1E0Nzdj3rx5hR4G5QGzloV5y8GsZTnWvBVFgeZ2QHM7MNc/9nLf3njK6OTfGorhtV2daA3F0B6JIzNQ+Tvttpyj/AZn/qt9Kpx2Fv7Hive2HMyazGbcRb2qqli2bJnx8YwZMzBjxoyJHBMdRiqV+vSLaEpg1rIwbzmYtSz5yrvEZUd9VQnqq0rGvCaWTBtFfzAUw1/3dSMYiiIYjiGVzhb+9iIF1b6Re/z9mnpUR/pJwntbDmZNZjPu5fdTlVWWVsRiMaiqWuhhUB4wa1mYtxzMWhar5Z1IZdAeieUs828NxRAMRxFPZo/0UxQFVT4XAkbx74Zfc8GvuVHiGvd80ZRhtazp6DFrOaxSI8r9yWtRe/bswfz58ws9DMoDZi0L85aDWctitbyddhtmTvNg5rSx9wun0hl09iaMPf5/a4tgy0cdaA3F0BfPzmAqAMpLnCP2+Ad8bvjcU/NIP6tlTUePWZPZsKi3mEwmU+ghUJ4wa1mYtxzMWpapmLe9KLs336+NPVOZyeg41J8wZvoPHOrHtr2HEAzFEIpmT1LSAZR6HEN7/Ict+y8rdlqu8J+KWdPomDWZDZffD7DK0opkMgmHw1HoYVAeMGtZmLcczFoW5j02XdcRiiZzl/mHomgNxdDdn4CuZwt/r2rPFvu+oQZ/AU1FeYkLRSY60o9Zy8Gs5bBKjciZeov58MMP0dDQUOhhUB4wa1mYtxzMWhbmPTZFUVDqcaLU48TxgbF/WY7Ekjl7/D8MRhAMR9ERSWBwbkp1Fhkz/cM7/Fd5XXDk6Ug/Zi0HsyazMU1R/9xzz2HVqlVIJBLweDx46KGH0NTUhKuuugr//d//DbfbjZKSEvz85z/HSSedNOpzKIqChoYGFBVlu7Pef//9WLJkST5fBhERERFNIK/qgFd1YE712Ef69SeyR/oNFv//s+cQWkNRtIfjSA8c6ecYtm1g8Di/gOZGteaCy87O/kRkXaZYft/d3Y36+nps2bIFCxYswNatW/H//X//H3bs2IGnn34aX/rSl2C32/HMM8/ghhtuwL59+0Z9HkVR0N3djdLS0nGPwSpLK7jcRw5mLQvzloNZy8K8zSOeSqM9HEdrKGY0+WsNxdAWjiGRyu6RttkUVPtc2Y7+PtVo8ufXVHich58LY9ZyMGs5rFIjmmKmfvfu3SgvL8eCBQsAAEuWLEFzczPeeustXHjhhcZ1p5xyCj7++GOkUinY7cc29Hg8jng8bnwcDoeP6fnyhct95GDWsjBvOZi1LMzbPFz2ItSUeVBTNnZn/2Q6g45I3Fjqv7M1jD9/0I7WcAyxRBpAdhKp0uuE35fb2b/74734/OLP5evlUAHxviazMUVRP2fOHHR1deG1117DaaedhqeffhqRSAT79u3D4sWLjevuvfdeY9Z+LOeeey5SqRTOPfdc3H777SguLh71ujVr1mD16tUT/lqIiIiIyJocRTZML3Vjeql7zGvSGR1dvYMz/jHs6ejFf+/uxAf7u/DQu9uM66YVO3OK/sE3AUo9Dst19iciczPF8nsA2Lx5M2699Vb09vbi1FNPxebNm7FmzRpjpn7Dhg24/fbbsWXLFlRXV4/6HM3NzaitrUVfXx+uv/56eL1ePPDAA6NeO9pMfU1NjemXVnC5jxzMWhbmLQezloV5yzE8a13XcagvMdTZPxxD28CbAD39iew1ADS3Y8Qef7+morzYCZuJOvtTLt7Xclhl+b1pivrh4vE4/H4/tm3bhvr6emzcuBGrVq3CSy+9hNra2iN6jtdffx3XXnst3nvvvSO63iqB7dixg8t9hGDWsjBvOZi1LMxbjvFmres6wrHUwN7+aE6H/66+OAZ/Q/e47MOK/sGZfzcqveY60k8S3tdyWKVGNMXyewBobW1FIBAAANx+++0455xzUF9fj02bNmHVqlV48cUXD1vQd3d3w+VywePxIJPJYOPGjVi0aFG+hp83Nlt+jmWhwmPWsjBvOZi1LMxbjvFmrSgKNLcDmtuBuf6xO/v3xod39o/i1Y860RqOoSMSR2ags7/LYRuxx9+vqajyqnDa+W9wovG+JrMxzUz9t771LWzduhWpVAqnnnoq7r//fpSWlsLhcMDv96O8vNy49qWXXkJ5eTkefPBBHDx4ELfddhtef/11XHfddVAUBalUCosXL8a9996LsrKyI/r+VnkXJhaLQVXVQg+D8oBZy8K85WDWsjBvOQqZdSyZHprpD0eNGf+2cAyptA4dgN2mfOJIv6E3AVQHj/QbD97XclilRjRNUV9oVgmMy33kYNayMG85mLUszFsOs2edSGXQFs4W+sZe/4E3AeLJ7JF+iqKgyudCwDe0zH/wTYBil2kW+Bac2bOmiWOVGpF3p8Uc61F+ZB3MWhbmLQezloV5y2H2rJ1226ce6ZdKZ9DZmzD2+P+tLYItH3WgNRRDfzwFAFAUoLzYlbPMf7D496l2EZ39zZ41ycOZ+gFWeRemv78fHs/YP4xp6mDWsjBvOZi1LMxbDilZZzI6uvoSQw3+hs38h6NJ47pSj3PEHv+A5sa0KXCkn5SsyTo1It9mspg9e/ZwuY8QzFoW5i0Hs5aFecshJWubTUGl14VKrwuNM7VRr9F1HT39yZw9/ttbetAaiqG7b+hIP69qzxb7PhV+LbvHP6CpqChxmfpIPylZk3WwqLcYl8tV6CFQnjBrWZi3HMxaFuYtB7MeoigKphU7Ma3YifnTR5/d1HUdkXhq2FF+UXwYjCAYjqIjksDgYmLVWTTqHv8qrwv2osJ0oWfWZDYs6i3G7/cXegiUJ8xaFuYtB7OWhXnLwazHR1EU+FQHfKoDx1WPfaRff2L4kX4x/M+eLrSGomgPx5EeONLPabeh2pe7zD+gqajyueCyT3xnf2ZNZsOi3mL279/P5T5CMGtZmLcczFoW5i0Hs54cHqcddZUlqKssGfOaWDKN9nDc2OP/VnO38UZAMp3t7F9kU1DtG7nH3+9T4XaOr/Bn1mQ2LOotxu12F3oIlCfMWhbmLQezloV5y8GsC0d1FKG23IPa8rGb1yXTGbRH4giGsnv8dx4M46X32xEMxRBNpgEANgWo9Lrg97lHNPnzqg7juZg1mQ2LeoupqKgo9BAoT5i1LMxbDmYtC/OWg1mbm6PIhhmlbswoHbsgT2d0dPbGjaX+ezp68d+7OxEMxdAbSxnXlTiBWbtTRnO/weJfc1u/sz9ZE4t6i2lpaYGmjd5plKYWZi0L85aDWcvCvOVg1tY3uES/2qeiqWb0a3Rdx2tvvgst4EcwFMOBnij+uv8QWkMxhPqzR/rpAErdjmEz/UPFf5nHaerO/mRNLOotpqRk7P1ENLUwa1mYtxzMWhbmLQezlkFRFMyo0DB7hoaGGWMf6ReOptA6cJxfMBTDex+HEAxFcagvgYHG/ih22T+xzD+7x7/S60IRC38aBxb1FuPzjX4sCE09zFoW5i0Hs5aFecvBrOX4tKwVRYHmcUDzODDPP/a1kVgSbeHsUv/WUAx/a+tAayiGjkgcmcEj/Ry2Uff4V/tUOAp0pB+ZD4t6izl48CDKysoKPQzKA2YtC/OWg1nLwrzlYNZyTFTWXtUBr+pAfdXYR/pFE2mj8A+Go/jLvkMIhmJoC8eQSmcLf3uRAr9PHbHHv9qnQnVM/JF+ZD4s6i2G7wLLwaxlYd5yMGtZmLcczFqOfGbtdhZhdkUxZlcUj3lNPJU90i84UPy/e6AHf/rf7LL/RCp7pJ/NpqDK6xqxx9/vU1HsYklodUzQYjyesY/qoKmFWcvCvOVg1rIwbzmYtRxmy9plL0JNmQc1ZWOPK5XOoKM3buzx/yAYwcsftqM1FEM0kT3ST1GAihKXUexnZ/zd8GsqfKqdnf1NzDRF/XPPPYdVq1YhkUjA4/HgoYceQlNTE9rb23HllVdi9+7dcLlceOCBB3DmmWeO+hzPPPMMvvvd7yKdTqOxsRHr16+fcu+aBoNBHpkiBLOWhXnLwaxlYd5yMGs5rJi1vciGgOZGQBv7SL9MRkdn39CRfvu7+vE/ew4hGIoiMuxIv1KPc8Qe/4DmxjQPj/QrFFMU9d3d3bj88suxZcsWLFiwAFu3bsXll1+OHTt24Ac/+AFOOeUUPPfcc9i2bRsuuugi7N27Fw6HI+c5ent78c1vfhOvvPIK5s2bhxtuuAG333477rjjjgK9qskxbdq0Qg+B8oRZy8K85WDWsjBvOZi1HFM16+wSfRVVXhWfmzn6Nbquo6c/aezxbw3FsL2lB62hGLr7EtlrAPhU+4g9/n5NRUWxi0f6TQJTFPW7d+9GeXk5FixYAABYsmQJmpub8dZbb2HTpk3YtWsXAOCkk07C9OnT8corr+C8887LeY4//vGPWLRoEebNmwcA+Kd/+icsXbp0zKI+Ho8jHo8bH4fD4cl4aRPuk29m0NTFrGVh3nIwa1mYtxzMWg7JWSuKgmnFTkwrdmL+9NFXROu6jkg8Zcz4B0NRvN8aRjAUQ2dv3DjSz+0swj2XLmQX/wlgiqJ+zpw56OrqwmuvvYbTTjsNTz/9NCKRCPbu3YtkMgm/329cO3v2bDQ3N494jubmZsyaNSvnutbWVqRSKdjtI1/mmjVrsHr16sl5QZOovb0dVVVVhR4G5QGzloV5y8GsZWHecjBrOZj14SmKAp/qgE914LjqsTv798VTLOgniCn+FjVNw2OPPYaVK1fihBNOwPPPP4/58+ejt7d30r7nypUrEQqFjD8tLS2T9r0mUnl5eaGHQHnCrGVh3nIwa1mYtxzMWg5mPTHYdX/imOZv8uyzz8bZZ58NILs03u/34/TTT4fdbkcwGDRm6/ft24fa2toRX19bW4sXXnjB+Hjfvn0IBAKjztIDgMvlgsvlmoRXQkRERERERJQfpinqW1tbEQgEAAC33347zjnnHNTX1+OSSy7Bgw8+iFtvvRXbtm3Dxx9/jC984Qsjvv6CCy7At7/9bXzwwQeYN28eHnjgAVx22WVH/P31gc0dZt9bv3//fhQXj31OJU0dzFoW5i0Hs5aFecvBrOVg1nIM1oaDtaJZmaao//GPf4ytW7cilUrh1FNPxdq1awEA//Zv/4ZvfOMbmDNnDpxOJzZs2GA0p/jxj3+M6dOn4/rrr4fX68Uvf/lLLFu2DKlUCg0NDXjkkUeO+PtHIhEAQE1NzcS/OCIiIiIiIrKkrq4uaJpW6GGMSdHN/rZDnmQyGRw8eBBer9e05yuGw2HU1NSgpaUFPt/o3SZpamDWsjBvOZi1LMxbDmYtB7OWJRQKoba2Ft3d3SgtLS30cMZkmpn6QrPZbJg5c4wDGU3G5/Pxh4gQzFoW5i0Hs5aFecvBrOVg1rLYbKboLz8mc4+OiIiIiIiIiMbEop6IiIiIiIjIoljUW4jL5cItt9zCo/gEYNayMG85mLUszFsOZi0Hs5bFKnmzUR4RERERERGRRXGmnoiIiIiIiMiiWNQTERERERERWRSLeiIiIiIiIiKLYlFPREREREREZFEs6omIiIiIiIgsikU9ERERERERkUWxqCciIiIiIiKyKBb1RERERERERBbFop6IiIiIiIjIoljUExEREREREVkUi3oiIiIiIiIii2JRT0RERERERGRRLOqJiIiIiIiILIpFPREREREREZFFsagnIiIS6sQTT8TLL7981F//8ssv47nnnhv31/3whz/EvHnz0NTUhBNPPBF/+tOfjnoMRERE0rGoJyIimiJSqVRev9/RFvVLlizB22+/jXfeeQdr167FP/7jP6Kvr28SRkhERDT1sagnIiIyOUVRsGrVKixatAjHHXccfvOb3+Q8dsstt+Ckk07CypUr0d7ejq985StobGxEQ0MDHnroIePa1157DQsXLkRDQwOuuuqqnDcBzjrrLDz11FPGx1/96lexfv16AEAoFMI111yDhoYGNDU14eqrr8b27dvx4IMP4je/+Q0WLlyI22677Yhfzxe/+EW43W4AQGNjI3RdR0dHx1H+7RAREclmL/QAiIiI6NMpioK3334be/bswYknnojTTz8ds2fPBgAUFRVh27ZtAIBLL70Uc+fOxRNPPIH29naccMIJaGpqwuLFi3HppZdi3bp1OO+88/D8888bRfun+c53vgO32413330XNpsNHR0dqKysxPXXX4+enh78/Oc/N65dsmQJIpHIqM/z5ptvoqioKOdz69atQ11dHWbNmjXuvxMiIiJiUU9ERGQJ11xzDQCgrq4OZ555JrZs2WIU9VdffbVx3Ysvvog333wTAFBVVYWvfOUrePHFF+HxeGC323HeeecBAJYuXYq6uroj+t7PPPMM3njjDdhs2QV+lZWVY167devWI35NL730ElavXo0XXngBiqIc8dcRERHREBb1REREFjS8CC4pKTmi6w73mN1uRzqdNj6OxWJHNa4jnal/5ZVXcNVVV+EPf/gD5s6de1Tfi4iIiLinnoiIyBLWrVsHANi3bx+2bt2KJUuWjHrdeeedh4cffhgA0NHRgSeeeALnn38+5s2bh1Qqhc2bNwPIzujv3r3b+Lr6+nq88cYbAIC9e/fi1VdfNR678MILceeddyKTyRjPCwA+nw+hUCjn+2/duhXbt28f9c9gQb9lyxZ84xvfwO9//3s0NTUd898NERGRZCzqiYiILCCdTmPRokVYunQp7rvvPmPp/Sfdd999eP/999HY2Iizzz4b//qv/4qTTz4ZTqcTGzduxE033YTGxkb853/+Z05B/S//8i/YvHkzGhsbsXLlSpx88snGY/fccw/i8TgaGxuxcOFC/PCHPwQAXHTRRdi+ffu4G+V985vfRDwex1VXXYWFCxdi4cKFeO+9947uL4aIiEg4Rdd1vdCDICIiorEpioLu7m6UlpYWeihERERkMpypJyIiIiIiIrIoNsojIiIyOS6qIyIiorFwpp6IiIiIiIjIoljUExEREREREVkUi3oiIiIiIiIii+Ke+gGZTAYHDx6E1+uFoiiFHg4REREREREVkK7riEQimD59Omw2886Hs6gfcPDgQdTU1BR6GERERERERGQiLS0tmDlzZqGHMSYW9QO8Xi+AbGA+n6/Aoxnbzp07MX/+/EIPg/KAWcvCvOVg1rIwbzmYtRzMWo5wOIyamhqjVjQrRTf5OTnr1q3D1Vdf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", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "daily_sales = tp.event_set(\n", "\ttimestamps=[\"2020-01-01\", \"2020-01-01\", \"2020-01-02\", \"2020-01-02\"],\n", @@ -2744,7 +1140,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": null, "id": "2c87a680", "metadata": { "lines_to_next_cell": 2 @@ -2783,7 +1179,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": null, "id": "8badbebf", "metadata": {}, "outputs": [], @@ -2814,176 +1210,12 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": null, "id": "479096c3", "metadata": { "lines_to_next_cell": 2 }, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "
\n", - "
\n", - " \n", - " features\n", - " [1]:\n", - " \n", - " sale\n", - " (float64)\n", - "
\n", - "
\n", - " \n", - " indexes\n", - " [2]:\n", - " \n", - " product\n", - " (int64)\n", - " , \n", - " store\n", - " (int64)\n", - "
\n", - "
\n", - " events: \n", - " 4\n", - "
\n", - "
\n", - " index values: \n", - " 3\n", - "
\n", - "
\n", - " memory usage: \n", - " 1.2 kB\n", - "
\n", - "
\n", - "
\n", - " index\n", - " (\n", - " product: \n", - " 1\n", - " , \n", - " store: \n", - " 1\n", - " ) with 2 events\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - " \n", - " timestamp\n", - " \n", - " \n", - " \n", - " sale\n", - " \n", - "
\n", - " 2020-01-01 00:00:00+00:00\n", - " \n", - " 100\n", - "
\n", - " 2020-01-02 00:00:00+00:00\n", - " \n", - " 110\n", - "
\n", - "
\n", - " index\n", - " (\n", - " product: \n", - " 2\n", - " , \n", - " store: \n", - " 1\n", - " ) with 1 events\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - " \n", - " timestamp\n", - " \n", - " \n", - " \n", - " sale\n", - " \n", - "
\n", - " 2020-01-01 00:00:00+00:00\n", - " \n", - " 200\n", - "
\n", - "
\n", - " index\n", - " (\n", - " product: \n", - " 2\n", - " , \n", - " store: \n", - " 2\n", - " ) with 1 events\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - " \n", - " timestamp\n", - " \n", - " \n", - " \n", - " sale\n", - " \n", - "
\n", - " 2020-01-02 00:00:00+00:00\n", - " \n", - " 300\n", - "
\n", - "
\n" - ], - "text/plain": [ - "indexes: [('product', int64), ('store', int64)]\n", - "features: [('sale', float64)]\n", - "events:\n", - " product=1 store=1 (2 events):\n", - " timestamps: ['2020-01-01T00:00:00' '2020-01-02T00:00:00']\n", - " 'sale': [100. 110.]\n", - " product=2 store=1 (1 events):\n", - " timestamps: ['2020-01-01T00:00:00']\n", - " 'sale': [200.]\n", - " product=2 store=2 (1 events):\n", - " timestamps: ['2020-01-02T00:00:00']\n", - " 'sale': [300.]\n", - "memory usage: 1.2 kB" - ] - }, - "execution_count": 35, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "sales_per_product_store = daily_sales.add_index([\"product\", \"store\"])\n", "sales_per_product_store" @@ -3005,7 +1237,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": null, "id": "4df0d8cf", "metadata": { "lines_to_next_cell": 0 @@ -3031,7 +1263,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": null, "id": "8d9448a2", "metadata": { "lines_to_next_cell": 0 @@ -3059,7 +1291,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": null, "id": "4e12a9e0", "metadata": { "lines_to_next_cell": 0 @@ -3095,83 +1327,10 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": null, "id": "c07453fa", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "
\n", - "
\n", - " \n", - " features\n", - " [0]:\n", - " \n", - " none\n", - "
\n", - "
\n", - " \n", - " indexes\n", - " [0]:\n", - " \n", - " none\n", - "
\n", - "
\n", - " events: \n", - " 2\n", - "
\n", - "
\n", - " index values: \n", - " 1\n", - "
\n", - "
\n", - " memory usage: \n", - " 416 B\n", - "
\n", - "
\n", - "
\n", - " index\n", - " (\n", - " ) with 2 events\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - " \n", - " timestamp\n", - " \n", - "
\n", - " 9\n", - "
\n", - " 19\n", - "
\n", - "
\n" - ], - "text/plain": [ - "indexes: []\n", - "features: []\n", - "events:\n", - " (2 events):\n", - " timestamps: [ 9. 19.]\n", - " \n", - "memory usage: 416 B" - ] - }, - "execution_count": 40, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "a = tp.event_set(timestamps=[10, 20])\n", "b = a.leak(1)\n", @@ -3190,36 +1349,20 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": null, "id": "ab15c133", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "False\n" - ] - } - ], + "outputs": [], "source": [ "print(tp.has_leak(a.node()))" ] }, { "cell_type": "code", - "execution_count": 42, + "execution_count": null, "id": "cd455fc1", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "True\n" - ] - } - ], + "outputs": [], "source": [ "print(tp.has_leak(b.node()))" ] @@ -3242,21 +1385,10 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": null, "id": "7da63117", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "IndexData(features=[array([0.1, 0.2, 0.3])], timestamps=array([1., 2., 3.]))" - ] - }, - "execution_count": 43, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "evset = tp.event_set(\n", "\ttimestamps=[1, 2, 3, 5, 6],\n", @@ -3335,18 +1467,10 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": null, "id": "da239494", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "WARNING:root:Feature \"f2\" is an array of numpy.object_ and will be casted to numpy.string_ (Note: numpy.string_ is equivalent to numpy.bytes_).\n" - ] - } - ], + "outputs": [], "source": [ "df = pd.DataFrame({\n", " \"timestamp\": [1, 2, 3, 5, 6],\n", @@ -3380,21 +1504,10 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": null, "id": "d5405837-c801-40e9-8b41-4d4dc901d429", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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Hu+99x6A80eyHD9+vMXREnb5PkDn1AsAID8/H9u2bUNFRQV+/OMfo3v37iguLkZeXh4mT56MyZMnY9myZfjss89QW1vrf1mhadOm4cknn7R4ensz0+ahhx7CV199hfT0dHTq1AkxMTFYvny51aPb3okTJ/DLX/4SycnJuPnmmwEAkZGR+Pe//42nnnoK/fr102kQFqmursa0adNQV1eHiIgI9OnTB1u3boXD4Wj22ElOTsbChQsxZswYAMC4ceOQn59v8fT2ZraNy+XCr3/9a4wePRoRERHo378/VqxYYfX4Yenif8/eeustbNy4EWlpaf7Fy5gxY/CnP/3J4inD08Vt7rrrLuzevRsjRoxAZGQkunbtirVr11o9oq1VVlZi6tSp+O6772AYBpKTk7F69WoAaPbvmVhj+fLluP/++zFv3jxERESgoKAA/fv3t+X3AQ7DMAyrhxARERERERGRttPh9yIiIiIiIiIhSot6ERERERERkRClRb2IiIiIiIhIiNKiXkRERERERCREaVEvIiIiIiIiEqK0qBcREREREREJUVrUi4iIiIiIiIQoLepFREREREREQpQW9SIiIiIiIiIhSot6ERERERERkRClRb2IiIiIiIhIiPr/n9DMo7mF+w8AAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Eager mode\n", "#\n", @@ -3405,21 +1518,10 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": null, "id": "9c854408-0804-4435-8d44-f521ef1b379e", "metadata": {}, - "outputs": [ - { - "data": { - "image/png": "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Hu+99x6A80eyHD9+vMXREnb5PkDn1AsAID8/H9u2bUNFRQV+/OMfo3v37iguLkZeXh4mT56MyZMnY9myZfjss89QW1vrf1mhadOm4cknn7R4ensz0+ahhx7CV199hfT0dHTq1AkxMTFYvny51aPb3okTJ/DLX/4SycnJuPnmmwEAkZGR+Pe//42nnnoK/fr102kQFqmursa0adNQV1eHiIgI9OnTB1u3boXD4Wj22ElOTsbChQsxZswYAMC4ceOQn59v8fT2ZraNy+XCr3/9a4wePRoRERHo378/VqxYYfX4Yenif8/eeustbNy4EWlpaf7Fy5gxY/CnP/3J4inD08Vt7rrrLuzevRsjRoxAZGQkunbtirVr11o9oq1VVlZi6tSp+O6772AYBpKTk7F69WoAaPbvmVhj+fLluP/++zFv3jxERESgoKAA/fv3t+X3AQ7DMAyrhxARERERERGRttPh9yIiIiIiIiIhSot6ERERERERkRClRb2IiIiIiIhIiNKiXkRERERERCREaVEvIiIiIiIiEqK0qBcREREREREJUVrUi4iIiIiIiIQoLepFREREREREQpQW9SIiIiIiIiIhSot6ERERERERkRClRb2IiIiIiIhIiPr/n9DMo7mF+w8AAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Graph mode with @tp.compile\n", "\n", @@ -3437,34 +1539,10 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": null, "id": "e4aa008f-aa8e-486f-a96c-854fb5b2bd83", "metadata": {}, - "outputs": [ - { - "name": "stderr", - "output_type": "stream", - "text": [ - "Build schedule\n", - "Run 4 operators\n", - " 1 / 4: SELECT [0.00007 s]\n", - " 2 / 4: SIMPLE_MOVING_AVERAGE [0.00008 s]\n", - " 3 / 4: SIMPLE_MOVING_AVERAGE [0.00003 s]\n", - " 4 / 4: SUBTRACTION [0.00005 s]\n", - "Execution in 0.00075 s\n" - ] - }, - { - "data": { - "image/png": "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Hu+99x6A80eyHD9+vMXREnb5PkDn1AsAID8/H9u2bUNFRQV+/OMfo3v37iguLkZeXh4mT56MyZMnY9myZfjss89QW1vrf1mhadOm4cknn7R4ensz0+ahhx7CV199hfT0dHTq1AkxMTFYvny51aPb3okTJ/DLX/4SycnJuPnmmwEAkZGR+Pe//42nnnoK/fr102kQFqmursa0adNQV1eHiIgI9OnTB1u3boXD4Wj22ElOTsbChQsxZswYAMC4ceOQn59v8fT2ZraNy+XCr3/9a4wePRoRERHo378/VqxYYfX4Yenif8/eeustbNy4EWlpaf7Fy5gxY/CnP/3J4inD08Vt7rrrLuzevRsjRoxAZGQkunbtirVr11o9oq1VVlZi6tSp+O6772AYBpKTk7F69WoAaPbvmVhj+fLluP/++zFv3jxERESgoKAA/fv3t+X3AQ7DMAyrhxARERERERGRttPh9yIiIiIiIiIhSot6ERERERERkRClRb2IiIiIiIhIiNKiXkRERERERCREaVEvIiIiIiIiEqK0qBcREREREREJUVrUi4iIiIiIiIQoLepFREREREREQpQW9SIiIiIiIiIhSot6ERERERERkRClRb2IiIiIiIhIiPr/n9DMo7mF+w8AAAAASUVORK5CYII=", - "text/plain": [ - "
" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], + "outputs": [], "source": [ "# Graph mode without @tp.compile\n", "\n", @@ -3493,7 +1571,7 @@ "\n", "**Remark:** While you will likely use the graph mode with `@tp.compile` , it is useful for you to understand the graph model without `@tp.compile`.\n", "\n", - "A Temporian program is a graph of [EventSetNodes][temporian.EventSetNode] connecting operators. A graph is executed with the function `tp.run(, )`.\n", + "A Temporian program is a graph of `EventSetNodes` connecting operators. A graph is executed with the function `tp.run(, )`.\n", "\n", "\"eager\n", "\n", @@ -3511,7 +1589,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": null, "id": "dd4142a0-df47-4ca3-aafe-7a105b4f2deb", "metadata": {}, "outputs": [], @@ -3550,7 +1628,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": null, "id": "b0b0220b-9869-454c-8f3b-afeabaca06bc", "metadata": {}, "outputs": [], @@ -3581,7 +1659,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": null, "id": "945d8f39-18ad-44df-a4d2-9d8986e7825b", "metadata": {}, "outputs": [], @@ -3604,19 +1682,10 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": null, "id": "941a5fc4-edfc-4fba-8bc8-22f3a7387e91", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[('a_branch', float64)]\n", - "[('non_a_branch', float64)]\n" - ] - } - ], + "outputs": [], "source": [ "@tp.compile\n", "def my_function(x : tp.types.EventSetOrNode, a:bool) -> tp.types.EventSetOrNode:\n", @@ -3641,95 +1710,10 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": null, "id": "a9ab68f3-91a6-445e-99c2-7f2379185f21", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "
\n", - "
\n", - " \n", - " features\n", - " [1]:\n", - " \n", - " value\n", - " (int64)\n", - "
\n", - "
\n", - " \n", - " indexes\n", - " [0]:\n", - " \n", - " none\n", - "
\n", - "
\n", - " events: \n", - " 2\n", - "
\n", - "
\n", - " index values: \n", - " 1\n", - "
\n", - "
\n", - " memory usage: \n", - " 0.5 kB\n", - "
\n", - "
\n", - "
\n", - " index\n", - " (\n", - " ) with 2 events\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - " \n", - " timestamp\n", - " \n", - " \n", - " \n", - " value\n", - " \n", - "
\n", - " 1\n", - " \n", - " 10\n", - "
\n", - " 2\n", - " \n", - " 11\n", - "
\n", - "
\n" - ], - "text/plain": [ - "indexes: []\n", - "features: [('value', int64)]\n", - "events:\n", - " (2 events):\n", - " timestamps: [1. 2.]\n", - " 'value': [10 11]\n", - "memory usage: 0.5 kB" - ] - }, - "execution_count": 54, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "@tp.compile\n", "def my_function(x : tp.types.EventSetOrNode) -> tp.types.EventSetOrNode:\n", @@ -3788,7 +1772,7 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": null, "id": "d4fc33b0", "metadata": { "lines_to_next_cell": 0 @@ -3838,103 +1822,10 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": null, "id": "56a28657", "metadata": {}, - "outputs": [ - { - "data": { - "text/html": [ - "
\n", - "
\n", - "
\n", - " \n", - " features\n", - " [1]:\n", - " \n", - " count\n", - " (int32)\n", - "
\n", - "
\n", - " \n", - " indexes\n", - " [0]:\n", - " \n", - " none\n", - "
\n", - "
\n", - " events: \n", - " 3\n", - "
\n", - "
\n", - " index values: \n", - " 1\n", - "
\n", - "
\n", - " memory usage: \n", - " 0.5 kB\n", - "
\n", - "
\n", - "
\n", - " index\n", - " (\n", - " ) with 3 events\n", - "
\n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - " \n", - "
\n", - " \n", - " timestamp\n", - " \n", - " \n", - " \n", - " count\n", - " \n", - "
\n", - " 1\n", - " \n", - " 1\n", - "
\n", - " 2\n", - " \n", - " 1\n", - "
\n", - " 3\n", - " \n", - " 1\n", - "
\n", - "
\n" - ], - "text/plain": [ - "indexes: []\n", - "features: [('count', int32)]\n", - "events:\n", - " (3 events):\n", - " timestamps: [1. 2. 3.]\n", - " 'count': [1 1 1]\n", - "memory usage: 0.5 kB" - ] - }, - "execution_count": 56, - "metadata": {}, - "output_type": "execute_result" - } - ], + "outputs": [], "source": [ "# Define a graph.\n", "evset = tp.event_set(\n", From 13711cd92917f771e3cc64d8e0cf471eb3605401 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Braulio=20R=C3=ADos?= Date: Fri, 27 Oct 2023 15:23:47 -0300 Subject: [PATCH 6/9] Update getting_started path in rtd & git-hook --- .git-hooks/pre-commit | 2 +- docs/.readthedocs.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.git-hooks/pre-commit b/.git-hooks/pre-commit index fc5307923..b161bf8b0 100755 --- a/.git-hooks/pre-commit +++ b/.git-hooks/pre-commit @@ -2,7 +2,7 @@ # files_to_check="docs/src/recipes/*.ipynb" files_to_check+=" docs/src/user_guide.ipynb" -files_to_check+=" docs/src/tutorials/getting_started.ipynb" +files_to_check+=" docs/src/getting_started.ipynb" for path in `git diff --name-only --staged $files_to_check` diff --git a/docs/.readthedocs.yaml b/docs/.readthedocs.yaml index c75ae4b88..16bb1b18c 100644 --- a/docs/.readthedocs.yaml +++ b/docs/.readthedocs.yaml @@ -27,9 +27,9 @@ build: - pip install -r docs/src/tutorials/requirements.txt pre_build: + - tools/run_notebooks.sh docs/src/getting_started.ipynb - tools/run_notebooks.sh docs/src/user_guide.ipynb - tools/run_notebooks.sh $(ls docs/src/recipes/*.ipynb) - - tools/run_notebooks.sh docs/src/tutorials/getting_started.ipynb # These are too slow # - tools/run_notebooks.sh docs/src/tutorials/*.ipynb From 3275d158373aef2c46ebdee77f2f59ce2a446a8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Braulio=20R=C3=ADos?= Date: Tue, 31 Oct 2023 12:10:37 -0300 Subject: [PATCH 7/9] Symlink in tutorials/getting_started (old url was shared) --- docs/src/tutorials/getting_started.ipynb | 1 + 1 file changed, 1 insertion(+) create mode 120000 docs/src/tutorials/getting_started.ipynb diff --git a/docs/src/tutorials/getting_started.ipynb b/docs/src/tutorials/getting_started.ipynb new file mode 120000 index 000000000..fae9ca7ed --- /dev/null +++ b/docs/src/tutorials/getting_started.ipynb @@ -0,0 +1 @@ +docs/src/getting_started.ipynb \ No newline at end of file From 3d235c8c9ed7ce8c33e4e80cf44e9604cdfbde53 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Braulio=20R=C3=ADos?= Date: Tue, 31 Oct 2023 13:54:59 -0300 Subject: [PATCH 8/9] Address PR comments on getting_started --- docs/src/getting_started.ipynb | 95 +++++++++++++++++++++++----------- docs/src/user_guide.ipynb | 10 ++-- 2 files changed, 70 insertions(+), 35 deletions(-) diff --git a/docs/src/getting_started.ipynb b/docs/src/getting_started.ipynb index b01eebab9..b48013491 100644 --- a/docs/src/getting_started.ipynb +++ b/docs/src/getting_started.ipynb @@ -6,19 +6,23 @@ "id": "b8dd3ccc", "metadata": {}, "source": [ - "# Getting Started with Temporian\n", + "# Getting Started\n", "\n", "[![Open in Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/google/temporian/blob/last-release/docs/src/tutorials/getting_started.ipynb)\n", "\n", - "This guide will introduce you to the basics of Temporian, including:\n", - "- What is an **EventSet** and how to create one from scratch.\n", - "- Visualizing input/output data using **EventSet.plot()** and interactive plots.\n", - "- Converting back and forth between EventSets and pandas **DataFrames**.\n", - "- Transforming the EventSets by using **operators**.\n", - "- How operators work when using **indexes**.\n", - "- Commonly used operations like **glue**, **resample**, **lag**, moving windows and arithmetics.\n", + "Temporian is an open-source Python library for preprocessing and feature engineering temporal data, to get it ready for machine learning applications 🤖.\n", "\n", - "If you're interested in a topic that is not included here, we provide links to other parts of the documentation on the final section, to continue learning." + "This guide will introduce you to the basics of the library, including how to:\n", + "- Create an `EventSet` and use it.\n", + "- Visualize input/output data using `EventSet.plot()` and interactive plots.\n", + "- Convert back and forth between `EventSet` and pandas `DataFrame`.\n", + "- Transform an `EventSet` by using **operators**.\n", + "- Work with `indexes`.\n", + "- Use common operators like `glue`, `resample`, `lag`, moving windows and arithmetics.\n", + "\n", + "If you're interested in a topic that is not included here, we provide links to other parts of the documentation on the final section, to continue learning.\n", + "\n", + "By reading this guide, you will learn how to implement a processing pipeline with Temporian, to get your data ready to train machine learning models by using straightforward operations and avoiding common mistakes." ] }, { @@ -68,17 +72,47 @@ "source": [ "## Part 1: Events and EventSets\n", "\n", - "The most basic unit of data in Temporian is an **event**. An event consists of a timestamp and a set of feature values.\n", + "Events are the basic unit of data in Temporian. They consist of a timestamp and a set of feature values. Events are not handled individually, but are instead grouped together into **[`EventSets`](https://temporian.readthedocs.io/en/stable/user_guide/#events-and-eventsets)**.\n", + "\n", + "The main data structure in Temporian is the **[`EventSet`](https://temporian.readthedocs.io/en/stable/user_guide/#events-and-eventsets)**, and it represents **[multivariate and multi-index time sequences](https://temporian.readthedocs.io/en/stable/user_guide/#what-is-temporal-data)**. Let's break that down:\n", + "\n", + "- **multivariate:** indicates that each event in the time sequence holds several feature values.\n", + "- **multi-index:** indicates that the events can represent hierarchical data, and be therefore grouped by one or more of their features' values.\n", + "- **time sequence:** indicates that the events are not necessarily sampled at a uniform rate (in which case we would call it a *time series*).\n", "\n", - "Events are not handled individually. Instead, events are grouped together into an **`EventSet`**.\n", + "You can create an `EventSet` from a pandas DataFrame, NumPy arrays, CSV files, and more. Here is an example containing only 3 events and 2 features:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "9cfb0cb1", + "metadata": {}, + "outputs": [], + "source": [ + "evset = tp.event_set(\n", + " timestamps=[1, 2, 3],\n", + " features={\n", + " \"feature_1\": [10, 20, 30],\n", + " \"feature_2\": [False, False, True],\n", + " },\n", + ")\n", + "evset" + ] + }, + { + "cell_type": "markdown", + "id": "c8267798", + "metadata": {}, + "source": [ + "An `EventSet` can hold one or several time sequences, depending on its index.\n", "\n", - "`EventSets` are the main data structures in Temporian, and represent **[multivariate and multi-index time sequences](../user_guide/#what-is-temporal-data)**. Let's break that down:\n", + "- If it has no index (e.g: above case), an `EventSet` holds a single multivariate time sequence.\n", + "- If it has one (or more) indexes, the events are grouped by their index values. This means that the `EventSet` will hold one multivariate time sequence for each unique value (or unique combination of values) of its indexes.\n", "\n", - "- \"multivariate\" indicates that each event in the time sequence holds several feature values.\n", - "- \"multi-index\" indicates that the events can represent hierarchical data, and be therefore grouped by one or more of their features' values.\n", - "- \"sequence\" indicates that the events are not necessarily sampled at a uniform rate (in which case we would call it a time \"series\").\n", + "Operators are applied on each time sequence of an `EventSet` independently. Indexing is the primary way to handle rich and complex databases. For instance, in a retail database, you can index on customers, stores, products, etc.\n", "\n", - "You can create an `EventSet` from a pandas DataFrame, NumPy arrays, CSV files, and more. Here is an example containing four events and three features (one of which is used as an `index`):" + "The following example will create one sequence for `blue` events, and another one for `red` ones, by specifying that one of the features is an `index`:" ] }, { @@ -88,6 +122,7 @@ "metadata": {}, "outputs": [], "source": [ + "# EventSet with indexes\n", "evset = tp.event_set(\n", " timestamps=[\"2023-02-04\", \"2023-02-06\", \"2023-02-07\", \"2023-02-07\"],\n", " features={\n", @@ -105,12 +140,6 @@ "id": "effc4483-9a1a-4e21-b376-3ed188ced821", "metadata": {}, "source": [ - "An `EventSet` can hold one or several time sequences, depending on what its `index` is.\n", - "\n", - "If it has no index, it will hold a single multivariate time sequence, which means that all events will be considered part of the same group and will interact with each other when operators are applied.\n", - "\n", - "If it has one (or many) indexes, its events will be grouped by their `indexes` values, so it will hold one multivariate time sequence for each unique value (or unique combination of values) of its indexes, and operators will be applied to each time sequence independently.\n", - "\n", "See the last part of this tutorial to see some examples using `indexes` and operators." ] }, @@ -122,9 +151,9 @@ "source": [ "### Example Data\n", "\n", - "This minimal data consists of just one `signal` with a `timestamp` for each sample.\n", + "For the following examples, we will generate some fake data which consists of a `signal` with a `timestamp` for each sample.\n", "\n", - "The signal is a periodic sinusoidal `season` with a slight positive slope in the long run, which we call `trend`. Plus the ubiquitous `noise`." + "The signal is composed of a periodic `season` (sine wave), with a slight positive slope which we call `trend`. Plus the ubiquitous `noise`. We will include all these components as separate features, together with the resulting `signal`." ] }, { @@ -388,7 +417,7 @@ "### Exporting outputs from Temporian\n", "You may need to use this data in different ways for downstream tasks, like training a model using whatever library you need. \n", "\n", - "If you can't use the data directly from Temporian, you can always go back to a pandas DataFrame:" + "If you can't use the data directly from Temporian, you can always go back to a pandas `DataFrame`:" ] }, { @@ -514,11 +543,11 @@ "## Summary\n", "\n", "Congratulations! You now have the basic concepts needed to create a data preprocessing pipeline with Temporian:\n", - "- Defining an **EventSet** and using **operators** on it.\n", - "- Combine **features** using **select** and **glue**.\n", - "- Coverting data back and forth between Temporian's **EventSet** and pandas **DataFrames**.\n", - "- Visualizing input/output data using **EventSet.plot()**.\n", - "- Operating and plotting with an **index**.\n", + "- Defining an `EventSet` and using **operators** on it.\n", + "- Combine features using `select` and `glue`.\n", + "- Converting data back and forth between Temporian's `EventSet` and pandas `DataFrames`.\n", + "- Visualizing input/output data using `EventSet.plot()`.\n", + "- Operating and plotting with `indexes`.\n", "\n", "### Other important details\n", "\n", @@ -536,6 +565,12 @@ "- We could only cover a small fraction of **[all available operators](https://temporian.readthedocs.io/en/stable/reference/temporian/operators/add_index/)**.\n", "- We put a lot of ❤️ in the **[User Guide](https://temporian.readthedocs.io/en/stable/user_guide/)**, so make sure to check it out 🙂." ] + }, + { + "cell_type": "markdown", + "id": "cebffed7", + "metadata": {}, + "source": [] } ], "metadata": { diff --git a/docs/src/user_guide.ipynb b/docs/src/user_guide.ipynb index ca7602e5a..6a018928d 100644 --- a/docs/src/user_guide.ipynb +++ b/docs/src/user_guide.ipynb @@ -8,7 +8,7 @@ "source": [ "# User Guide\n", "\n", - "This is a complete tour of Temporian's capabilities. For a quick hands-on overview, make sure to check the [Getting started guide](./getting_started)." + "This is a complete tour of Temporian's capabilities. For a quick hands-on overview, make sure to check the [Getting started guide](https://temporian.readthedocs.io/en/stable/getting_started)." ] }, { @@ -187,7 +187,7 @@ "result = evset.simple_moving_average(window_length=1)\n", "\n", "# Plot the results\n", - "tp.plot([evset, result]) " + "tp.plot([evset, result])" ] }, { @@ -1533,7 +1533,7 @@ " return sma_2 - sma_4\n", "\n", "result = my_function(evset)\n", - " \n", + "\n", "result.plot()" ] }, @@ -1557,7 +1557,7 @@ "sma_4_node = f1_node.simple_moving_average(window_length=4)\n", "result_node = sma_2_node - sma_4_node\n", "result = tp.run(result_node, {input_node: evset}, verbose=1)\n", - " \n", + "\n", "result.plot()" ] }, @@ -1801,7 +1801,7 @@ " features=a_evset.schema.features,\n", " indexes=a_evset.schema.indexes\n", ")\n", - " \n", + "\n", "a_node = a_evset.node()" ] }, From 6bb9f13494e8e654a2e59e99887f91d36a83117e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Braulio=20R=C3=ADos?= Date: Tue, 31 Oct 2023 15:30:17 -0300 Subject: [PATCH 9/9] Added rtd redirect (admin page), removed symlink tutorials/getting_started --- docs/src/tutorials/getting_started.ipynb | 1 - 1 file changed, 1 deletion(-) delete mode 120000 docs/src/tutorials/getting_started.ipynb diff --git a/docs/src/tutorials/getting_started.ipynb b/docs/src/tutorials/getting_started.ipynb deleted file mode 120000 index fae9ca7ed..000000000 --- a/docs/src/tutorials/getting_started.ipynb +++ /dev/null @@ -1 +0,0 @@ -docs/src/getting_started.ipynb \ No newline at end of file