From 1eccf7ea6dc48321501bb475cce314920066669a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20Zolt=C3=A1n=20Szab=C3=B3?= Date: Wed, 29 May 2019 17:36:15 +0200 Subject: [PATCH 01/15] Added dataframes intro file to the ML section, amended overview.asciidoc accordingly. --- docs/en/stack/ml/dataframes.asciidoc | 29 ++++++++++++++++++++++++++++ docs/en/stack/ml/overview.asciidoc | 1 + 2 files changed, 30 insertions(+) create mode 100644 docs/en/stack/ml/dataframes.asciidoc diff --git a/docs/en/stack/ml/dataframes.asciidoc b/docs/en/stack/ml/dataframes.asciidoc new file mode 100644 index 000000000..bdd8c0a30 --- /dev/null +++ b/docs/en/stack/ml/dataframes.asciidoc @@ -0,0 +1,29 @@ +[[ml-dataframes]] +== Data frames +++++ +Dataframes +++++ + +A :dataframe: is a transformation of a dataset by certain rules defined during +the creation of the :dataframe:. You can think of a :dataframe: like a +spreadsheet or a data table. + +:es: datasets consist of individual documents that have fields and +values in each field. This architecture makes hard to run analyses that require +reorganized or summarized fields of the dataset. :ml-cap: analyses need clean +and transformed data. That is the point where :dataframes: come into play. + +To transform the data into a :dataframe:, you need to define a pivot. This +process is called pivoting. During pivoting, you create a set of features that +transform the dataset into a different, more digestible format to make +calculations on your data. Pivoting results in a summary of your dataset. + +When you define a pivot, you select one or more fields that your dataset will +be grouped by. You can select *categorical fields* (fields contain strings as +values) for grouping. You can select *numerical fields* for grouping only as +histograms. + +[EXAMPLE – TO DO] + +IMPORTANT: Creating a :dataframe: leaves your dataset intact. It does not amend +the dataset itself. \ No newline at end of file diff --git a/docs/en/stack/ml/overview.asciidoc b/docs/en/stack/ml/overview.asciidoc index e52377d9d..92f5ba526 100644 --- a/docs/en/stack/ml/overview.asciidoc +++ b/docs/en/stack/ml/overview.asciidoc @@ -11,3 +11,4 @@ include::buckets.asciidoc[] include::calendars.asciidoc[] include::rules.asciidoc[] include::architecture.asciidoc[] +include::dataframes.asciidoc[] From e4a91a3f17c45d25a96a9d6712799ea51506a9df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20Zolt=C3=A1n=20Szab=C3=B3?= Date: Wed, 29 May 2019 17:39:30 +0200 Subject: [PATCH 02/15] Fixed paragraph style. --- docs/en/stack/ml/dataframes.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/stack/ml/dataframes.asciidoc b/docs/en/stack/ml/dataframes.asciidoc index bdd8c0a30..cafab7dda 100644 --- a/docs/en/stack/ml/dataframes.asciidoc +++ b/docs/en/stack/ml/dataframes.asciidoc @@ -23,7 +23,7 @@ be grouped by. You can select *categorical fields* (fields contain strings as values) for grouping. You can select *numerical fields* for grouping only as histograms. -[EXAMPLE – TO DO] +examlpe - to do IMPORTANT: Creating a :dataframe: leaves your dataset intact. It does not amend the dataset itself. \ No newline at end of file From ca68a7a2491dfd8c60cc99e05cf5a7b0f0efa355 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20Zolt=C3=A1n=20Szab=C3=B3?= Date: Wed, 29 May 2019 17:49:25 +0200 Subject: [PATCH 03/15] Fixed markup. --- docs/en/stack/ml/dataframes.asciidoc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/en/stack/ml/dataframes.asciidoc b/docs/en/stack/ml/dataframes.asciidoc index cafab7dda..076da65f3 100644 --- a/docs/en/stack/ml/dataframes.asciidoc +++ b/docs/en/stack/ml/dataframes.asciidoc @@ -4,16 +4,16 @@ Dataframes ++++ -A :dataframe: is a transformation of a dataset by certain rules defined during -the creation of the :dataframe:. You can think of a :dataframe: like a +A {dataframe} is a transformation of a dataset by certain rules defined during +the creation of the {dataframe}. You can think of a {dataframe} like a spreadsheet or a data table. :es: datasets consist of individual documents that have fields and values in each field. This architecture makes hard to run analyses that require -reorganized or summarized fields of the dataset. :ml-cap: analyses need clean -and transformed data. That is the point where :dataframes: come into play. +reorganized or summarized fields of the dataset. {ml-cap} analyses need clean +and transformed data. That is the point where {dataframe}s come into play. -To transform the data into a :dataframe:, you need to define a pivot. This +To transform the data into a {dataframe}, you need to define a pivot. This process is called pivoting. During pivoting, you create a set of features that transform the dataset into a different, more digestible format to make calculations on your data. Pivoting results in a summary of your dataset. @@ -25,5 +25,5 @@ histograms. examlpe - to do -IMPORTANT: Creating a :dataframe: leaves your dataset intact. It does not amend +IMPORTANT: Creating a {dataframe} leaves your dataset intact. It does not amend the dataset itself. \ No newline at end of file From 016d36f4b15559bcd7dd99541c610d670fb296a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20Zolt=C3=A1n=20Szab=C3=B3?= Date: Wed, 29 May 2019 17:51:54 +0200 Subject: [PATCH 04/15] Fixed markup. --- docs/en/stack/ml/dataframes.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/stack/ml/dataframes.asciidoc b/docs/en/stack/ml/dataframes.asciidoc index 076da65f3..614524162 100644 --- a/docs/en/stack/ml/dataframes.asciidoc +++ b/docs/en/stack/ml/dataframes.asciidoc @@ -8,7 +8,7 @@ A {dataframe} is a transformation of a dataset by certain rules defined during the creation of the {dataframe}. You can think of a {dataframe} like a spreadsheet or a data table. -:es: datasets consist of individual documents that have fields and +{es} datasets consist of individual documents that have fields and values in each field. This architecture makes hard to run analyses that require reorganized or summarized fields of the dataset. {ml-cap} analyses need clean and transformed data. That is the point where {dataframe}s come into play. From 1916513bd0893a35cdd09104a5d2c07f0fa8f528 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20Zolt=C3=A1n=20Szab=C3=B3?= Date: Wed, 29 May 2019 18:03:32 +0200 Subject: [PATCH 05/15] Rephrased sentences to improve readability. --- docs/en/stack/ml/dataframes.asciidoc | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/en/stack/ml/dataframes.asciidoc b/docs/en/stack/ml/dataframes.asciidoc index 614524162..73dd04549 100644 --- a/docs/en/stack/ml/dataframes.asciidoc +++ b/docs/en/stack/ml/dataframes.asciidoc @@ -5,7 +5,7 @@ ++++ A {dataframe} is a transformation of a dataset by certain rules defined during -the creation of the {dataframe}. You can think of a {dataframe} like a +the creation of the {dataframe}. You can think of a it like a spreadsheet or a data table. {es} datasets consist of individual documents that have fields and @@ -13,10 +13,10 @@ values in each field. This architecture makes hard to run analyses that require reorganized or summarized fields of the dataset. {ml-cap} analyses need clean and transformed data. That is the point where {dataframe}s come into play. -To transform the data into a {dataframe}, you need to define a pivot. This -process is called pivoting. During pivoting, you create a set of features that -transform the dataset into a different, more digestible format to make -calculations on your data. Pivoting results in a summary of your dataset. +To transform the data into a {dataframe}, you need to define a pivot. During +pivoting, you create a set of features that transform the dataset into a +different, more digestible format to make calculations on your data. Pivoting +results in a summary of your dataset (which is a {dataframe}). When you define a pivot, you select one or more fields that your dataset will be grouped by. You can select *categorical fields* (fields contain strings as From 65f6dab3d0ca1d7609c641580c1f69b80fd7eebb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20Zolt=C3=A1n=20Szab=C3=B3?= Date: Thu, 30 May 2019 15:59:04 +0200 Subject: [PATCH 06/15] Fixed header. --- docs/en/stack/ml/dataframes.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/stack/ml/dataframes.asciidoc b/docs/en/stack/ml/dataframes.asciidoc index 73dd04549..2098d3758 100644 --- a/docs/en/stack/ml/dataframes.asciidoc +++ b/docs/en/stack/ml/dataframes.asciidoc @@ -1,5 +1,5 @@ [[ml-dataframes]] -== Data frames +=== Data frames ++++ Dataframes ++++ From a5642307d66737a3ee9c22cd180dd39c44abcdb5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20Zolt=C3=A1n=20Szab=C3=B3?= Date: Fri, 31 May 2019 10:42:15 +0200 Subject: [PATCH 07/15] Extended the text: pivoting, aggregation, continuous data frames. --- docs/en/stack/ml/dataframes.asciidoc | 48 ++++++++++++++++++---------- 1 file changed, 31 insertions(+), 17 deletions(-) diff --git a/docs/en/stack/ml/dataframes.asciidoc b/docs/en/stack/ml/dataframes.asciidoc index 2098d3758..0f74589e8 100644 --- a/docs/en/stack/ml/dataframes.asciidoc +++ b/docs/en/stack/ml/dataframes.asciidoc @@ -1,29 +1,43 @@ [[ml-dataframes]] -=== Data frames -++++ -Dataframes -++++ +=== {dataframes-cap} -A {dataframe} is a transformation of a dataset by certain rules defined during -the creation of the {dataframe}. You can think of a it like a -spreadsheet or a data table. +{dataframes-cap} feature is available in 7.2 and later. + +A _{dataframe}_ is a transformation of a dataset by certain rules defined during +the creation of the {dataframe}. You can think of it like a spreadsheet or a +data table that makes your data ready to be analyzed and organized. {es} datasets consist of individual documents that have fields and -values in each field. This architecture makes hard to run analyses that require -reorganized or summarized fields of the dataset. {ml-cap} analyses need clean -and transformed data. That is the point where {dataframe}s come into play. +values in each field. This architecture makes search easy but on the other hand, +makes it hard to run analyses that require reorganized or summarized fields of +the dataset. {ml-cap} analyses need clean and transformed data and that is the +point where {dataframes} come into play. -To transform the data into a {dataframe}, you need to define a pivot. During +To transform the data into a {dataframe}, you need to define a _pivot_. During pivoting, you create a set of features that transform the dataset into a different, more digestible format to make calculations on your data. Pivoting -results in a summary of your dataset (which is a {dataframe}). +results in a summary of your dataset (which is the {dataframe} itself). + +Defining a pivot consist of two main parts. First, you select one or more fields +that your dataset will be grouped by. Principally you can select categorical +fields (terms) for grouping. You can also select numerical fields, in this case, +the field values will be bucketed using an interval you specify. The analysis +will run against every bucket that was created this way. + +The second step is selecting one or more aggregations to perform analysis over +the dataset. When using aggregations, you practically ask questions about the +dataset to analyze the data. There are different types of aggregations, each with +its own purpose and output. You can learn more about the supported aggregations +and group-by fields here (!add a link!). + +As an optional step, it's also possible to add a query to further limit the +scope of the aggregation. -When you define a pivot, you select one or more fields that your dataset will -be grouped by. You can select *categorical fields* (fields contain strings as -values) for grouping. You can select *numerical fields* for grouping only as -histograms. +IMPORTANT: In 7.2, you can build {dataframes} on the top of a static dataset. +When new data comes into the index, you have to perform the transformation again +on the altered data. {con-dataframes-cap} will be introduced in 7.3. -examlpe - to do +example - to do IMPORTANT: Creating a {dataframe} leaves your dataset intact. It does not amend the dataset itself. \ No newline at end of file From 236ba3af88bc8210a566a5cc6823f3976e9a06eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20Zolt=C3=A1n=20Szab=C3=B3?= Date: Fri, 31 May 2019 15:38:15 +0200 Subject: [PATCH 08/15] Amended the promise about continuous data frames. --- docs/en/stack/ml/dataframes.asciidoc | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docs/en/stack/ml/dataframes.asciidoc b/docs/en/stack/ml/dataframes.asciidoc index 0f74589e8..75020ce37 100644 --- a/docs/en/stack/ml/dataframes.asciidoc +++ b/docs/en/stack/ml/dataframes.asciidoc @@ -35,9 +35,11 @@ scope of the aggregation. IMPORTANT: In 7.2, you can build {dataframes} on the top of a static dataset. When new data comes into the index, you have to perform the transformation again -on the altered data. {con-dataframes-cap} will be introduced in 7.3. +on the altered data. Using {dataframes} does not require {dfeeds}. +{con-dataframes-cap} will be introduced in a later version. -example - to do +.Example +TO DO -IMPORTANT: Creating a {dataframe} leaves your dataset intact. It does not amend -the dataset itself. \ No newline at end of file +IMPORTANT: Creating a {dataframe} leaves your source index intact. A new index will +be created dedicated for the {dataframe}. \ No newline at end of file From 04051ba60d17766741f811cbf24885b05157888b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20Zolt=C3=A1n=20Szab=C3=B3?= Date: Fri, 31 May 2019 15:40:42 +0200 Subject: [PATCH 09/15] Fixed typo. --- docs/en/stack/ml/dataframes.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/stack/ml/dataframes.asciidoc b/docs/en/stack/ml/dataframes.asciidoc index 75020ce37..cb0654ef5 100644 --- a/docs/en/stack/ml/dataframes.asciidoc +++ b/docs/en/stack/ml/dataframes.asciidoc @@ -42,4 +42,4 @@ on the altered data. Using {dataframes} does not require {dfeeds}. TO DO IMPORTANT: Creating a {dataframe} leaves your source index intact. A new index will -be created dedicated for the {dataframe}. \ No newline at end of file +be created dedicated to the {dataframe}. \ No newline at end of file From 7e892969c8774fc799bd9d1486f4c14720bc3703 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20Zolt=C3=A1n=20Szab=C3=B3?= Date: Fri, 31 May 2019 17:51:50 +0200 Subject: [PATCH 10/15] Added simple example to the intro. --- docs/en/stack/ml/dataframes.asciidoc | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/docs/en/stack/ml/dataframes.asciidoc b/docs/en/stack/ml/dataframes.asciidoc index cb0654ef5..567ec5dc4 100644 --- a/docs/en/stack/ml/dataframes.asciidoc +++ b/docs/en/stack/ml/dataframes.asciidoc @@ -39,7 +39,18 @@ on the altered data. Using {dataframes} does not require {dfeeds}. {con-dataframes-cap} will be introduced in a later version. .Example -TO DO +Put the case that you run a webshop that sells clothes. Every order creates a +document that contains a unique order ID, the name and the category of the +ordered product, its price, the ordered quantity, the exact date of the order, +and some customer information (name, gender, location, etc). Your dataset +contains the documents of all the transactions from last year. + +If you want to check the sales in the different categories in your last fiscal year, +define a {dataframe} that is grouped by the product categories (women's shoes, men's +clothing, etc.) and the order date histogram with the interval of the last year, +then set a sum aggregation on the ordered quantity. The result is a {dataframe} +pivot that shows the number of sold items in every product category in the last +year. IMPORTANT: Creating a {dataframe} leaves your source index intact. A new index will be created dedicated to the {dataframe}. \ No newline at end of file From 00e6e921b77dd0158c284220da57eb7af5f8667d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20Zolt=C3=A1n=20Szab=C3=B3?= Date: Fri, 31 May 2019 17:59:34 +0200 Subject: [PATCH 11/15] Quick fix. --- docs/en/stack/ml/dataframes.asciidoc | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/docs/en/stack/ml/dataframes.asciidoc b/docs/en/stack/ml/dataframes.asciidoc index 567ec5dc4..cecbd5b4f 100644 --- a/docs/en/stack/ml/dataframes.asciidoc +++ b/docs/en/stack/ml/dataframes.asciidoc @@ -21,14 +21,14 @@ results in a summary of your dataset (which is the {dataframe} itself). Defining a pivot consist of two main parts. First, you select one or more fields that your dataset will be grouped by. Principally you can select categorical fields (terms) for grouping. You can also select numerical fields, in this case, -the field values will be bucketed using an interval you specify. The analysis +the field values will be bucketed using an interval you specify. The calculation will run against every bucket that was created this way. -The second step is selecting one or more aggregations to perform analysis over +The second step is selecting one or more aggregations to perform calculation over the dataset. When using aggregations, you practically ask questions about the -dataset to analyze the data. There are different types of aggregations, each with -its own purpose and output. You can learn more about the supported aggregations -and group-by fields here (!add a link!). +dataset. There are different types of aggregations, each with its own purpose and +output. You can learn more about the supported aggregations and group-by fields +here (!add a link!). As an optional step, it's also possible to add a query to further limit the scope of the aggregation. @@ -39,6 +39,7 @@ on the altered data. Using {dataframes} does not require {dfeeds}. {con-dataframes-cap} will be introduced in a later version. .Example + Put the case that you run a webshop that sells clothes. Every order creates a document that contains a unique order ID, the name and the category of the ordered product, its price, the ordered quantity, the exact date of the order, From a09d80f04b8c002959ee03ef8eb6e5cc1ccc16f0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20Zolt=C3=A1n=20Szab=C3=B3?= Date: Tue, 11 Jun 2019 10:34:50 +0200 Subject: [PATCH 12/15] Amended the text based on the technical and peer reviews. --- docs/en/stack/ml/dataframes.asciidoc | 46 +++++++++++++--------------- 1 file changed, 21 insertions(+), 25 deletions(-) diff --git a/docs/en/stack/ml/dataframes.asciidoc b/docs/en/stack/ml/dataframes.asciidoc index cecbd5b4f..ab2d0eec7 100644 --- a/docs/en/stack/ml/dataframes.asciidoc +++ b/docs/en/stack/ml/dataframes.asciidoc @@ -1,50 +1,44 @@ [[ml-dataframes]] === {dataframes-cap} -{dataframes-cap} feature is available in 7.2 and later. +A _{dataframe}_ is a transformation of a dataset by certain rules. You can think +of it like a spreadsheet or a data table that makes your data ready to be analyzed +and organized. -A _{dataframe}_ is a transformation of a dataset by certain rules defined during -the creation of the {dataframe}. You can think of it like a spreadsheet or a -data table that makes your data ready to be analyzed and organized. +A lot of {es} datasets are organized as a stream of events: each event is a individual +document, e.g. a single item purchase. {dataframe-cap} pivots allow you to summarize +this data, bringing it into an organized, more analysis friendly format, e.g. +summarizing all purchases of a single customer (see the example below). -{es} datasets consist of individual documents that have fields and -values in each field. This architecture makes search easy but on the other hand, -makes it hard to run analyses that require reorganized or summarized fields of -the dataset. {ml-cap} analyses need clean and transformed data and that is the -point where {dataframes} come into play. - -To transform the data into a {dataframe}, you need to define a _pivot_. During -pivoting, you create a set of features that transform the dataset into a -different, more digestible format to make calculations on your data. Pivoting +The {dataframe} feature enables you to define a _pivot_ which is a set of features +that transform the dataset into a different, more digestible format. Pivoting results in a summary of your dataset (which is the {dataframe} itself). Defining a pivot consist of two main parts. First, you select one or more fields that your dataset will be grouped by. Principally you can select categorical fields (terms) for grouping. You can also select numerical fields, in this case, -the field values will be bucketed using an interval you specify. The calculation -will run against every bucket that was created this way. +the field values will be bucketed using an interval you specify. -The second step is selecting one or more aggregations to perform calculation over -the dataset. When using aggregations, you practically ask questions about the -dataset. There are different types of aggregations, each with its own purpose and -output. You can learn more about the supported aggregations and group-by fields -here (!add a link!). +The second step is deciding how you want to aggregate the grouped data. When +using aggregations, you practically ask questions about the dataset. There are +different types of aggregations, each with its own purpose and output. You can +learn more about the supported aggregations and group-by fields +{ref}/data-frame-transform-pivot.html[here]. As an optional step, it's also possible to add a query to further limit the scope of the aggregation. IMPORTANT: In 7.2, you can build {dataframes} on the top of a static dataset. When new data comes into the index, you have to perform the transformation again -on the altered data. Using {dataframes} does not require {dfeeds}. -{con-dataframes-cap} will be introduced in a later version. +on the altered data. .Example -Put the case that you run a webshop that sells clothes. Every order creates a +Imagine that you run a webshop that sells clothes. Every order creates a document that contains a unique order ID, the name and the category of the ordered product, its price, the ordered quantity, the exact date of the order, and some customer information (name, gender, location, etc). Your dataset -contains the documents of all the transactions from last year. +contains all the transactions from last year. If you want to check the sales in the different categories in your last fiscal year, define a {dataframe} that is grouped by the product categories (women's shoes, men's @@ -54,4 +48,6 @@ pivot that shows the number of sold items in every product category in the last year. IMPORTANT: Creating a {dataframe} leaves your source index intact. A new index will -be created dedicated to the {dataframe}. \ No newline at end of file +be created dedicated to the {dataframe}. + +TIP: Using {dataframes} does not require {dfeeds}. \ No newline at end of file From 09246fe46ad7ce493af00ebdb4efe47b4fcb5fbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20Zolt=C3=A1n=20Szab=C3=B3?= Date: Tue, 11 Jun 2019 10:45:52 +0200 Subject: [PATCH 13/15] Added beta tag to the page. --- docs/en/stack/ml/dataframes.asciidoc | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/en/stack/ml/dataframes.asciidoc b/docs/en/stack/ml/dataframes.asciidoc index ab2d0eec7..a92c3b65f 100644 --- a/docs/en/stack/ml/dataframes.asciidoc +++ b/docs/en/stack/ml/dataframes.asciidoc @@ -1,6 +1,8 @@ [[ml-dataframes]] === {dataframes-cap} +beta[] + A _{dataframe}_ is a transformation of a dataset by certain rules. You can think of it like a spreadsheet or a data table that makes your data ready to be analyzed and organized. From 648cb7d0ffb9803f0f7fd2d885d7cb0704393253 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20Zolt=C3=A1n=20Szab=C3=B3?= Date: Wed, 12 Jun 2019 09:42:37 +0200 Subject: [PATCH 14/15] Improve readability. --- docs/en/stack/ml/dataframes.asciidoc | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/docs/en/stack/ml/dataframes.asciidoc b/docs/en/stack/ml/dataframes.asciidoc index a92c3b65f..c5df9f67d 100644 --- a/docs/en/stack/ml/dataframes.asciidoc +++ b/docs/en/stack/ml/dataframes.asciidoc @@ -8,9 +8,10 @@ of it like a spreadsheet or a data table that makes your data ready to be analyz and organized. A lot of {es} datasets are organized as a stream of events: each event is a individual -document, e.g. a single item purchase. {dataframe-cap} pivots allow you to summarize -this data, bringing it into an organized, more analysis friendly format, e.g. -summarizing all purchases of a single customer (see the example below). +document, for example a single item purchase. {dataframe-transforms-cap} enable +you to summarize this data, bringing it into an organized, more analysis friendly +format. For example, you can summarize all the purchases of a single customer (see +the example below). The {dataframe} feature enables you to define a _pivot_ which is a set of features that transform the dataset into a different, more digestible format. Pivoting @@ -23,9 +24,9 @@ the field values will be bucketed using an interval you specify. The second step is deciding how you want to aggregate the grouped data. When using aggregations, you practically ask questions about the dataset. There are -different types of aggregations, each with its own purpose and output. You can -learn more about the supported aggregations and group-by fields -{ref}/data-frame-transform-pivot.html[here]. +different types of aggregations, each with its own purpose and output. To learn +more about the supported aggregations and group-by fields, see +{ref}/data-frame-transform-pivot.html[Pivot resources]. As an optional step, it's also possible to add a query to further limit the scope of the aggregation. @@ -44,10 +45,9 @@ contains all the transactions from last year. If you want to check the sales in the different categories in your last fiscal year, define a {dataframe} that is grouped by the product categories (women's shoes, men's -clothing, etc.) and the order date histogram with the interval of the last year, -then set a sum aggregation on the ordered quantity. The result is a {dataframe} -pivot that shows the number of sold items in every product category in the last -year. +clothing, etc.) and the order date with the interval of the last year, then set +a sum aggregation on the ordered quantity. The result is a {dataframe} pivot that +shows the number of sold items in every product category in the last year. IMPORTANT: Creating a {dataframe} leaves your source index intact. A new index will be created dedicated to the {dataframe}. From 0ed95f8d7d8c9e7ad9fd0651ca0f608fbba627e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Istv=C3=A1n=20Zolt=C3=A1n=20Szab=C3=B3?= Date: Wed, 12 Jun 2019 10:16:28 +0200 Subject: [PATCH 15/15] Adds screenshot to the example. --- docs/en/stack/ml/dataframes.asciidoc | 3 +++ docs/en/stack/ml/images/ml-dataframepivot.jpg | Bin 0 -> 93753 bytes 2 files changed, 3 insertions(+) create mode 100644 docs/en/stack/ml/images/ml-dataframepivot.jpg diff --git a/docs/en/stack/ml/dataframes.asciidoc b/docs/en/stack/ml/dataframes.asciidoc index c5df9f67d..837f014fe 100644 --- a/docs/en/stack/ml/dataframes.asciidoc +++ b/docs/en/stack/ml/dataframes.asciidoc @@ -49,6 +49,9 @@ clothing, etc.) and the order date with the interval of the last year, then set a sum aggregation on the ordered quantity. The result is a {dataframe} pivot that shows the number of sold items in every product category in the last year. +[role="screenshot"] +image::ml/images/ml-dataframepivot.jpg["Example of a data frame pivot in {kib}"] + IMPORTANT: Creating a {dataframe} leaves your source index intact. A new index will be created dedicated to the {dataframe}. diff --git a/docs/en/stack/ml/images/ml-dataframepivot.jpg b/docs/en/stack/ml/images/ml-dataframepivot.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c0c7946cf4441936837823697af8ae4ccfa876e7 GIT binary patch literal 93753 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 literal 0 HcmV?d00001